【CTF】記一次MIPS題目的逆向分析
作者論壇賬號:Li1y
初步分析
題目鏈接
https://wws.lanzous.com/i6Zo2gpbolc
2020HWS選拔賽的IOT逆向題目,內(nèi)有3個(gè)文件

其中readme.txt內(nèi)容如下:
題目運(yùn)行命令如下:
sudo qemu-system-mipsel -M malta -hda openwrt-malta-le-root.ext4 -kernel openwrt-malta-le-vmlinux.elf -nographic -append "root=/dev/sda console=tty50"
需要分析的程序?yàn)?./bin/maze
.ext4格式文件能直接解壓縮,復(fù)制出/bin/maze,用file看一下文件格式

發(fā)現(xiàn)是小端mips,根據(jù)readme.txt的內(nèi)容能直接模擬整個(gè)openwrt系統(tǒng)來運(yùn)行,而且可以使用gdb調(diào)試,但是調(diào)試過程中遇到了很多問題,比如莫名其妙突然不能顯示輸入輸出的字符等
因此考慮使用靜態(tài)分析方式,那么有以下幾個(gè)工具可以選擇
Ghidra
IDA7.5
JEB-MIPS
首先推薦IDA7.5,氪金才能變強(qiáng),如果想白嫖最好還是選擇JEB-MIPS
根據(jù)個(gè)人經(jīng)驗(yàn),JEB-MIPS的偽代碼效果要優(yōu)于Ghidra,在一些異或處理上Ghidra顯示的偽代碼會和匯編有歧義,使用者容易被誤導(dǎo)
個(gè)人使用的JEB版本可在如下鏈接獲取
[Android Tools] JEB 3.17.1 Anti-Covid19 Edition by DimitarSerg
https://www.52pojie.cn/thread-1162477-1-1.html
靜態(tài)分析
根據(jù)題目maze也可以知道,這是一個(gè)CTF逆向題中典型的迷宮題
sub_400B44為主函數(shù)
首先限制了輸入長度為32

其次在sub_4006F0()通過預(yù)置的字符串"AMz1nG~#--Ma7e~"得出迷宮布局,即.bss段中的maze數(shù)組

根據(jù)字符串的長度和循環(huán)次數(shù)可以判斷出迷宮大小為8*15
我們可以根據(jù)偽代碼還原出迷宮生成函數(shù),從而打印出迷宮

剩下的就是判斷,上下左右分別用UDLR代替,下圖中以ASCII碼顯示

根據(jù)v1=1,v2=0可以判斷起始點(diǎn)是(1,0),而要走32步,則只有如下圖路徑

結(jié)果為
DDRDDLDDRRRRRDRDDDDDLLDDLLLUUULU
動(dòng)態(tài)分析
那么如果迷宮生成步驟再復(fù)雜一點(diǎn),很難從偽代碼分析還原出迷宮,就需要?jiǎng)討B(tài)調(diào)試了。
而根據(jù)前文所述,無法使用openwrt自帶的gdb調(diào)試,那么通過外接gdb是否可以呢
已知使用qemu可以直接模擬執(zhí)行靜態(tài)編譯的程序,但是如何對題中這種動(dòng)態(tài)編譯,需要外部依賴的程序進(jìn)行模擬執(zhí)行呢?
經(jīng)過查閱資料(https://www.colabug.com/2020/0824/7658729/),參考博主大佬對embedded_heap的調(diào)試過程,使用命令如下
qemu-mipsel -L ./ ./bin/maze

注意,根據(jù)博主大佬的過程,需要參照lib文件夾中的兩個(gè)1kb文件內(nèi)容,修改對應(yīng)的so文件,不然會出現(xiàn)解析錯(cuò)誤

解釋的可能不是很清楚,直接舉例吧,比如ld-musl-mipsel-sf.so.1其實(shí)并不是一個(gè)ELF格式的程序,用txt打開之后里面只有l(wèi)ibc.so,因此刪除舊的ld-musl-mipsel-sf.so.1并將libc.so命名為新的ld-musl-mipsel-sf.so.1

對libatomic.so.1的處理過程也一樣,處理之后就可以愉快的動(dòng)態(tài)調(diào)試了
因?yàn)橐褂胓db調(diào)試,所以使用-g參數(shù)設(shè)置端口
qemu-mipsel -g 1234 -L ./ ./bin/maze
之后安裝apt-get install gdb-multiarch,再使用如下命令啟動(dòng)gdb
gdb-multiarch -q ./bin/maze
設(shè)置架構(gòu)和大小端序(默認(rèn)小端)
set architecture mips
set endian little(本題為小端,可以不使用此命令)
最后遠(yuǎn)程連接調(diào)試端口,如在本地127.0.0.1可以省略不寫
target remote :1234
本以為這樣就結(jié)束了,可以愉快下斷點(diǎn)了,但是下完斷點(diǎn)執(zhí)行g(shù)db就崩了,換用pwngdb也是如此,過程如下圖

問題暫時(shí)無解,希望知道原因的師傅能告訴我
因此選擇使用IDA調(diào)試,雖然7.5以下的IDA不支持顯示mips的偽代碼,但是遠(yuǎn)程調(diào)試還是妥妥的,依舊是使用qemu-mipsel -g 1234 -L ./ ./bin/maze啟動(dòng)遠(yuǎn)程調(diào)試,ifconfig看一下虛擬機(jī)的ip,使用IDA打開maze文件,下斷點(diǎn)后選擇Remote GDB debugger運(yùn)行

填寫虛擬機(jī)ip和端口,其它參數(shù)默認(rèn)點(diǎn)OK即可

如果斷點(diǎn)下在了初始化迷宮布局結(jié)束之后,例如sub_400904處,運(yùn)行至此處后找到.bss段的maze變量轉(zhuǎn)化為數(shù)組即可看到迷宮全貌

此處還有一個(gè)坑點(diǎn),使用IDA7.0的時(shí)候同樣的流程看不到.bss段初始化后的結(jié)果,全是?
而換用7.2就可以了,淚目,果然氪金才能變強(qiáng)
不過論壇有7.2的版本,下載一個(gè)就OK
剩下的見靜態(tài)調(diào)試分析

最后,求知道為什么gdb調(diào)試會崩掉的師傅解惑
【更新,換了Ubuntu就不會崩掉了,玄學(xué)。。?!?/p>
原帖地址:?https://www.52pojie.cn/thread-1269155-1-1.html