C 你能解释一下这段代码吗?

C 你能解释一下这段代码吗?,c,buffer-overflow,C,Buffer Overflow,所以我一直在读缓冲区溢出和Aleph One关于堆栈崩溃的文章。我想我了解一切,除了他的漏洞代码中的这一点: ptr = buff; addr_ptr = (long *) ptr; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; ptr=buff; addr_ptr=(长*)ptr; 对于(i=0;i

所以我一直在读缓冲区溢出和Aleph One关于堆栈崩溃的文章。我想我了解一切,除了他的漏洞代码中的这一点:

ptr = buff;   
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
   *(addr_ptr++) = addr;
ptr=buff;
addr_ptr=(长*)ptr;
对于(i=0;i
buff和ptr是字符数组。addr持有一个堆栈指针,该指针指向堆栈开始处内存中的某个位置。bsize是buff的大小。 它在干什么?他为什么说i+=4?他将addr_ptr设置为什么,为什么?当我试图打印出来时,我得到的是空值

以下是文章的链接:


谢谢。

他每次移动4个字节来处理一个字(8位*4字节=32位字)。请注意,他在代码示例后面的段落中评论了他的猜测和测试方法


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

他不应该使用这样的幻数。告诉你应该是
i+=sizeof(*addr\u ptr)
(即
i+=sizeof(long)
)会给你一个提示吗?谢谢,这确实有帮助。所以4可以根据系统的不同而变化,他基本上是将addr_ptr移动到数组的末尾,同时确保有足够的空间容纳它?理论上,它可以完全由系统决定,在我们将使用的任何系统上,它几乎肯定是4或8,这就是他硬编码4的原因。(我认为当替代方案如此简单时,应该避免这样做,就像这里一样。)哦,好的。因此,如果它被沿着缓冲区推送,这是否意味着地址被多次复制到缓冲区中?或者它只复制一次,然后移动到缓冲区的末尾,这样地址只在buff中出现一次?基本上他是想把地址放在缓冲区的末尾吗?但是谢谢你的回答,我想现在事情对我来说已经清楚了。