You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:33:43