angr/angrop
GitHub: angr/angrop
angrop 是基于 angr 符号执行引擎的多架构 ROP gadget 自动查找与 ROP 链生成工具,支持用户态和内核态二进制。
Stars: 810 | Forks: 85
# angrop
angrop 是一个 ROP gadget 查找器和链构建器。
## 概述
angrop 是一个自动生成 ROP 链的工具。
它构建于 angr 的符号执行引擎之上。
它利用符号执行来理解 gadget 的效果,并使用约束求解和图搜索来生成链。
其设计与架构无关,因此支持多种架构。
通常,它生成 ROP 链的速度比人类更快。
在某些情况下,它可以在几秒钟内生成人类可能需要数小时才能构建的复杂 ROP 链。
一些示例可以在[这里](examples)找到。
它提供了 CLI 和 Python API。
命令行工具 `angrop-cli` 提供了一些基本的 gadget 查找/链构建功能,例如查找 `system`/`execve` 链或调用特定函数。
`angrop` Python API 提供了完整的功能。
详情请参阅[使用说明](README.md#usage)。
`angrop` 不仅适用于用户态二进制文件,同样适用于 Linux 内核。
## 架构
支持的架构:
* x86/x64
* MIPS
* ARM
* AArch64
* RISC-V (64位)
支持 `angr` 所支持的其他架构应该相对容易。
如果您想在其他架构上使用 `angrop`,请创建一个 issue,我们会关注它 :)
## 使用说明
您可以使用 CLI 或 Python API。
CLI 仅提供一些基本功能,而 Python API 提供了更多的功能且更强大。
## CLI
angrop 附带一个命令行工具,方便日常使用
```
# dump 命令将在目标 binary 中查找 gadgets,true/false 标记 gadget 是否独立
$ angrop-cli dump /bin/ls
0x11735: true : adc bl, byte ptr [rbx + 0x4c]; mov eax, esp; pop r12; pop r13; pop r14; pop rbp; ret
0x10eaa: true : adc eax, 0x12469; add rsp, 0x38; pop rbx; pop r12; pop r13; pop r14; pop r15; pop rbp; ret
00xe026: true : adc eax, 0xcec8; pop rbx; cmove rax, rdx; pop r12; pop rbp; ret
00xdfd4: true : adc eax, 0xcf18; pop rbx; cmove rax, rdx; pop r12; pop rbp; ret
00xdfa5: true : adc eax, 0xcf4d; pop rbx; cmove rax, rdx; pop r12; pop rbp; ret
......
# chain 命令将在 binary 中查找一些预定义的 chains
$ angrop-cli chain -t execve /bin/bash
code_base = 0x0
chain = b""
chain += p64(code_base + 0x36083) # pop rax; pop rbx; pop rbp; ret
chain += p64(code_base + 0x30016) # add rsp, 8; ret
chain += p64(code_base + 0x34873)
chain += p64(code_base + 0x0)
chain += p64(code_base + 0x9616d) # mov edx, ebp; mov rsi, r12; mov rdi, rbx; call rax
chain += p64(code_base + 0xe501e) # pop rsi; ret 0
chain += p64(code_base + 0x0)
chain += p64(code_base + 0x31470) # execve@plt
chain += p64(0x0)
chain += p64(code_base + 0x10d5bf)
```
## Python API
```
>>> import angr, angrop
>>> p = angr.Project("/bin/ls")
>>> rop = p.analyses.ROP()
>>> rop.find_gadgets()
>>> chain = rop.set_regs(rax=0x41414141, rbx=0x42424242)
>>> chain.print_payload_code()
code_base = 0x0
chain = b""
chain += p64(code_base + 0xf5e2) # pop rbx; pop r12; test eax, eax; pop rbp; cmovs eax, edx; ret
chain += p64(0x42424242)
chain += p64(0x0)
chain += p64(0x0)
chain += p64(code_base + 0x812f) # pop rsi; pop rbp; ret
chain += p64(0x41414141)
chain += p64(0x0)
chain += p64(code_base + 0x169dd) # mov rax, rsi; ret
chain += p64(code_base + 0x10a55)
```
关于 Python API 的更详细文档可以在[这里](docs/pythonapi.md)找到。
## 演示
### gadget 查找

### 查找 execve 链

### 内核容器逃逸链

## 论文
我们在本文中描述了我们的设计和发现
[__ropbot: Reimaging Code Reuse Attack Synthesis__](https://kylebot.net/papers/ropbot.pdf)
Kyle Zeng, Moritz Schloegel, Christopher Salls, Adam Doupé, Ruoyu Wang, Yan Shoshitaishvili, Tiffany Bao
*发表于网络与分布式系统安全研讨会 (NDSS),2026年2月*
标签:angr 框架, CTF 工具, Gadget 查找, Hakrawler, Linux 内核安全, Python 库, ROP 链生成, 二进制分析, 云安全运维, 云资产清单, 利用开发, 漏洞攻防, 符号执行, 缓冲区溢出, 自动化安全工具, 跨架构支持, 逆向工具, 逆向工程, 项目管理