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