前言
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
|