gpt4 book ai didi

c - 缓冲区溢出问题 : array is shorter than it should be?

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:54 26 4
gpt4 key购买 nike

我现在正在系统编程课上做一个处理缓冲区溢出的练习。由于我无法正确格式化问题陈述,因此我将对其进行解释。我们有一个大小为 512 个字符的缓冲区。调用名为 getbufn 的函数分配此缓冲区,然后调用 Gets() 函数来接收输入。输入以十六进制值的形式出现在由空格分隔的文本文档中,该文本文档通过另一个提供的程序运行以生成输入。一旦输入通过 gets 输入到缓冲区,getbufn 设置 eax = 1 并返回到一个测试函数,该函数检查堆栈是否已损坏。

现在我已经让这个工作了。在最后一个问题中,缓冲区大小为 32,并且设置了堆栈。现在堆栈可以移动了。调用 getbufn 的代码首先在堆栈上分配随机数量的存储空间,这样如果您在两次连续执行 getbufn 期间对 %ebp 的值进行采样,您会发现它们的差异高达 ±240。所以我们需要使用 NOP sled 来使我们的代码工作。

首先,这里是 getbufn 函数:

80491e8:       55                      push   %ebp
80491e9: 89 e5 mov %esp,%ebp
80491eb: 81 ec 18 02 00 00 sub $0x218,%esp
80491f1: 8d 85 f8 fd ff ff lea -0x208(%ebp),%eax
80491f7: 89 04 24 mov %eax,(%esp)
80491fa: e8 db fa ff ff call 8048cda <Gets>
80491ff: b8 01 00 00 00 mov $0x1,%eax
8049204: c9 leave
8049205: c3 ret
8049206: 90 nop
8049207: 90 nop

我发现了一些事情。当在地址 0x8049205 调用 ret 时,esp = 0x556832F4。所以我知道返回地址在那里。在 lea 之后的 mov 指令中,ebp 总是等于 0x556832F0(所以我不知道我的教授所说的移动 240 是什么意思),而 eax 总是等于 0x556830e8。这对我来说意味着我的数组从 0x556830e8 开始到 0x556832E8 结束。然后为了获得返回地址,我还需要写入 12 个字节才能到达 0x556832F4。那么最后的 4 个字节应该是 NOP sled 中间的地址。

所以现在我拥有的是大约 500 NOP OPS,然后是缓冲区末尾的代码——这使得总大小为 512 来填充数组。然后我有 12 个字节的十六进制,它们与缓冲区溢出前这些地址的原始堆栈中的内容相匹配。然后,当在 getbufn 结束时执行返回指令时,我还有 4 个字节指向 NOP sled 中间的地址。由于某种原因,这不起作用。如果我在我的数组和返回地址之间放置 5 个字节的垃圾,我就会知道堆栈已损坏。如果我在我的数组和返回值之间放置 6 个字节的垃圾,我会得到一个段错误。在我的计算中,我认为我需要 12 个字节才能从我的数组到达返回地址,那么我在这里做错了什么?

最佳答案

这听起来很像 Bryant 和 O'Hallaron 的 CS:APP 缓冲区溢出实验室,也听起来像是最后一关。

让我给你一些建议:

  1. 堆栈仍然是可执行的。
  2. 你知道缓冲区大约有 512 字节,(为了对齐可能更多,当我做这个分配时它是 540 字节)
  3. 您知道 $ebp 的差异不会超过 +/- 240 字节。
  4. 您知道将调用一个函数来验证堆栈

了解所有这些后,您可以执行以下操作:

  1. 将 shell 代码放入 512 字节的缓冲区。
  2. 一些 NOPS 允许您跳转到缓冲区中的某个随机点(这很重要,因为 +/- 240 ASLR)
  3. 在该缓冲区中,您可以有一些 shell 代码读取 $esp 并向 $esp 添加 512 字节(或缓冲区的实际大小) > 这将为您提供您覆盖的已保存 $ebp 的值。然后,您可以进行一些计算,并将垃圾 ebp 替换为您刚刚计算出的正确值。
  4. 回到你需要去的地方。

进一步解释一些事情。为什么我们需要缓冲区中的 NOP (\x90)?由于基地址按 +/- 240 字节随机化,缓冲区大小为 512 字节,因此您可以进行计算并确定性地始终返回缓冲区中的某个位置。当您返回到缓冲区中的某处时,它将命中 NOPS (\x90) 并滑入您的 shell 代码。

如果您有任何其他问题,请随时提出。

关于c - 缓冲区溢出问题 : array is shorter than it should be?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com