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