
ELF、PE、Mach-O、Raw バイナリ内の ROP ガジェットを x86、ARM、MIPS、RISC-V アーキテクチャにわたって検索します。自動 ROP チェーン生成と対話型コンソールモードをサポートします。
このツールは、バイナリ上のガジェットを検索して ROP エクスプロイトを容易にするためのものです。 ROPgadget は、x86、x64、ARM、ARM64、PowerPC、SPARC、MIPS、RISC-V 64、および RISC-V Compressed アーキテクチャ上の ELF/PE/Mach-O/Raw 形式をサポートしています。
最も簡単な方法は PyPi から ROPgadget をインストールすることです:
$ sudo apt install python3-pip
$ sudo -H python3 -m pip install ROPgadget
$ ROPgadget --help
別の方法として、ソースから ROPgadget をインストールすることもできます。 最初に Capstone をインストールする必要があります。
nix マシンへの Capstone のインストールの場合:
$ sudo apt install python3-pip
$ sudo -H python3 -m pip install capstone
Capstone はマルチプラットフォーム (Windows, iOS, Android, Cygwin...) をサポートしています。クロスコンパイルについては、https://github.com/capstone-engine/capstone/blob/master/COMPILE.TXT ファイルを参照してください。
Capstone がインストールされたら、ROPgadget はスタンドアロンツールとして使用できます:
$ python3 ROPgadget.py --help
または Python の site-packages ライブラリにインストールし、$PATH から実行できます。
$ sudo -H python3 setup.py install
$ ROPgadget --help
usage: ROPgadget.py [-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>]
description:
ROPgadget は、バイナリ上のガジェットを検索できるようにします。複数のファイル形式とアーキテクチャをサポートし、検索エンジンに Capstone 逆アセンブラを使用します。
formats supported:
- ELF
- PE
- Mach-O
- Raw
architectures supported:
- x86
- x86-64
- ARM
- ARM64
- MIPS
- PowerPC
- Sparc
- RISC-V 64
- RISC-V Compressed
optional arguments:
-h, --help このヘルプメッセージを表示して終了
-v, --version ROPgadget のバージョンを表示
-c, --checkUpdate 新しいバージョンが利用可能か確認
--binary <binary> 分析するバイナリファイル名を指定
--opcode <opcodes> 実行可能セグメント内のオペコードを検索
--string <string> 読み取り可能セグメント内の文字列を検索
--memstr <string> すべての読み取り可能セグメント内の各バイトを検索
--depth <nbyte> 検索エンジンの深さ (デフォルト 10)
--only <key> 特定の命令のみ表示
--filter <key> 特定のニーモニックを除外
--range <start-end> 2つのアドレス間を検索 (0x...-0x...)
--badbytes <byte> ガジェットのアドレス内の特定のバイトを拒否
--rawArch <arch> 生ファイルのアーキテクチャを指定
x86|arm|arm64|sparc|mips|ppc|riscv
--rawMode <mode> 生ファイルのモードを指定 32|64|arm|thumb
--rawEndian <endian> 生ファイルのエンディアンを指定 little|big
--re <re> 正規表現
--offset <hexaddr> ガジェットアドレスのオフセットを指定
--ropchain ROP チェーン生成を有効化
--thumb 検索エンジンにサムモードを使用 (ARM のみ)
--console 検索エンジンに対話型コンソールを使用
--norop ROP 検索エンジンを無効化
--nojop JOP 検索エンジンを無効化
--callPreceded 呼び出し前に位置するガジェットのみ表示
--nosys SYS 検索エンジンを無効化
--multibr 複数分岐ガジェットを有効化
--all 重複ガジェットの削除を無効化
--noinstr ガジェット命令のコンソール出力を無効化
--dump ガジェットのバイトを出力
--silent 分析中のガジェット出力を無効化
--align ALIGN ガジェットアドレスを整列 (バイト単位)
--mipsrop <rtype> MIPS の有用なガジェットファインダー
stackfinder|system|tails|lia0|registers
examples:
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
ROPgadget.py --binary ./test-suite-binaries/elf-Linux-RISCV_64 --depth 8
バグの報告、プルリクエストの送信などは、GitHub (https://github.com/JonathanSalwan/ROPgadget) にてお願いします。
LICENSE_BSD.txt およびすべてのソースファイルのライセンスヘッダーを参照してください。





