RetroWrite是X64和AARCH64的靜態二進制重寫器。它沒有啟發式方法,不會引入開銷,而是使用符號化技術(也稱為可重裝組件)將儀器插入二進製文件而無需源代碼。
請注意,X64版本和ARM64版本使用不同的重寫算法並支持不同的功能。
有關技術詳細信息,您可以在X64版本和ARM64版本的本文中閱讀論文(在IEEE S&P'20中)。
Kretrowrite是X64版本的變體,該版本支持Linux內核模塊的重寫。
Retrowrite在Python3(3.6)中實現。這取決於pyelftools和capstone 。要安裝依賴項,請運行:
pip install - r requirements . txt不建議您從發行版的包裝管理人員那里安裝依賴項,因為它們可能已經過時了。
| Retrowrite-X64 | Retrowrite-Aarch64 | |
|---|---|---|
| 剝離的二進制物 | (WIP) | ✅ |
| 非pie二進制 | ✅ | |
| 非標準編譯器 | ✅ | |
| 零開銷 | ✅ | ✅ |
| 內核模塊支持 | ✅ | |
| AFL覆蓋儀器 | ✅ | ✅ |
| Asan儀器 | ✅ | ✅ |
| C ++支持 | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output選擇您想使用retrowrite -m <pass>應用的儀器通行證,您可以在文件夾rwtools_x64和rwtools_arm64中找到可用的儀器通行證。
X64的可用儀器通行證: - 地址齊態 - AFL覆蓋信息
可用的儀器通過AARCH64: - addressSanitizer- AFL覆蓋信息 + forkserver-函數條目上的粗粒粒度控制流程完整性
retrowrite --asan </path/to/binary/> </path/to/output/binary>
注意:如果在X64上,請確保二進制是獨立於位置並且不會剝離的。可以使用file命令(輸出應該說ELF shared object )檢查一下。
例如,創建/bin/ls的儀器版本:
retrowrite --asan /bin/ls ls-basan-instrumented.s
這將生成一個彙編( .s )文件。要將大會重新編譯回到二進制中,這取決於架構:
可以使用任何編譯器將生成的組件組裝和鏈接,例如:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
調試如果您獲得undefined reference to `__asan_init_v4' ,則在彙編文件中替換“ asan_init” Asan_init_v4”,以下命令可以幫助您做到這一點: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
在AARCH64上,我們還依靠標準編譯器組裝和鏈接,但是編譯器標誌的收集略微涉及,因此我們在主retrowrite機上提供了-a開關為您提供此操作:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
要生成AFL啟發的二進製文件,請首先生成符號的組件,如上所述。然後,從AFL ++中使用afl-gcc重新編譯象徵的組件:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
或afl-clang 。
要使用覆蓋範圍信息來儀器,請使用retrowrite -m coverage <input file> <output asm>的覆蓋範圍儀器通過。用retrowrite -a <output asm> <new binary>重新組裝二進製文件。
現在可以將二進制構成:
afl-fuzz -i < seed folder > -o < out folder > < new binary > Retrowrite還試圖添加儀器以充當AFL的叉車。如果這會導致問題,您可以使用export AFL_NO_FORKSERVER=1來禁用此行為
要生成可以通過手動修改或通過現有工具進行後處理的象徵組件,只是不要指定任何儀器通過:
retrowrite </path/to/binary> <path/to/output/asm/files>
輸出ASM文件可以手工或其他工具自由編輯。修飾後,ASM文件可以如上所述組裝到工作二進製文件中。
儘管Retrowrite與其他工具可互操作,但我們強烈鼓勵研究人員使用Retrowrite API來滿足其二元儀器 /修改需求!這節省了必須加載和解析二進製文件或裝配文件的額外努力。
運行setup.sh :
./setup.sh kernel激活VirtualEnv(來自存儲庫的根):
source retro/bin/activate(獎勵)完成Retrowrite完成後退出Virtualenv:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> 有關模糊活動,請參閱模糊/文件夾。
通常, librw/包含用於加載,拆卸和象徵二進制的代碼,並構成了所有轉換的核心。單個轉換通過該重寫框架上的基礎上建立的,例如我們的僅二進制地址消毒劑(Basan)作為rwtools/中的單個工具包含。
從k開頭的文件和文件夾與內核捲盤版本鏈接。
在演示/文件夾中,您將找到用於用戶空間和內核recrowrite的示例(分別為demos/user_demo和demos/kernel_demo)。
以下出版物涵蓋了Retrowrite項目的不同部分:
Retrowrite:用於模糊和消毒的靜態儀器COTS二進製文件Sushant Dinesh,Nathan Burow,Dongyan Xu和Mathias Payer。在奧克蘭20:IEEE國際安全與隱私研討會,2020年
沒有消息來源,沒有問題!高速二進制模糊Matteo Rizzo和Mathias付款人。在36c3'19:混亂傳播大會,2019年
麻省理工學院許可證
版權(c)2019年六角形集團,sushant dinesh [email protected],luca di bartolomeo [email protected],antony vennard [email protected],matteo rizzo rizzo [email protected]@gmail.com
特此免費授予獲得此軟件副本和相關文檔文件副本(“軟件”)的任何人,以無限制處理該軟件,包括無限制的使用權,複製,複製,修改,合併,合併,發布,分發,分發,分發,訂婚,和/或允許軟件的副本,並允許對以下條件提供以下條件,以下是以下條件。
上述版權通知和此許可通知應包含在軟件的所有副本或大量部分中。
該軟件是“原樣”提供的,沒有任何形式的明示或暗示保證,包括但不限於適銷性,特定目的的適用性和非侵權的保證。在任何情況下,作者或版權持有人都不應對任何索賠,損害賠償或其他責任責任,無論是在合同,侵權的訴訟中還是其他責任,是由軟件,使用或與軟件中的使用或其他交易有關的。