今年的hsctf里遇到了一个比较少见的nds逆向题目,侥幸拿下一血
因為感覺網(wǎng)上整理好的相關(guān)資料比較少在這里分享給大家。
基本介紹
NDS:任天堂DS,是電玩游戲生產(chǎn)商任天堂公司2004年發(fā)售的第三代便攜式游戲機。主要的特征包括了雙屏幕顯示,其中下方的屏幕為觸摸屏;并配置有麥克風(fēng)聲音輸入裝置和 Wi-Fi 無線網(wǎng)絡(luò)功能。
這里題目提供了一個chall.nds的文件,一個nds的ROM文件,可以在pc上使用模擬器來加載運行,在這里我使用的是DeSmuME模擬器。
解題
觀察題目大致功能
首先我們使用模擬器加載題目,可以看到是一個需要通過三關(guān)才能拿到flag的游戲。如下圖所示
按下回車后進入第一關(guān)
可以看到是要輸入數(shù)據(jù)才可以通過下一關(guān)。由于DeSmuME并不能下斷進行調(diào)試,只能看反匯編和寄存器的值這里我們繼續(xù)考慮靜態(tài)分析。
靜態(tài)分析準備
打開IDA發(fā)現(xiàn)并不能識別它的架構(gòu)程序基址等等,這里我在github上搜到了一個nds的IDA loader插件
https://github.com/EliseZeroTwo/IDA-NDS
安裝插件后即可識別代碼。需要注意的是程序中有ARM7和ARM9的代碼,如果只識別ARM7則不能在IDA中看到全部函數(shù)。插件會彈框告訴你。識別結(jié)果如下圖。
可以看到識別出了很多的函數(shù),那么下一步就是需要定位到,處理的代碼在哪。
這里我們可以通過靜態(tài)分析或者觀察DeSmuME運行時的pc寄存器的值來確定處理數(shù)據(jù)的代碼位置。
定位處理代碼位置
在進入第一關(guān)之后等待輸入時,PC的值為2005B24我們在IDA找到這個位置,位于2005AD0這個函數(shù)中。猜測這個函數(shù)的功能就是獲取輸入,這里查看其引用發(fā)現(xiàn)上層函數(shù)只有一個,再查看上層引用如下圖(注:其中的stage1 stage2 stage3是我后來改的函數(shù)名,原本的程序是沒有符號表的)。
我們挨個進入函數(shù)查看其功能。在我標記的stage1(0x2000D4C)中發(fā)現(xiàn)了這樣一段代碼。
猜測這里是對我們輸入數(shù)據(jù)的校驗。也就是stage1的代碼。
再查找stage1的引用定位到函數(shù)0x2002e18如下圖
猜測接下來的函數(shù)是stage2 stage3 后面驗證果然如此
stage1
觀察函數(shù)執(zhí)行流程,確定了此處為比較位置
得到正確的輸入cuteblueicecube
輸入之后進入stage2
stage2
第二階段如下圖
猜測是點擊圖片上的字來通過。
繼續(xù)分析stage2的代碼
在其中發(fā)現(xiàn)這樣一段代碼
可以看到之前在stage1中出現(xiàn)的獲取輸入的函數(shù)
確定輸入的位數(shù)為8位數(shù)也就是說應(yīng)該點擊界面上帶數(shù)字的小方格八次。
繼續(xù)看下面可以看到有一段進行驗證的代碼
代碼實現(xiàn)了多個方程,對輸入進行校驗,其中使用的2014DB8為除法。這里使用Z3解方程,解開后將得到的值在屏幕上點擊即可進入下一關(guān),由于出題人并不夠嚴謹導(dǎo)致方程有多個解。通過后進入第三關(guān)
stage3
第三階段走迷宮需要把鳥移到左下角
但在實際中我們移到一半就發(fā)現(xiàn)下面有一堵墻,挪不動了,這時候想到小時候玩游戲魂斗羅之類的有作弊碼,那作者很有可能也設(shè)置了這樣的一段代碼。這時候我們需要看一下IDA的代碼。發(fā)現(xiàn)了可疑的一部分,如下圖。
猜測這里就是作弊碼,接著看代碼如何滿足條件進入這里。
在這里發(fā)現(xiàn)需要v76以一定的順序執(zhí)行這幾個賦值就可以通過檢測。通過看代碼可知v76是r4寄存器,而后觀察模擬器按鍵設(shè)置
按下QWASZX對應(yīng)的鍵位即可讓r4寄存器產(chǎn)生我們需要的值,接下來就是確定它的順序。
v121 == 50 && v117 == 30 && v122 == 60 && v118 == 70 && v120 == 40 &&
v119==80
最終確定按鍵順序為xsazwq
按下后中間的墻壁消失了。小鳥成功走到了右下角。
final
在通過三個階段后界面如下圖
這里把我們的輸入拼接成flag即可,需要注意的是第三階段需要提交的是任天堂游戲機的真正按鍵,這里我們根據(jù)模擬器鍵位得到真正的游戲機鍵位。
最終flag為
flag{cuteblueicecube_1-16-20-6-21-4-16-18_A-X-Y-B-R-L}
由于第二階段是多解,第二階段輸入為1-16-20-6-21-4-16-18 成功通過
小結(jié)
題目難點主要是,陌生的架構(gòu),以及模擬器不能進行下斷調(diào)試等(可能有模擬器可以調(diào)試?知道的大佬可以提點一下)
》》想學(xué)習(xí)網(wǎng)安打CTF的朋友福利來了!
免費贈送價值11980安全學(xué)習(xí)資料包
總結(jié)
以上是生活随笔為你收集整理的今年的hsctf里遇到了一个比较少见的nds逆向题目,侥幸拿下一血的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让你轻松学会PHP版自动化SQL盲注工具
- 下一篇: 别再问Cloudflare CDN 漏洞