【发布时间】:2016-04-20 10:17:12
【问题描述】:
我正在尝试了解缓冲区溢出攻击,并希望看到相同的工作演示。我一直在关注许多在线资源以了解相同的内容。例如,到目前为止,this 已被证明非常有用。
我清楚地理解缓冲区溢出的概念,但是,我无法让演示工作。 我在 64 位 Mac 上,在 VirtualBox(我正在尝试缓冲区溢出的机器)中运行 32 位 Ubuntu。为了解决缓冲区溢出问题,我在 Ubuntu 上禁用了 ASLR。
我有一个简单的 C 程序 demo.c,取自上述视频链接:
# include<stdio.h>
CanNeverExecute()
{
printf("I can never execute");
}
GetInput()
{
char buffer[8];
gets(buffer) ; // the vulnerable function
puts(buffer);
}
main()
{
getInput();
return 0;
}
我已经尝试了以下所有变体来将程序编译为:
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -o demo demo.c
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o demo demo.c
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -m32 -o demo demo.c
这个想法是通过利用gets() 用CanNeverExecute() 的地址覆盖堆栈上的返回地址。 CanNeverExecute 的地址原来是 0x0804847b
为此,我尝试了以下方法:
printf "123456789abc\x7b\x84\x04\x08" | ./演示
echo -e "123456789abc\x7b\x84\x04\x08" | ./演示
python -c '打印 "a"*12 + "\x7b\x84\x04\x08"' | ./演示
其中12345678是填满缓冲区空间,9abc是覆盖存储在堆栈中的ebp的值,最后存储在堆栈中的返回地址被CanNeverExecute()的地址覆盖
理想情况下,我期望(如上面的演示链接中所示)是 CanNeverBeExecuted() 被执行并打印其中的消息。
但出乎意料的是,在上述所有情况下,我都会收到“分段错误(核心转储)”,并在终端上打印以下内容:
123456789abc{,,[some_unprintable_character]
CanNeverBeExecuted() 没有被执行。
我错过了什么?需要改变什么?请帮忙。
【问题讨论】:
-
main调用getInput但函数似乎命名为GetInput。您实际编译的代码是什么?
标签: buffer-overflow c ubuntu gcc