ROPgadget
隨著 NX 保護(No-eXecute 不可執行)的開啟,以往直接向棧或者堆上直接注入代碼的方式難以繼續發揮效果。攻擊者們也提出來相應的方法來繞過保護,目前主要的是 ROP(Return Oriented Programming),其主要思想是在棧緩沖區溢出的基礎上,利用程序中已有的小片段( gadgets )來改變某些寄存器或者變量的值,從而控制程序的執行流程。所謂gadgets 就是以 ret 結尾的指令序列,通過這些指令序列,我們可以修改某些地址的內容,方便控制程序的執行流程。
之所以稱之為 ROP,是因為核心在于利用指令集中的 ret 指令,改變指令流的執行順序。
具體利用細節將在棧溢出章節介紹。
ROPgadget工具可以幫助你尋找合適的gadgets,在編寫你的ROP exp的時候有很大作用。ROPgadget支持 x86, x64, ARM, ARM64, PowerPC, SPARC和MIPS架構下的ELF/PE/Mach-O文件格式。
安裝
如果你要使用ROPgadget,你首先需要安裝Capstone(反匯編框架)
$ sudo pip install capstone
Capstone支持多平臺(Windows, ios, android, cygwin…)交叉編譯請參考https://github.com/aquynh/capstone/blob/master/COMPILE.TXT。
Capstone安裝好后,ROPgadget可以作為一個standalone工具使用。
$ ROPgadget.py
或者通過python安裝庫
$ python setup.py install
$ ROPgadget
直接通過Pypi安裝也可以
$ pip install ropgadget
$ ROPgadget
測試一下安裝完成
具體使用方法
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]
參數
-h, --help 顯示幫助文檔
-v, --version 版本號
-c, --checkUpdate 檢測新版本是否可用
--binary <binary> 指定二進制文件進行分析
--opcode <opcodes> 在可執行段中查找opcode
--string <string> 在可讀的段中查找字符串
--memstr <string> 查找單個byte在所有的可執行段中
--depth <nbyte> 搜索引擎的深度
--only <key> 只顯示特別的指令
--filter <key> 過濾特定指令
--range <start-end> 在地址之間尋找(0x...-0x...)
--badbytes <byte> 拒絕特定指令在gadget的地址下
--rawArch <arch> 指定文件架構
--rawMode <mode> 指定源文件的mode
--rawEndian <endian> 指定源文件的endianness
--re <re> 正則表達式
--offset <hexaddr> 指定gadget的地址偏移
--ropchain ROP chain的生成
--thumb 在ARM架構下使用搜索引擎thumb 模式
--console 使用交互終端對于搜索引擎
--norop 禁止ROP搜索引擎
--nojop 禁止JOP搜索引擎
--callPreceded 僅顯示call-preceded的gadgets
--nosys 禁止SYS搜索引擎
--multibr 允許多分枝gadgets
--all 禁止刪除重復的gadgets,即顯示所有
--noinstr 禁止gadget指令終端打印
--dump 輸出gadget bytes
參考