用Binary Ninja破解2000个二进制文件 - 逆向工程实战解析

本文详细介绍了如何使用Binary Ninja静态分析工具自动化分析2000个CTF挑战二进制文件,包括逆向工程技巧、自动化脚本编写方法以及如何应对不同保护机制的技术细节。

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脚本自动收集以下关键信息:

  1. 需要溢出的缓冲区大小
  2. 金丝雀字符串及其长度
  3. recvmsg函数中栈缓冲区大小
  4. writemsg函数每次写循环处理的数据量
1
2
3
import binaryninja
bv = binaryninja.BinaryViewType["ELF"].open(chal)
bv.update_analysis()

逆向工程关键步骤

  1. 定位main函数:从入口点开始,通过跟踪调用链找到main函数
  2. 识别关键调用:收集所有call指令,确定memcpy、recvmsg和memcmp调用
  3. 提取金丝雀值:使用get_parameter_at()函数查询memcmp调用参数
  4. 计算缓冲区大小:通过栈帧偏移计算可溢出缓冲区大小
1
2
3
4
5
# 获取金丝雀参数
canary_frame = main.get_parameter_at(bv.arch, memcmp.address, None, 0)
canary_address = main.get_parameter_at(bv.arch, memcmp.address, None, 1)
canary_width = main.get_parameter_at(bv.arch, memcmp.address, None, 2)
canary = bv.read(canary_address.value, canary_width.value)

构造崩溃字符串

1
2
3
4
5
6
7
8
# 填充缓冲区
crash_string = "a" * buffer_size
# 添加金丝雀前4字节(总是4字节)
crash_string += canary[:4]
# 填充剩余金丝雀缓冲区
crash_string += "a" * ((canary_frame.offset * -1) - 4)
# 覆盖保存的寄存器
crash_string += 'eeee'

后续挑战: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表现出色,但仍需改进:

  1. 添加SSA(静态单赋值)形式
  2. 实现灵活的类型系统
  3. 增强数据流分析能力

结论

从流畅的图形视图到中间语言,再到与Python的智能集成,Binary Ninja为静态二进制分析提供了出色的接口。它让我能够轻松快速地从2000个二进制文件中提取数据,展示了将机械效率与人类直觉相结合的可能性。

我的(略微更新的)脚本可在这里获取。Binary Ninja现已公开发售两个版本:商业版(399美元)和个人版(99美元)。本文介绍的脚本使用了仅商业版提供的"无GUI处理"功能。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计