【问题标题】:Could you explain this bit of code?你能解释一下这段代码吗?
【发布时间】:2012-10-03 23:51:35
【问题描述】:

所以我一直在阅读有关缓冲区溢出和 Aleph One 关于堆栈粉碎的文章。我想我什么都懂,除了他的漏洞利用代码中的这一点:

ptr = buff;   
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
   *(addr_ptr++) = addr;

buff 和 ptr 是字符数组。 addr 持有一个堆栈指针,该指针指向堆栈开始处内存中的一个位置。 bsize 是 buff 的大小。 它在做什么?为什么他说 i+=4?他设置 addr_ptr 等于什么,为什么?当我尝试将其打印出来时,我只会得到 NULL。

这里是文章的链接:http://insecure.org/stf/smashstack.html

谢谢。

【问题讨论】:

  • 他不应该使用这样的幻数。告诉你应该是i += sizeof(*addr_ptr)(即i += sizeof(long))会给你提示吗?
  • 谢谢,这确实有帮助。所以 4 可能会因系统而异,他基本上是将 addr_ptr 移动到数组的末尾,同时确保有足够的空间放置它?
  • 理论上它可以通过系统,在我们将使用的任何系统上几乎可以肯定是 4 或 8,这就是他硬编码 4 的原因。(我认为当替代方案是时应该避免这样做如此简单,就像在这里一样。)

标签: c buffer-overflow


【解决方案1】:

他每次移动 4 个字节以前进一个字(8 位 * 4 字节 = 32 位字)。请注意,他在您的代码示例后面的段落中提到了他的猜测和测试方法。

他在黑暗中射击,试图溢出缓冲区。 addr_ptr 被设置为 ptr 的地址,然后在 for 循环中被沿着缓冲区推送。

【讨论】:

  • 哦,好的。那么如果它被沿着缓冲区推送,这是否意味着地址被多次复制到缓冲区中?还是只复制一次,然后移动到缓冲区的末尾,这样地址就只在缓冲区中一次?基本上他是想把地址放在缓冲区的末尾吗?不过谢谢你的回答,我想我现在已经清楚了。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2015-05-12
  • 2021-04-22
  • 1970-01-01
相关资源
最近更新 更多