Triton 的安装与使用
二进制分析框架 Triton 主要用于分析和检查二进制文件,包括可执行文件、动态链接库等
它的主要功能包括:
- 反汇编和分析:
- Triton 可以反汇编二进制文件,生成汇编代码,供安全研究人员分析
- 它支持多种指令集架构,如 x86、ARM 等
- 自动化分析:
- Triton 提供了丰富的 API,支持开发者编写自动化的二进制分析脚本
- 这些脚本可用于检测二进制文件中的漏洞、恶意代码等安全隐患
- 插件扩展:
- Triton 支持通过插件的方式扩展其功能,满足不同安全研究人员的特定需求
- 开发者可以编写自定义的分析插件,集成到 Triton 中使用
- 交互式分析:
- Triton 提供了交互式的命令行界面,安全研究人员可以在此进行手工分析、调试等操作
- 它支持设置断点、单步执行等调试功能
- 跨平台支持:
- Triton 可以运行在 Windows、Linux、macOS 等多种操作系统上,为安全研究提供跨平台的分析能力
在 Triton 中执行的执行是由我们控制的,污点分析和符号执行都是基于模拟执行实现的
Triton 需要的依赖如下:
1 | * libcapstone >= 4.0.x https://github.com/capstone-engine/capstone |
- 如果编译生成的 /usr/lib/python3.8/site-packages/triton.so 出现段错误,则大概率是 libcapstone 的版本问题
使用 vcpkg 下载 Triton 以及依赖:
1 | git clone https://github.com/Microsoft/vcpkg.git |
- Vcpkg(Visual C++ Package Manager)是一个由微软开发的命令行包管理器,用于C++语言
- 它旨在简化在各种平台上获取和安装C++库的过程,特别是 Windows
- Vcpkg 支持多种编译器和构建系统,并且可以与 Visual Studio 集成
1 | ./vcpkg list # 列出已安装的库 |
在安装 Triton 此之前需要先安装 z3(在 vcpkg 中可以找到):
1 | python scripts/mk_make.py --prefix=/home/yhellow --python --pypkgdir=/home/yhellow/.local/lib/python3.8/site-packages/ |
然后使用如下命令安装 Triton:
1 | mkdir build |
Triton 模拟执行
模拟执行(Emulation)是一种技术,它允许软件或硬件模拟另一系统的行为,以便在不同的环境中运行程序或执行任务
使用案例如下:
1 | from __future__ import print_function |
1 | 0x400000: mov rax, qword ptr [rip + 0x13b8] |
上述案例还没有展示模拟执行的精髓,下面这个案例将对一个二进制文件进行模拟执行:
1 | gcc test.c -o test -static |
- 设置静态,因为模拟执行没法识别 .got.plt(某些
stdio.h
库中的函数会被编译器优化,进而在调用时可以直接 call,并不需要借助 .got.plt) - 另外设置静态可以关闭 PIE,不需要程序进行格外的偏移计算
1 |
|
- .got.plt 中的地址在磁盘上的二进制文件中可能是占位符,但在内存中会被实际的地址所替换(实际地址从 .rela.plt 中获取)
- IDA 会自动分析这些地址,因此在 IDA 中看到的并不是磁盘上的数据
模拟执行的脚本如下:
1 | from triton import * |
最终结果如下:
1 | 0x401cd5: endbr64 |
Triton 污点分析
污点分析(Taint Analysis)是一种计算机安全分析技术,用于追踪数据在程序中的流动情况,特别是那些可能来源于不信任的输入的数据,这种技术可以帮助识别和预防安全漏洞,如跨站脚本(XSS)、SQL注入、命令注入等
污点分析的脚本如下:
1 | from triton import * |
最终结果如下:
1 | 0x401cd5: endbr64 |
- 在 GDB 中可以查看这两处地址的数据:
1 | ...... |
1 | ...... |
- 可以发现两处被污染的指令都是引用了 0x4c2290 这处数据,但这并不意味着只要有 0x4c2290 就会被污染
- 可以分析如下数据:
1 | ...... |
- 虽然也是引用了 0x4c2290,但这个 0x4c2290 的来源不同:
- 被污染指令的 0x4c2290 源自于
0x401ce6: lea rax, [rip + 0xc05a3]
- 而这里的 0x4c2290 源自于
0x401d05: lea rcx, [rip + 0xc0584]
- 被污染指令的 0x4c2290 源自于
Triton 代码插桩
为了解决 Triton 模拟执行没法识别 .got.plt 的问题,可以使用 Triton 自带的插桩模块将 .got.plt 中的函数给替换为自定义的函数
1 | gcc test.c -o test |
1 |
|
- 可以发现堆溢出,格式化字符串,double free 等多个漏洞
代码插桩的脚本如下:
1 | from triton import * |
最终结果如下:
1 | [+] Loading 0x000040 - 0x000318 |
Triton 符号执行
符号执行(Symbolic Execution)是一种程序分析技术,它使用符号值代替具体数值来探索程序的所有可能执行路径,这种方法可以帮助分析者或自动化工具理解程序的行为,发现潜在的错误或安全漏洞
符号执行的脚本如下:
1 | from triton import * |
测试脚本如下:
1 |
|
先用 IDA 分析程序起始地址 0x401DE0:
1 | .text:0000000000401DE0 48 8D 45 E0 lea rax, [rbp+var_20] |
- 可以发现只要 check 函数的返回值为 0xAD6D 就可以输出 Win,利用这一点可以添加约束
Triton 解决 CTF 问题
题目为:alexctf-2017-re2-cpp-is-awesome
核心加密逻辑如下:
1 | i = 0; |
- 其实就是简单的换位
本题目需要使用符号执行,首先在 IDA 中分析决定程序流程的代码片段:
1 | .text:0000000000400C4B 48 8D 45 A0 lea rax, [rbp+flag] |
- 从
lea rax, [rbp+flag]
加载 flag 地址,到test al, al
判断是否继续循环,程序的核心约束条件就是要使zf == 1
(指令test al, al
返回“0”,也就是cmp dl, al
返回“0”)
基于约束条件,解题脚本如下:
1 | from triton import * |
- 这种加密的加密逻辑与输入值无关,与输入的顺序也无关,因此可以单独为每一位添加约束条件
exrop 的安装与使用
安装 exrop:
1 | git clone https://github.com/d4em0n/exrop |
- 最后在 /home/yhellow 目录的 .zshenv 中写入
export PYTHONPATH=/home/yhellow/Tools/exrop:$PYTHONPATH
即可
第一次使用 exrop 可能会遇到如下报错:
1 | TypeError: Z3ToTriton::visit(): 'SymVar_0' AST node not supported yet |
经过多方查证,这个报错源自于 Z3_OP_UNINTERPRETED 变量,其在 C++ 绑定和 Python 绑定之间具有不同的值:
- Z3_OP_UNINTERPRETED has different value between C++ and Python bindings · Issue #4326 · Z3Prover/z3 (github.com)
- TypeError: Z3ToTritonAst::visit(): ‘SymVar_1’ AST node not supported yet · Issue #904 · JonathanSalwan/Triton (github.com)
这就导致了 Triton 将 Z3_OP_UNINTERPRETED 给识别为 Z3_OP_RECURSIVE,为了解决这个 BUG 我选择修改 Triton 源码:
1 | case Z3_OP_RECURSIVE: /* 添加对Z3_OP_RECURSIVE的识别 */ |
- 原本 Triton 不会对 Z3_OP_RECURSIVE 进行处理
exrop 的主要功能是自动生成 ROP 链
exrop 的使用案例如下:
1 | from pwn import * |
- 结果如下:
1 | execve('/bin/sh', 0, 0) |
在不使用缓存的情况下 rop.find_gadgets 将会执行非常久的时间(特别是处理 libc.so.6),下面方法可以提高其运行速度:
1 | def parseRopGadget(filename, opt=""): |
- 在 Exrop.py 的 parseRopGadget 函数中会使用 ROPgadget,减少不必要的查找指令可以大幅度提高运行速度
1 | cmd = ['ROPgadget', '--binary', filename, '--multibr', '--only', |
1 | done in 28.0s |
qsynthesis 的安装与使用
1 | git clone https://github.com/quarkslab/qsynthesis.git |
QSynthesis 是一个 Python3 API,用于执行基于 I/O 的程序合成的 bitvector 表达式,旨在促进代码反混淆
- 该算法是灰盒方法,结合了基于黑盒 I/O 的算法合成和白盒 AST 搜索以合成子表达式
核心合成基于 Triton 符号引擎,在此基础上构建整个框架,它提供以下功能:
- 位向量表达式的合成
- 能够通过 SMT 检查合成表达式的语义等价性
- 能够合成常量(如果表达式编码常量)
- 通过学习机制加班改进预言机(预计算表)的能力
- 能够将合成表达重新组合回组装
- 能够通过 REST API 提供预言机以方便合成使用
- 一个 IDA 插件,提供合成的集成
使用工具生成表:
1 | qsynthesis-table-manager generate -bs 64 --var-num 3 --input-num 16 --random-level 5 --ops AND,NEG,MUL,XOR,NOT --watchdog 80 --limit 5000000 my_oracle_table |
qsynthesis 的使用案例如下:
1 | import logging |
- 结果如下:
1 | The version of qsynthesis is: 0.2.0 |