今年的hsctf里遇到了一个比较少见的nds逆向题目,侥幸拿下一血

因为感觉网上整理好的相关资料比较少在这里分享给大家。

基本介绍

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=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f9aa8bc000b34ceaa05861cf02cd9284~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%252Fp2.ssl.qhimg.com%252Ft01885e5cd80f9e1d79.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp2.ssl.qhimg.com%2Ft01885e5cd80f9e1d79.png”” style=“margin: auto” />

我们挨个进入函数查看其功能。在我标记的stage1(0x2000D4C)中发现了这样一段代码。

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9c3967060b5243d8aec50d3a5c851bfd~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%252Fp4.ssl.qhimg.com%252Ft018e0368b28a9d73e4.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp4.ssl.qhimg.com%2Ft018e0368b28a9d73e4.png”” style=“margin: auto” />

猜测这里是对我们输入数据的校验。也就是stage1的代码。再查找stage1的引用定位到函数0x2002e18如下图

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2ddf3a24dcc04392aa57ce3640474a81~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%252Ft011f84b6e4070a025f.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp1.ssl.qhimg.com%2Ft011f84b6e4070a025f.png”” style=“margin: auto” />

猜测接下来的函数是stage2 stage3 后面验证果然如此

stage1

观察函数执行流程,确定了此处为比较位置

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/09d7d1b56ae842f1b0285638c9eb37b2~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%252Fp3.ssl.qhimg.com%252Ft0144d8658ef8fd7494.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp3.ssl.qhimg.com%2Ft0144d8658ef8fd7494.png”” style=“margin: auto” />

得到正确的输入cuteblueicecube输入之后进入stage2

stage2

第二阶段如下图

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bc7211300b094135bb451d0fb68577d7~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%252Fp4.ssl.qhimg.com%252Ft0173ded44778acac35.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp4.ssl.qhimg.com%2Ft0173ded44778acac35.png”” style=“margin: auto” />

猜测是点击图片上的字来通过。继续分析stage2的代码在其中发现这样一段代码

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/51ade8197ac240cdbb12a3173afa1599~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%252Ft014fe184bb8a7d646d.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp1.ssl.qhimg.com%2Ft014fe184bb8a7d646d.png”” style=“margin: auto” />

可以看到之前在stage1中出现的获取输入的函数确定输入的位数为8位数也就是说应该点击界面上带数字的小方格八次。继续看下面可以看到有一段进行验证的代码 [<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1feb19ddacc94fc9932d2a3fdd65cb2a~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%252Fp2.ssl.qhimg.com%252Ft01ff78bd8a6b5b96cb.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp2.ssl.qhimg.com%2Ft01ff78bd8a6b5b96cb.png”” style=“margin: auto” />

代码实现了多个方程,对输入进行校验,其中使用的2014DB8为除法。这里使用Z3解方程,解开后将得到的值在屏幕上点击即可进入下一关,由于出题人并不够严谨导致方程有多个解。通过后进入第三关

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4991c9162f0b4d348ef69799a7867325~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%252Ft01497b6901ca078230.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp1.ssl.qhimg.com%2Ft01497b6901ca078230.png”” style=“margin: auto” />

stage3

第三阶段走迷宫需要把鸟移到左下角

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1c293b950e37462282bb0e3832e57071~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%252Ft01ef10b2e580a59ea2.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp1.ssl.qhimg.com%2Ft01ef10b2e580a59ea2.png”” style=“margin: auto” />

但在实际中我们移到一半就发现下面有一堵墙,挪不动了,这时候想到小时候玩游戏魂斗罗之类的有作弊码,那作者很有可能也设置了这样的一段代码。这时候我们需要看一下IDA的代码。发现了可疑的一部分,如下图。

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/921c4b6ae541402fb97b12b8876fb607~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%252Fp3.ssl.qhimg.com%252Ft0143690adc28178424.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp3.ssl.qhimg.com%2Ft0143690adc28178424.png”” style=“margin: auto” />

猜测这里就是作弊码,接着看代码如何满足条件进入这里。

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cae626584ba2441f8551f828edde8a8d~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%252Ft01da853c4753d0c60c.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp1.ssl.qhimg.com%2Ft01da853c4753d0c60c.png”” style=“margin: auto” />

在这里发现需要v76以一定的顺序执行这几个赋值就可以通过检测。通过看代码可知v76是r4寄存器,而后观察模拟器按键设置

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c012568122344c90a07261512e0e41bc~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%252Fp4.ssl.qhimg.com%252Ft0194828be9c1324848.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp4.ssl.qhimg.com%2Ft0194828be9c1324848.png”” style=“margin: auto” />

按下QWASZX对应的键位即可让r4寄存器产生我们需要的值,接下来就是确定它的顺序。

v121 == 50 && v117 == 30 && v122 == 60 && v118 == 70 && v120 == 40 && v119==80 

最终确定按键顺序为xsazwq按下后中间的墙壁消失了。小鸟成功走到了右下角。

final

在通过三个阶段后界面如下图

[<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0fec926358654e599d2dfd5c61af544a~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%252Fp3.ssl.qhimg.com%252Ft01964a003157567633.png “https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fp3.ssl.qhimg.com%2Ft01964a003157567633.png”” style=“margin: auto” />

这里把我们的输入拼接成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安全学习资料包

接下来我将给各位同学划分一张学习计划表!

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值