ropper
2026/5/29工具工具ROPropper大约 4 分钟
ropper
是什么
ropper 是一个 gadget 搜索工具,常用于构造 ROP 链。
它和 ROPgadget 功能接近,但交互模式更方便,适合边搜索边筛选 gadget。
常见用途:
- 搜索
pop rdi; ret - 搜索
syscall - 搜索写内存 gadget
- 搜索字符串或可用地址
安装与配置
python3 -m pip install ropper验证:
ropper --help如果安装失败,先安装 capstone:
python3 -m pip install capstone基本用法
搜索所有 gadget
ropper -f ./vuln搜索指定 gadget
ropper -f ./vuln --search "pop rdi"
ropper -f ./vuln --search "syscall"
ropper -f ./vuln --search "leave; ret"搜索 libc
ropper -f ./libc.so.6 --search "pop rdi"指定架构
ropper --file ./vuln --arch x86_64交互模式
ropper -f ./vuln
ropper> search pop rdi
ropper> search syscall
ropper> quit更多搜索选项
搜索 pop 类 gadget
# 搜索 pop rdi; ret
ropper -f ./vuln --search "pop rdi"
# 搜索 pop rsi; ret
ropper -f ./vuln --search "pop rsi"
# 搜索 pop rdx; ret
ropper -f ./vuln --search "pop rdx"
# 搜索 pop rax; ret
ropper -f ./vuln --search "pop rax"
# 搜索 pop rbp; ret
ropper -f ./vuln --search "pop rbp"搜索 syscall 相关
# 搜索 syscall
ropper -f ./vuln --search "syscall"
# 搜索 int 0x80
ropper -f ./vuln --search "int 0x80"
# 搜索 sysenter
ropper -f ./vuln --search "sysenter"搜索栈操作
# 搜索 leave; ret
ropper -f ./vuln --search "leave; ret"
# 搜索 ret
ropper -f ./vuln --search "ret"
# 搜索 add rsp; ret
ropper -f ./vuln --search "add rsp"搜索内存写入
# 搜索 mov [reg], reg; ret
ropper -f ./vuln --search "mov ["
# 搜索 mov qword [reg], reg; ret
ropper -f ./vuln --search "mov qword"搜索特殊 gadget
# 搜索 xchg 指令
ropper -f ./vuln --search "xchg"
# 搜索 inc 指令
ropper -f ./vuln --search "inc"
# 搜索 dec 指令
ropper -f ./vuln --search "dec"
# 搜索 neg 指令
ropper -f ./vuln --search "neg"指定搜索范围
# 只搜索特定地址范围
ropper -f ./vuln --search "pop rdi" --range 0x400000-0x500000输出 gadget 到文件
ropper -f ./vuln --search "pop rdi" > gadgets.txt使用正则搜索
ropper -f ./vuln --search "pop r.*; ret"交互模式命令
基本命令
ropper> file ./vuln
ropper> search pop rdi
ropper> search syscall
ropper> help
ropper> quit设置架构
ropper> set arch x86_64
ropper> set arch x86设置选项
ropper> set badchars "\x00\x0a"
ropper> show options保存 gadget
ropper> save gadgets.txtgadget 类型
控制流 gadget
pop rdi; ret — 设置第一个参数
pop rsi; ret — 设置第二个参数
pop rdx; ret — 设置第三个参数
pop rax; ret — 设置系统调用号
ret — 栈对齐
leave; ret — 栈迁移
call [reg] — 间接调用
jmp [reg] — 间接跳转系统调用 gadget
syscall — x86_64 系统调用
int 0x80 — x86 系统调用
sysenter — x86 快速系统调用内存操作 gadget
mov [reg], reg; ret — 写内存
xchg reg, reg; ret — 交换寄存器
add reg, reg; ret — 寄存器运算
sub reg, reg; ret — 寄存器运算
inc reg; ret — 寄存器加一
dec reg; ret — 寄存器减一栈操作 gadget
ret — 返回
leave; ret — 栈迁移
add rsp, N; ret — 栈调整
pop rbp; ret — 帧指针恢复CTF常用技巧
ret2libc 基础 gadget
64 位 Linux 常先找:
ropper -f ./vuln --search "pop rdi; ret"
ropper -f ./vuln --search "ret"ret 常用于栈对齐。
栈迁移
ropper -f ./vuln --search "leave; ret"
ropper -f ./vuln --search "pop rbp; ret"如果输入空间不足,可以考虑栈迁移到 .bss 或可控堆块。
syscall 链
ropper -f ./vuln --search "pop rax"
ropper -f ./vuln --search "pop rdi"
ropper -f ./vuln --search "pop rsi"
ropper -f ./vuln --search "pop rdx"
ropper -f ./vuln --search "syscall"适合静态链接题、seccomp 题或没有现成 libc 调用的题。
ret2csu gadget
# 搜索 __libc_csu_init 中的 gadget
ropper -f ./vuln --search "pop rbx"
ropper -f ./vuln --search "pop rbp"
ropper -f ./vuln --search "pop r12"
ropper -f ./vuln --search "call [r15]"ret2csu 可以控制多个寄存器,是通用 gadget 来源。
SROP gadget
# 搜索 sigreturn
ropper -f ./vuln --search "syscall" # 配合 rax=15SROP 需要设置 Signal Frame,可以用 pwntools 的 SigreturnFrame。
自动化搜索脚本
#!/usr/bin/env python3
import subprocess
def search_gadget(binary, pattern):
result = subprocess.run(
["ropper", "-f", binary, "--search", pattern],
capture_output=True, text=True
)
return result.stdout
binary = "./vuln"
gadgets = [
"pop rdi; ret",
"pop rsi; ret",
"pop rdx; ret",
"syscall",
"leave; ret",
"ret"
]
for g in gadgets:
print(f"=== {g} ===")
print(search_gadget(binary, g))常见问题
找不到 pop rdi
小程序不一定有完整 gadget。可以去 libc 里找,或考虑 ret2csu、SROP、栈迁移。
ropper 和 ROPgadget 用哪个
两个都可以。ROPgadget 输出直接,ropper 搜索和交互更舒服。实际做题时常两个都试。
gadget 地址能直接用吗
如果 PIE 开启,输出地址通常是偏移,需要加上程序基址。
搜索结果太多
1. 使用更精确的搜索模式
2. 指定地址范围
3. 使用交互模式筛选
4. 过滤 bad characters搜索太慢
1. 只搜索特定地址范围
2. 使用 --type 限制 gadget 类型
3. 减少搜索深度关联
- ROP基础
- ret2csu基础
- SROP基础
- 栈迁移
- ROPgadget
- pwntools