r2-ropstats
April 20, 2016 · View on GitHub
A set of tools based on radare2 for analysis of ROP gadgets and payloads.
Requirements
Python 2.7
radare2 + r2pipe python bindings
Implicit/Explicit gadgets
Implicit gadgets are for example function epilogues + their vicinity and are formed only by instructions also present in a healthy running program. Explicit gadgets are formed by transfering control amidst another instructions in such a way to form a valid gadgets.
Overview
gadget-stats [--gadget-file file] file - Analyzes the provided binary and searches its executable sections for ROP gadgets, then computes statistics about the gadgets and the ratio of implicit/explicit ones. If the optional argument --gadget-file is supplied then that file is used as source of gadgets, the expected format is that of ROPgadget's output.
Example usage
First example counts the statistics of the libc.
c0da206026cffea80b6effe2be03a68e573eb1b090a72dfdeaa4f6a958a929e9 /lib64/libc-2.18.so
./gadget-stats /lib64/libc-2.18.so 2>/dev/null
[-] Opening file: "/lib64/libc-2.18.so"
✓ Analyzing ...
➙ ----------------------------------------------------------------------
➙ Entrypoint: 0x3c1e621e70
➙ Gadgets: 21749
➙ ----------------------------------------------------------------------
➙ Implicit: 11608
➙ Explicit: 3903
➙ Total: 15511
» Ratio: 2.97:1
In second example the binary is first sifted through with ROPgadget piping the output to the file libc-gadgets. Using the --gadget-file switch we then inspect the gadgets in the file.
python ROPgadget.py --binary /lib64/libc-2.18.so > libc-gadgets
./gadget-stats --gadget-file libc-gadgets /lib64/libc-2.18.so 2>/dev/null