本帖最后由 低调的菜鸡 于 2021-3-19 10:16 编辑
前言
过年被论坛上的破解题难住了,突然意识到自己的逆向功底还有待提高,一气之下刷了几道CTF水题用来找感觉。其中发现一道特别有意思的逆向题,给大家稍稍分享。
操作系统:win10
逆向工具:010editor,ida pro7.0(随便哪个版本都能用)
一、题目
CTF一般都是要寻找到一串乱七八糟的代码,类似于flag{xxxxxxxxxx}什么的,本题也不例外,下面是官网的一个下载界面。
没错,这是一个很皮的人写的题目。放张图片在这里让大家感受一下。
二、开搞开搞
2.0 下载文件
下载下来的文件就长这样,看起来并不是很漂亮,连图标都没有。。
2.1 收集文件信息
-
使用010editor查看文件类型
啪一下很快啊,我们打开了这个文件,我一看,哎,这是一个ELF文件,哦,原来是linux下的文件,来偷袭我一个windows程序逆向老同志(由于笔者并没有配置linux调试环境,所以只能静态分析)
-
确定是否需要脱壳
一般linux下的文件最多加个UPX壳,我们直接搜索UPX字符串,啊,搜不到,感觉没加。
-
看一看能否找到明码的flag
由于是做的ctf题,所以我们直接搜一下flag字符串,看看静态文件中是否存在,好吧,很明显不存在
2.2 明确分析思路
这里我们用的是静态分析
- 寻找输入
- 寻找关键字符串
- 定位关键验证逻辑
- 分析关键验证逻辑,理清思路
- 模拟运行或直接调试(没有搭环境,pass)运行得到flag
2.3 详细分析
-
将这一坨东西拖入IDA(此时我们可以喝个茶?等它慢慢跑完)
加载完成后,我们可以看到IDA解析出来的函数,它还很贴心的帮我们分析出了main函数。
-
双击进入main函数,看到如下一堆函数逻辑。
哎~,看起来似乎作者并没有为难我们,所有功能都放main函数中的,我们甚至还找到了一些注册成功的输出。
有些玩破解的小伙伴就要问了,接下来是不是直接改跳转,让他跳转到Congratulations?当然不是啦!大家走错片场啦,这里是逆向哦。所谓逆向,就是要分析出写程序人的意图,然后让他明白,不管你怎么搞,我都能给你还原成原始代码,并搞你的心态,直接写注册码。接下来,就让我们一起走进这个开发者逗逼的内心世界吧。
-
辅助工具,On!
由于该程序笔者并不想动态调试,加上程序逻辑清晰,并没有加一些花里胡哨的东西(例如花指令),这里就使用了IDA的灵魂,F5,一键还原伪代码。
我们在main函数中直接F5,就能看到这段逻辑的伪码啦。
好的,有些长得帅的小伙伴们就要问了,这个是个甚摸神器啊,为什么这些代码我还是看不懂呢?就只有几个成功失败字符串,我们的flag呢?别急,我们将一起一步一步走进作者阴暗的心里世界。
-
修改伪码
首先,我们对代码进行小小的整容外加修改(一系列的变量替换,函数名称替换,变量格式更改),使其更加符合我们的编程习惯。
好的,经过亿点点(好吧,花了我20分钟)变量类型更改,变量命名以及函数命名,我们已经可以无压力的观看那段让我们感到头疼的伪代码了。(感兴趣的小伙伴可以下载文件下来慢慢修改伪码,看看是不是和我改的一样哟)
-
分析源码
可以看出,该代码是用我们输入nctf{xxxxx}(共24位)中的x来对内存中的x,y进行一系列的运算,用算完后的x,y在数组mazeBuffer中定位到一个值,如果这个值为#,则输出成功,否则输出失败
那我们看看mazeBuffer是一个什么东西呢?
双击mazeBuffer,我们看到它在数据段中的值
这样看起来并不直观,根据它的长度(64),以及最后的二维数组运算(mazeBuffer[8 * nPosY + nPosX]),我们可以大胆推断*它就是一个88 = 64大小的二维数组**。
在数据区域使用IDA的另一个小功能微调,首先按d转换为data模式,然后在标签名右键,array,选择如下设置
得到如下直观的二维数组
好吧,并不是很直观,我们再按一下r键,让它以ascii显示,这下直观了
兄弟们,激动人心的时候到了
为什么每一次操作,x,y都会变化呢?最后检查的为什么是#呢?x,y的初始值为什么是0,0呢?
答案如下:
这个mazeBuffer是一个游戏迷宫地图,我们之前分析出来的4个操作性字符(对x,y的值有影响的)Oo.0分别对应左右上下,也就是它会循环读取我们输入的操作性字符,然后让我们从上图的地图中虚拟移动,也就是改变我们的x,y坐标。(如果不明白x++,x--和左右的对应关系的,可以回想一下你们游戏辅助界面绘制的一些知识哟)。
综上,我们得到了这个flag的终极解法。构造一条能从(0,0)点到达#位置的路径,只能走上图的空白处。现在兄弟们知道怎么走了么?大概就是nctf{右下右右下下左下下下右右右右上上左左},数一数,刚好24个字,然后打开你们的文本编辑器,将上下左右替换成对应的编码(上 ==>. 下==>0 左==>O 右==>o)
至此,我们得到了我们最终的flag :nctf{o0oo00O000oooo..OO}
至于验证方面,由于笔者懒得装linux系统,把flag提交上去跑了跑,官网显示通过,说明咱们分析正确了。
现在,我们已经手把手的走完了整个旅途,是不是感觉ctf也不过如此呢?
2.4 总结
1. 不要有畏惧心理,再难的程序也有被破解的一天,任何系统的程序只要能被反编译,就能被分析(**在此强烈吐槽某平台,新手题windows的就见到1道,做完新手题都累死我了**)。
2. 要善于使用工具,很多功能IDA啊,OD啊,或者xdbg会给我们提供,工具玩的好,逆向也会更加省时省力
3. 不要局限于破解,分析算法才是逆向的灵魂所在,就像我们今天走完的这段旅途,风景不也很美好么
4.大佬们轻点喷。
三、附件
ELF文件与修改好的IDA文件:
MazeCtf.zip
(619.28 KB, 下载次数: 81)
解压密码:www.52pojie.cn
|