關於Radare2:
radare2是一個開源的逆向工程和二進制分析框架,包括反匯編、分析數據、打補丁、比較數據、搜索、替換、虛擬化等等,同時具備超強的腳本加載能力,它可以運行在幾乎所有主流的平台(GNU/Linux, .Windows *BSD, iOS, OSX, Solaris…)並且支持很多的cpu架構以及文件格式。 radare2工程是由一系列的組件構成,這些組件可以在 radare2 界面或者單獨被使用–比如我們將要在接下來實驗中使用到的rahash2, rabin2, ragg2三個組件,所有這些組件賦予了 radare2 強大的靜態以及動態分析、十六進制編輯以及溢出漏洞挖掘的能力。
Kali已經自帶radare2
熟悉常用命令:
我們可以輸入-h查看幫助
I開頭的命令主要用來獲取各種信息
A系列的命令用於分析文件
介紹下r2 框架里最強的一個工具 :rabin2.
rabin2 可以獲取包括ELF, PE, Mach-O, Java CLASS文件的區段、頭信息、導入導出表、字符串相關、入口點等等,並且支持幾種格式的輸出文件.
我們可以使用它來獲取二進制文件的基本信息
輸入man rabin2查看更多用法
對於反匯編,我們可以輸入vv進入圖形化界面
輸入q則可以退出圖形化界面,回到shell
通過破解一個crackme來進行radare2具體的學習
首先rabin2加上-I 參數 來讓 rabin2 打印出二進制文件的系統屬性、語言、字節序、框架、以及使用了哪些 加固技術
我們可以看到這是一個32位的 elf 文件,沒有剝離符號表並且是動態鏈接的
接下來我們嘗試運行它
可以看到,不論是否加參數都會顯示wrong。
接下來我們使用radare2來進行破解
可以黃色輸出了一個地址 (0x08048370),這就是它自動識別的程序入口點
或者我們也可以使用ie命令手動打印出入口點
接下來輸入aa或者aaa進行細致的分析
分析完成之后, r2會將所有有用的信息和特定的名字綁定在一起,比如區段、函數、符號、字符串,這些都被稱作 'flags', flags 被整合進 <flag spaces>,一個 flag 是所有類似特征的集合
接下來我們看看所有的flag
我們打印出imports下面的信息
為了獲取更多的信息,我們可以再列出數據段里的字符串
出現了關鍵字,一個是success,一個是我們之前運行時的wrong….
那我們接下來就跟着success走,看看哪兒進行了調用
輸入命令axt @@ str.*
'axt' 命令用來在 data/code段里找尋某個地址相關的引用(更多的操作,請看 'ax?').
'@@'就像一個迭代器,用來在地址空間里不斷地匹配后面一系列相關的命令(更多操作,請看 '@@?')
'str.*' 是一個通配符,用來標記所有以 'str.'開頭的信息,不光會列出字符串標志,同時也包括函數名,找到它們到底在哪里以及何處被調用。
接下來我們看看radare2分析出來哪些函數
看到兩個引起我們注意的sym.beet和sym.rot13
接下來我們用 's main' 指令定位到main函數入口處,然后用 'pdf'輸出反匯編代碼
分析函數的執行流程,我們知道二進制程序是通過獲取 beet函數的返回結果來判斷是否正確
因此我們去beet函數反匯編的部分看看
因此我們定位到beet
輸入pdf@sym.beet進行跳轉
自動跳轉到beet函數的反匯編部分
我們看到輸入的參數被拷貝到了一個緩存空間里,這個空間的地址是 ‘ebp – local_88h’ 。 'local_88h' 就是十進制的 136。由於4個字節會被用來保存 ebp 的地址,4個字節被用來保存返回地址,所以這個緩沖區得大小是 128個字節.它們加起來剛好是 136. 我們輸入的參數被拷貝到緩沖區后被用來和 sym.rot13的返回結果作對比, Rot-13 是一個著名的替換密碼算法,在ctf和crackme中被廣泛使用,這個函數接受了9個十六進制值作為參數,但是上圖中看起來r2好像沒有識別出來到底是什么字符,這里我們需要用 'ahi s' 來做些處理.
輸入
ahi s 是用來設置字符串特定的偏移地址(使用 ahi? 獲取更多用法),@@是一個迭代器,可以用來接受后面輸入的多個參數,執行完這條命令后,圖形視圖會自動刷新
可以看到
0x080485a3
0x080485ad
0x080485b7
后面的字符都已經顯示出來了
我們已經看到了之前無法識別的字符串'Megabeets'(根據字節序反向壓棧順序得到).
這個二進制文件將我們傳入的參數來和經過 rot13 處理后的 'Megabeets' 作比較
接下來我們通過rahash2求出這個字符串的校驗值
至此,程序的邏輯就很清楚了:
'Zrtnorrgf' 就是用來和我們輸入的字符串作比較,成功則返回success
我們驗證一下:
接下來輸入ood?進入調試模式
將Zrtnorrgf作為參數進行調試
輸入dc查看結果
輸出了success,我們成功破解了這個小軟件,也借此掌握了radare2的基本用法
radare2官網:www.radare.org
r2入門指南:https://www.megabeets.net/a-journey-into-radare-2-part-1/