无法使缓冲区溢出工作

Unable to get buffer overflow working

我正在尝试了解缓冲区溢出攻击,并希望看到相同的工作演示。我一直在关注许多在线资源以了解相同的内容。例如,到目前为止,this 已被证明非常有用。

我很清楚缓冲区溢出的概念,但是,我无法让演示正常运行。 我在 VirtualBox(我正在试验缓冲区溢出的机器)中使用 64 位 Mac、运行 32 位 Ubuntu。为了解决缓冲区溢出问题,我在 Ubuntu 上禁用了 ASLR。

我有一个简单的 C 程序,demo.c,取自上面提到的视频 link:

# 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()的地址覆盖堆栈上的return地址。 CanNeverExecute的地址原来是0x0804847b

为此,我尝试了以下方法:

printf "123456789abc\x7b\x84\x04\x08" | ./demo

echo -e "123456789abc\x7b\x84\x04\x08" | ./demo

python -c 'print "a"*12 + "\x7b\x84\x04\x08"' | ./demo

其中12345678是填充缓冲区space,9abc是覆盖栈上存储的ebp的值,最后将栈上存储的return地址覆盖为CanNeverExecute()

理想情况下,我所期望的(也如上面的演示 link 所示)是执行 CanNeverBeExecuted() 并打印其中的消息。

但与预期相反,在上述所有情况下,我都在终端上打印了以下内容的“分段错误(核心转储)”:

123456789abc{,,[some_unprintable_character]

CanNeverBeExecuted() 没有被执行。

我错过了什么?需要改变什么?请帮忙。

您的 "CanNeverExecute" 函数正在执行,但您没有看到它的输出。将其更改为:

CanNeverExecute()
{
   printf("I can never execute\n");
   fflush(stdout);
}

问题是程序在刷新输出缓冲区之前崩溃了。