因为感觉网上整理好的相关资料比较少在这里分享给大家。
基本介绍
NDS:任天堂DS,是电玩游戏生产商任天堂公司2004年发售的第三代便携式游戏机。主要的特征包括了双屏幕显示,其中下方的屏幕为触摸屏;并配置有麦克风声音输入装置和 Wi-Fi 无线网络功能。这里题目提供了一个chall.nds的文件,一个nds的ROM文件,可以在pc上使用模拟器来加载运行,在这里我使用的是DeSmuME模拟器。
解题
观察题目大致功能
首先我们使用模拟器加载题目,可以看到是一个需要通过三关才能拿到flag的游戏。如下图所示
按下回车后进入第一关
[<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a7b11c5ec55e4cf0b9b91a79181b8009~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fwww.oschina.net%2Faction%2FGoToLink%3Furl%3Dhttps%253A%252F%252Fp0.ssl.qhimg.com%252Ft01674b1d6be19325de.png "https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp0.ssl.qhimg.com%2Ft01674b1d6be19325de.png"" style="margin: auto" />
可以看到是要输入数据才可以通过下一关。由于DeSmuME并不能下断进行调试,只能看反汇编和寄存器的值这里我们继续考虑静态分析。
静态分析准备
打开IDA发现并不能识别它的架构程序基址等等,这里我在github上搜到了一个nds的IDA loader插件github.com/EliseZeroTw…安装插件后即可识别代码。需要注意的是程序中有ARM7和ARM9的代码,如果只识别ARM7则不能在IDA中看到全部函数。插件会弹框告诉你。识别结果如下图。
[<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b4c4f5d95d70441892835698058e1657~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image)](https://link.juejin.cn/?target=https%3A%2F%2Fwww.oschina.net%2Faction%2FGoToLink%3Furl%3Dhttps%253A%252F%252Fp1.ssl.qhimg.com%252Ft01b6f33b8cf9bf98bf.png "https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp1.ssl.qhimg.com%2Ft01b6f33b8cf9bf98bf.png"" style="margin: auto" />
可以看到识别出了很多的函数,那么下一步就是需要定位到,处理的代码在哪。这里我们可以通过静态分析或者观察DeSmuME运行时的pc寄存器的值来确定处理数据的代码位置。
定位处理代码位置
在进入第一关之后等待输入时,PC的值为2005B24我们在IDA找到这个位置,位于2005AD0这个函数中。猜测这个函数的功能就是获取输入,这里查看其引用发现上层函数只有一个,再查看上层引用如下图(注:其中的stage1 stage2 stage3是我后来改的函数名,原本的程序是没有符号表的)。
[<img src="