ROPgadget介绍

前言

ROPgadget 工具可以帮助寻找合适的 gadgets,帮助编写ROP exp。ROPgadget支持x86、x64、ARM、ARM64、PowerPC、SPARC和MIPS架构下的 ELF/PE/Mach-O文件格式。

安装

安装ROPgadget前,首先需要安装Capstone,一个轻量级的多平台架构支持的反汇编架构。

1
2
3
4
5
sudo apt-get install python-capstone
git clone https://github.com/JonathanSalwan/ROPgadget.git
cd ROPgadget
sudo python setup.py install
ROPgadget --help

使用方法

1
2
3
4
5
6
7
8
usage: ROPgadget [-h] [-v] [-c] [--binary <binary>] [--opcode <opcodes>]
[--string <string>] [--memstr <string>] [--depth <nbyte>]
[--only <key>] [--filter <key>] [--range <start-end>]
[--badbytes <byte>] [--rawArch <arch>] [--rawMode <mode>]
[--rawEndian <endian>] [--re <re>] [--offset <hexaddr>]
[--ropchain] [--thumb] [--console] [--norop] [--nojop]
[--callPreceded] [--nosys] [--multibr] [--all] [--noinstr]
[--dump] [--silent] [--align ALIGN] [--mipsrop <rtype>]

参数详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-h, --help           显示帮助文档
-v, --version 版本号
-c, --checkUpdate 检测新版本是否可用
--binary <binary> 指定二进制文件进行分析
--opcode <opcodes> 在可执行段中查找opcode
--string <string> 在可读的段中查找字符串
--memstr <string> 查找单个byte在所有的可执行段中
--depth <nbyte> 搜索引擎的深度(默认10)
--only <key> 只显示特别的指令
--filter <key> 过滤特定指令
--range <start-end> 在地址之间寻找(0x...-0x...)
--badbytes <byte> 拒绝特定指令在gadget的地址下
--rawArch <arch> 指定文件架构: x86|arm|arm64|sparc|mips|ppc
--rawMode <mode> 指定源文件的mode: 32|64|arm|thumb
--rawEndian <endian> 指定源文件的字节顺序: little|big
--re <re> 正则表达式
--offset <hexaddr> 指定gadget的地址偏移
--ropchain ROP链的生成
--thumb 在ARM架构下使用搜索引擎thumb 模式
--console 使用交互终端对于搜索引擎
--norop 禁止ROP搜索引擎
--nojop 禁止JOP搜索引擎
--callPreceded 仅显示call-preceded的gadgets
--nosys 禁止SYS搜索引擎
--multibr 允许多分枝gadgets
--all 禁止删除重复的gadgets,即显示所有
--noinstr 禁止gadget指令终端打印
--dump 输出gadget bytes
--align ALIGN 对齐gadget地址(以字节为单位)
--mipsrop <rtype> MIPSj架构下有用的gadget查找器: stackfinder|system|tails|lia0|registers

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --ropchain
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --depth 3
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string "main"
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string "m..n"
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --opcode c9c3
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --only "mov|ret"
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --only "mov|pop|xor|ret"
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --filter "xchg|add|sub|cmov.*"
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --norop --nosys
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --range 0x08041000-0x08042000
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string main --range 0x080c9aaa-0x080c9aba
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --memstr "/bin/sh"
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --console
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --badbytes "00|01-1f|7f|42"
ROPgadget.py --binary ./test-suite-binaries/Linux_lib64.so --offset 0xdeadbeef00000000
ROPgadget.py --binary ./test-suite-binaries/elf-ARMv7-ls --depth 5
ROPgadget.py --binary ./test-suite-binaries/elf-ARM64-bash --depth 5
ROPgadget.py --binary ./test-suite-binaries/raw-x86.raw --rawArch=x86 --rawMode=32