【问题标题】:Smashing the Stack粉碎堆栈
【发布时间】:2013-10-01 00:57:50
【问题描述】:

所以我正在为一个安全类分配任务,任务是使用堆栈溢出来调用程序从未使用过的函数 oopsDidISmashTheStack。

#include <stdio.h>
#include <stdlib.h>

int oopsDidISmashTheStack(void)
{
    printf("Yup, smashing the stack is fun!\n");
    exit(0);
}

int getUserInput (void)
{
    char buf[12];
    gets(buf);
    return(1);
}

int main(void)
{
    getUserInput ();
    printf("Overflow failed, normal return\n");
    return(1);
}

我理解在 buf 变量是 sfp 之后的概念,然后我无法弄清楚的返回地址是将返回值更改为函数所在的地址 0x080484fc 的输入。我认为填充缓冲区需要 12 个字符,然后我的印象是 sfp 并返回 4 个字节,所以我尝试用另外 4 个随机字符填充 sfp,然后使用 \xfc\x84\x04\x08 来制作返回地址指向函数。

如果有人熟悉堆栈内存的工作原理并能解释我哪里出错了,那就太好了?

【问题讨论】:

  • 你能添加你为getUserInput得到的反汇编吗?
  • 函数_Z12getUserInputv的汇编代码转储:0x080484b4 <_z12getuserinputv>:push %ebp 0x080484b5 <_z12getuserinputv>: mov %esp,%ebp 0x080484b7 <_z12getuserinputv>: sub $0x8 %esp 0x080484ba <_z12getuserinputv>: lea 0xfffffff4(%ebp),%eax 0x080484bd <_z12getuserinputv>: mov %eax,(%esp) 0x080484c0 <_z12getuserinputv>: 调用 0x804823908048UserInputv4c5<_zxinputv> +17>: mov $0x1,%eax 0x080484ca <_z12getuserinputv>: leave 0x080484cb <_z12getuserinputv>: ret End of assembler dump.
  • 嗯,看起来不错。您是否使用gdb 或类似的调试器逐步检查了发生的情况是否符合您的预期?
  • 我已经尝试过了,并查看了信息框,我认为是的,但我对它的输出也不是很熟悉,所以我可能完全错了。

标签: c++ buffer-overflow stack-smash


【解决方案1】:

您几乎走在正确的轨道上。我建议您查看堆栈,看看返回地址是否在您认为的位置。里面可能还有别的东西。还要仔细检查字节序,

我假设这是你的输入字符串?

“012345678901xxxx\xfc\x84\x04\x08”

你的程序的输出是什么,通常如果你很接近但没有完全正确,程序会崩溃:)

【讨论】:

  • 我只是遇到了段错误。
  • 从您的程序集看来,保留了 24 个字 (0x18)。也许系统正在使用 Unicode,双字节字符串。在这种情况下,输入字符串被解包,因此返回地址没有正确创建。
  • 或者它没有被解包,你需要 24 个字节而不是 12 个字节才能到达缓冲区的末尾... "012345678901234567890123xxxx\xfc\x84\x04\x08"
猜你喜欢
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多