Binary Ninja实战:2000个二进制文件的自动化破解之旅
在2016年DEFCON CTF资格赛中,我使用Vector35开发的Binary Ninja(一个极具潜力的交互式静态分析和逆向工程平台)编写脚本,为2000个独特二进制文件生成了"漏洞利用"。如果你想在后DARPA时代的DEFCON CTF中保持竞争力,我强烈推荐你了解Binary Ninja。
工具对比:Binary Ninja vs IDA
与我使用IDA的经验(简直是用胶带和祈祷勉强维持)相比,Binary Ninja的工作流程令人愉悦。它基于自己的中间语言(IL)进行分析,并通过Python和C++ API暴露功能。查询代码块、函数、跟踪执行流、查询寄存器状态等操作都变得非常简单,而这些在IDA中简直是艰巨任务。
挑战1:334个二进制文件
第一个挑战是"334 cuts",提供334个DECREE格式的挑战二进制文件,所有文件名都与食物相关。这些二进制文件被剥离了符号表,具有静态栈缓冲区、金丝雀值和基于栈的缓冲区溢出漏洞。金丝雀值被复制到栈上并与硬编码值进行比对。如果金丝雀值被覆盖,挑战将终止而不会崩溃。
通过Binary Ninja的无界面分析引擎,我们编写Python脚本自动收集以下关键信息:
- 需要溢出的缓冲区大小
- 金丝雀字符串及其长度
- recvmsg函数中栈缓冲区大小
- writemsg函数每次写循环处理的数据量
|
|
逆向工程关键步骤
- 定位main函数:从入口点开始,通过跟踪调用链找到main函数
- 识别关键调用:收集所有call指令,确定memcpy、recvmsg和memcmp调用
- 提取金丝雀值:使用get_parameter_at()函数查询memcmp调用参数
- 计算缓冲区大小:通过栈帧偏移计算可溢出缓冲区大小
|
|
构造崩溃字符串
|
|
后续挑战:666和1000个二进制文件
同样的方法成功应用于"666 cuts"和"1000 cuts"挑战,证明了该解决方案的通用性。最终获得的标志分别是:
- 334 cuts: baby’s first crs cirvyudta
- 666 cuts: you think this is the real quaid DeifCokIj
- 1000 cuts: do you want a thousand bandages gruanfir3
Binary Ninja的改进空间
虽然Binary Ninja表现出色,但仍需改进:
- 添加SSA(静态单赋值)形式
- 实现灵活的类型系统
- 增强数据流分析能力
结论
从流畅的图形视图到中间语言,再到与Python的智能集成,Binary Ninja为静态二进制分析提供了出色的接口。它让我能够轻松快速地从2000个二进制文件中提取数据,展示了将机械效率与人类直觉相结合的可能性。
我的(略微更新的)脚本可在这里获取。Binary Ninja现已公开发售两个版本:商业版(399美元)和个人版(99美元)。本文介绍的脚本使用了仅商业版提供的"无GUI处理"功能。