Python缓冲区溢出Hex转义:含字母地址覆写EIP异常问题
缓冲区溢出EIP覆写异常排查方案
测试所用攻击脚本
import socket buffer = "A" * 2003 + '\xAF\x11\x50\x62' try: s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect=s.connect(('ip', port)) s.recv(1024) s.send('TRUN /.:/' + buffer) s.close() except: print "Connection failed"
异常现象
- 按小端序规则写入
\xAF\x11\x50\x62时,预期将EIP覆写为0x625011AF,实际EIP值为0x00BFFF6F,结果完全偏离预期 - 将地址段中的
\xAF替换为\x09、写入\x09\x11\x50\x62时,EIP可正常覆写为0x62501109,说明2003字节的填充偏移计算准确,不存在偏移错误
核心原因
该问题是典型的坏字符(Bad Character)过滤/转义问题:\xAF字节没有被原样送入目标程序的栈缓冲区对应位置,在传输或解析环节被修改、截断,导致EIP覆写位置的字节错位或被替换。
排查与解决步骤
- 验证偏移正确性
替换\xAF为其他非特殊字节时EIP覆写正常,已经证明偏移计算无误,无需重新生成字符集定位EIP偏移,问题完全出在\xAF字节本身。 - 完成全量坏字符检测
这是缓冲区溢出测试的标准必要流程:在EIP偏移位置后追加\x00到\xFF的全量单字节序列,发送payload后附加调试器查看目标程序栈中实际接收到的字节,和发送的原始序列逐字节对比,所有出现截断、替换、错位的字节都属于当前环境下的坏字符。
除了常见的\x00(字符串截断符)、\x0A(换行符)、\x0D(回车符)外,目标服务的协议解析逻辑、中间网络设备的拦截规则、编程语言的隐式编码转换都可能引入特殊坏字符,\xAF就是当前测试环境下的坏字符。 - 定位过滤环节
坏字符的产生通常来自三个环节,可逐一排查:- 目标服务自身的输入校验逻辑:部分服务会对输入字节做范围限制、转义处理,直接修改收到的特殊字节
- 传输链路拦截:如果测试路径上存在WAF、流量代理、端口转发工具,可能对包含特殊字节的流量做篡改或拦截
- 本地payload编码问题:Python2环境下如果混用unicode字符串和普通字节串,大于0x7F的高位字节可能被默认编码转换,建议构造payload时显式使用字节串类型,避免隐式编码修改字节内容
- 绕过坏字符限制
确认\xAF为坏字符后,无需强行使用0x625011AF这个跳转地址,重新在目标程序自身内存、已加载的系统DLL模块中搜索所有不含已发现坏字符的JMP ESP/CALL ESP等跳转指令地址,替换原有地址即可正常完成EIP覆写。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

