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

基本介绍

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逆向题目,侥幸拿下一血相关推荐

  1. Angular里如何测试一个具有外部依赖的Component

    例子:该Component依赖于UserService: export class WelcomeComponent implements OnInit {welcome: string;constr ...

  2. Angular里遇到的一个依赖注入问题以及解决办法

    类的实例字段定义必须在实例方法之前: 尽量避免用String类型: 我在自己Component的构造函数里试图注入一个service class: 遇到错误消息:NullInjectorError: ...

  3. 在Java里如何给一个日期增加一天

    在Java里如何给一个日期增加一天 我正在使用如下格式的日期: yyyy-mm-dd. 我怎么样可以给一个日期增加一天? 回答一 这样应该可以解决问题 String dt = "2008-0 ...

  4. 写一个类Army,代表一支军队,这个类有一个属性Weapon数组w(用来存储该军队所拥有的所有武器), 该类还提供一个构造方法,在构造方法里通过传一个int类型的参数来限定该类所能拥有

    代码 /*开放型题目,随意发挥:写一个类Army,代表一支军队,这个类有一个属性Weapon数组w(用来存储该军队所拥有的所有武器),该类还提供一个构造方法,在构造方法里通过传一个int类型的参数来限 ...

  5. python 矩阵元素如何表示_python 怎么给矩阵里的每一个元素赋值

    用python语言如何给列表动态的赋值? 可以使用for或者while循环结合list的append或者insert方法赋值for i in range(10):append(i). a=1#把1赋值 ...

  6. java file 的length_java里怎么知道一个file的大小?

    java里怎么知道一个file的大小?有什么方法吗? | length public long length() Returns the length of the file denoted by t ...

  7. html圆形分成六份,在ai里怎么把一个圆平均分成几份

    1.AI 里圆圈怎么平均分成5份 AI里将圆圈平均分成5份的办法: 第一步:打开AI新建画布,画布的基本设置按照实际需求进行设置即可. 第二步:在工具栏中选择"极坐标网格工具",鼠 ...

  8. matlab(simulink)里怎么求一个波形的动态平均值

    matlab(simulink)里怎么求一个波形的动态平均值 搭建一个简单的模型 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔 ...

  9. 一个网站里藏着一个网站

    hello大家好有小伙伴去过藏着网站的网站吗?就比如geekprank.com这个网站,接下来我再给大家解释一下一个网站里藏着一个网站就是使用<a href="">&l ...

最新文章

  1. MinGw 和 cygwin 的区别和联系 (跨平台 windows运行linux程序)
  2. 总结Hbase 与 MongoDB
  3. wxWidgets:wxSetCursorEvent类用法
  4. 基于c语言画图软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件
  5. Java-reflect(反射)初步理解_1
  6. WEB安全基础-文件下载漏洞以及文件包含漏洞演示
  7. 【Antlr】Antlr 孤岛语法:处理相同文件中的不同格式
  8. 下方向键_求助:Deepin-linux-opencv方向键
  9. 中国结肠镜设备行业市场供需与战略研究报告
  10. keil c语言循环嵌套,keil软件中C语言嵌套汇编
  11. 打开Visual Studio 2010,左下角显示加载工具箱内容
  12. C3D实现ucf101人体行为识别代码知识总结
  13. DDos攻击防御策略
  14. 测绘类专业计算机要学什么科目,测绘类包括哪些专业
  15. C - 小型Basic编译器问题
  16. 数据仓库(DW)、数据湖、数据中台的关系
  17. 静态方法能被重写么?
  18. 英雄联盟主播有哪些精彩操作值得看?
  19. ZHA_123的自我介绍
  20. phonegap编译Android,PhoneGap应用程序编译

热门文章

  1. 成功解决preprocessing\label.py:151: DeprecationWarning: The truth value of an empty array is ambiguous.
  2. BlockChain:《区块链世界简明生存指南(一块听听)》2017-06-06 李笑来—听课笔记分享(2)
  3. MySQL索引面试题分析(索引分析,典型题目案例)
  4. bzoj2424 订货
  5. 操作系统-命令解释程序(实验一)
  6. Sphinx-安装和配置
  7. 详解ADO.NET操作数据库合力创享
  8. 【转】浅谈MS-SQL锁机制
  9. python——正则表达式
  10. linux 毕业设计 apache,毕业论文基于Linux的Apache服务器的设计与设计6喜欢就下吧...