《黑客:剥削的艺术》exploit_notesearch.c中for循环条件逻辑疑问
关于exploit_notesearch.c中for循环及内存布局的问题解答
1. 循环中160与buffer大小的关系是什么?
这个for(i = 0; i < 160; i += 4)循环的核心作用是用指定地址(一般是shellcode的起始地址)填充buffer的前160字节区域,每次写入4字节对应32位系统的指针宽度。
- 160的取值是基于buffer起始位置到待覆盖的关键指针(比如堆块的函数指针或返回地址)的偏移量确定的:总偏移长度为160字节,除以每次写入的4字节,刚好完成40次循环,精准覆盖到目标指针前的所有内存区域,确保后续写入的目标地址能准确覆盖关键位置。
2. 160与堆上分配的200字节是否存在关联?
二者直接关联,是堆溢出利用的精心设计:
- 堆上分配的200字节是buffer的可用空间,160字节的填充区域占据了buffer的大部分空间,剩余的40字节(200-160)用来容纳shellcode(35字节)和初始命令的部分内容。
- 你计算的160+35+15=210看似超出200字节,但堆溢出的核心就是利用程序对堆边界的检查漏洞,允许少量越界写入。越界的10字节会覆盖堆块的元数据(如size字段、prev/next指针),这正是劫持程序流程的关键——通过修改堆结构里的函数指针,让程序跳转到shellcode执行。
3. 为何需要command和buffer两个指针变量,能否仅用其中一个?
不能合并,二者的职责完全不同:
buffer是专门用来生成覆盖用的重复地址块(160字节),是攻击payload的中间组件,负责填充内存到关键指针的偏移位置。command是用来拼接最终完整的攻击payload:它需要把初始命令、buffer的覆盖块、shellcode按顺序组合成目标程序能解析的格式。- 分开设计的原因是逻辑清晰,便于调试和修改。如果合并成一个指针,需要频繁调整指针位置来拼接不同部分,容易出现内存操作错误,也不利于单独调整覆盖区域或payload的其他组件。
内容的提问来源于stack exchange,提问作者Iceman
相关产品推荐
相关产品推荐

