无法使缓冲区溢出工作

时间:2016-01-14 20:35:40

标签: buffer-overflow c ubuntu gcc

我正在尝试了解缓冲区溢出攻击,并希望看到相同的工作演示。我一直在关注许多在线资源以了解相同的情况。例如,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()不会被执行。

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

1 个答案:

答案 0 :(得分:4)

您的“CanNeverExecute”功能正在执行,但您没有看到它的输出。将其更改为:

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

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