文章总结: 该文档详细解析了GitHub项目bikini/exploitarium中的objdump-dlx-calc-poc,该PoC利用GNUBinutils中objdump处理DLXELF文件时的调试节越界写入漏洞,通过精心构造的重定位链覆盖libcFILE结构实现本地任意命令执行。关键发现包括利用32位大端序重定位加法绕过ASLR、多payload尝试策略提高成功率,并提供了完整的复现步骤和环境配置指南。建议用户避免用objdump处理不可信文件、更新Binutils版本并在沙箱环境中运行解析工具。 综合评分: 85 文章分类: 漏洞分析,二进制安全,恶意软件,CTF,安全工具
【深度技术解析】objdump DLX 后端 Out-of-Bounds 写入导致的本地 ACE PoC 详解
Ots安全
2026年6月29日 09:10 广东
在小说阅读器读本章
去阅读
威胁简报
恶意软件
漏洞攻击
今天我们来详细拆解 GitHub 上一个非常有意思的 PoC 项目:bikini/exploitarium 中的 objdump-dlx-calc-poc。
这个 PoC 利用的是 GNU Binutils 中 objdump -g 处理 DLX ELF 对象文件时的堆/调试节越界写入漏洞,最终在特定环境下实现从崩溃到执行任意命令(这里是打开计算器)的效果。
重要声明:这是一个本地解析器漏洞(ACE – Arbitrary Code Execution via crafted local file),不是网络远程漏洞。
需要受害者主动运行 objdump -g(或类似带调试信息的选项)处理恶意文件。
PoC 保留了 ASLR,采用相对偏移 + 多 payload 尝试策略,并非单发全 bypass。
一、背景知识
objdump 和 DLX 架构objdump 是 GNU Binutils 套件中的核心工具,用于显示对象文件(ELF、PE 等)的各种信息。-g 选项会尝试解析调试信息(DWARF 等)。
DLX 是一种教学用的 32 位 RISC 架构(类似 MIPS 的简化版),在 Binutils 中有对应的 elf32-dlx 后端支持。虽然现实中很少用到,但正是这个冷门后端存在实现上的不完善,导致了本次漏洞。
漏洞核心在于 DLX 后端处理重定位(Relocation) 时,对调试节(.debug_*)的边界检查不足,允许越界写入。
二、漏洞原理简述
- (高层次)构造一个特制的 DLX ELF 对象文件(表面上看似合法的 ELF)。
- 当 objdump -g 解析它时,DLX 后端在处理重定位条目时,会向超出预期调试节边界的内存区域写入数据。
- PoC 精心设计这些写入操作,覆盖关键的 libc FILE 结构(如 _IO_2_1_stderr_ 相关的 vtable 或函数指针字段)。
- 通过精心选择的 32 位 big-endian 重定位加法,将 _IO_2_1_stderr_ 指针的低 32 位“转换”为 system 函数的低 32 位。
- 后续触发 I/O 操作或清理逻辑时,控制流跳转到 system(“P”),而 P 是当前目录下的 helper 脚本,从而执行命令。
为什么需要多个 payload?
因为 ASLR(地址空间布局随机化)开启后,libc 和堆的基址是随机的。PoC 使用相对 delta(稳定偏移)+ 多组猜测的 system_delta,覆盖常见 libc 低 32 位布局。命中率取决于目标环境的 heap/libio profile。
三、项目文件结构
详解进入仓库目录 objdump-dlx-calc-poc:
- payloads/:预先生成的多个 .bin 文件(实际是 ELF 格式,只是扩展名用 bin)。每个对应不同 delta 组合,还有 .notes 说明。
- P:核心 helper 脚本(可执行)。它会写入 calc_hit.log 日志,并在 WSL 下调用 Windows 计算器(calc.exe)。
- run_dlx_calc_poc.sh:自动化尝试脚本,循环尝试所有 payload,直到命中。
- generate_objdump_dlx_calc_poc.py:payload 生成器,使用 dlx_chain_builder.py 构建重定位链。
- docs/aslr-bypass-analysis.md:详细的 ASLR 绕过分析,解释为什么无法做到通用单文件 bypass。
- tools/:Z3 求解器验证脚本、delta 覆盖率计算等。
四、环境准备与复现步骤
推荐环境:WSL(Ubuntu 24.04) + 已编译的 Binutils(支持 dlx-elf)。克隆仓库:
git clone https://github.com/bikini/exploitarium.git
cd exploitarium/objdump-dlx-calc-poc
chmod +x P
export PATH="$PWD:$PATH" # 关键!让系统能找到 ./P
# 指定你的 objdump 路径,例如系统自带或自定义编译的
MAX_TRIES=50 bash run_dlx_calc_poc.sh /usr/bin/objdump
# 或者自定义构建
# MAX_TRIES=50 bash run_dlx_calc_poc.sh /opt/binutils-master/binutils/objdump
cat calc_hit.log
如果看到 CALC_HELPER_RAN … 并且计算器弹出,即为成功。
手动单步尝试(便于理解):
rm -f calc_hit.log
for p in payloads/*.bin; do
echo "Trying $p"
/path/to/objdump -g "$p" >/dev/null 2>&1 || true
if [ -s calc_hit.log ]; then
echo "HIT! $p"
cat calc_hit.log
break
fi
done
常见现象:即使出现 “Segmentation fault”,也不代表失败——只要 helper 没触发,就继续尝试。成功信号是日志文件更新或计算器弹出。
五、重新生成 Payload
如果想自定义或更新:
rm -rf payloads
python3 generate_objdump_dlx_calc_poc.py --out-dir payloads
脚本会根据不同 profile(wsl2404、gnu2461 等)生成对应 payload。
六、ASLR Bypass 技术细节(进阶)
- 核心转换:利用 DLX 支持的 32-bit big-endian relocation add,对 FILE 结构中 _IO_2_1_stderr_ 指针低 32 位进行算术操作,使其指向 system。
- 覆盖点:涉及 heap buffer、section 对象偏移(如 0xbb0 / 0xbb8)、rbase 等。
- 为什么不是通用 bypass?
- libc 基址低 32 位随机,需要覆盖多种 delta。
- 重定位加法的 carry 传播方向(big-endian)限制了依赖关系,无法对所有 page-aligned base 都成立。
- Z3 验证脚本确认了固定转换序列的局限性。
项目作者也提到,4D4J 的另一个 repo 提供了更完整的 ASLR bypass PoC,值得参考。
七、安全意义与修复建议
影响:任何使用 objdump 解析不可信 ELF 文件的场景(CI/CD、逆向工具、自动化脚本等)都可能受影响。
缓解:
- 避免用 objdump 处理不受信任的文件。
- 更新 Binutils 到最新版本(项目测试了 2.46.1,仍受影响,建议关注官方修复)。
- 在沙箱或容器中运行解析工具。
- 编译时加强 hardening(ASLR、stack protector 等已默认开启,但本 PoC 已适配)。
这个 PoC 非常适合学习 ELF 格式、重定位机制、Binutils 内部结构以及现实中的 ASLR 部分绕过技术。
参考链接:
原 PoC:https://github.com/bikini/exploitarium/tree/main/objdump-dlx-calc-poc
相关发现:https://github.com/4D4J/objdump-Out-Of-Bounds-write
如果你在复现过程中遇到问题,或者想深入讨论 DLX 重定位的具体字节构造,欢迎留言!我们下期再见~
END
公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址
排版 编辑 | Ots 小安
采集 翻译 | Ots Ai牛马
公众号 | AnQuan7 (Ots安全)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ots安全 《【深度技术解析】objdump DLX 后端 Out-of-Bounds 写入导致的本地 ACE PoC 详解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论