前言
"36967934_一、题目">一、题目
"https://attach.52pojie.cn/forum/202102/19/221744ntv8hwnhtmmomh8h.png" file="https://attach.52pojie.cn/forum/202102/19/221744ntv8hwnhtmmomh8h.png" class="zoom" onclick="zoom(this, this.src, 0, 0, 0)" width="1080" id="aimg_2212404" inpost="1" />
image-20210219180026397.png
1
没错,这是一个很皮的人写的题目。放张图片在这里让大家感受一下。
二、开搞开搞
2.0 下载文件
下载下来的文件就长这样,看起来并不是很漂亮,连图标都没有。。
image-20210219180522629.png
2.1 收集文件信息
使用010editor查看文件类型
image-20210219180940473.png
啪一下很快啊,我们打开了这个文件,我一看,哎,这是一个ELF文件,哦,原来是linux下的文件,来偷袭我一个windows程序逆向老同志(由于笔者并没有配置linux调试环境,所以只能静态分析)
确定是否需要脱壳
一般linux下的文件最多加个UPX壳,我们直接搜索UPX字符串,啊,搜不到,感觉没加。
image-20210219181043464.png
看一看能否找到明码的flag
由于是做的ctf题,所以我们直接搜一下flag字符串,看看静态文件中是否存在,好吧,很明显不存在
image-20210219181138831.png
2.2 明确分析思路
这里我们用的是静态分析
- 寻找输入
- 寻找关键字符串
- 定位关键验证逻辑
- 分析关键验证逻辑,理清思路
- 模拟运行或直接调试(没有搭环境,pass)运行得到flag
2.3 详细分析
将这一坨东西拖入IDA(此时我们可以喝个茶?等它慢慢跑完)
加载完成后,我们可以看到IDA解析出来的函数,它还很贴心的帮我们分析出了main函数。
image-20210219182056309.png
7
双击进入main函数,看到如下一堆函数逻辑。
image-20210219182241359.png
哎~,看起来似乎作者并没有为难我们,所有功能都放main函数中的,我们甚至还找到了一些注册成功的输出。
image-20210219182331855.png
9
有些玩破解的小伙伴就要问了,接下来是不是直接改跳转,让他跳转到Congratulations?当然不是啦!大家走错片场啦,这里是逆向哦。所谓逆向,就是要分析出写程序人的意图,然后让他明白,不管你怎么搞,我都能给你还原成原始代码,并搞你的心态,直接写注册码。接下来,就让我们一起走进这个开发者逗逼的内心世界吧。
辅助工具,On!
由于该程序笔者并不想动态调试,加上程序逻辑清晰,并没有加一些花里胡哨的东西(例如花指令),这里就使用了IDA的灵魂,F5,一键还原伪代码。
我们在main函数中直接F5,就能看到这段逻辑的伪码啦。
image-20210219200843118.png
10
image-20210219200950816.png
image-20210219201038933.png
好的,有些长得帅的小伙伴们就要问了,这个是个甚摸神器啊,为什么这些代码我还是看不懂呢?就只有几个成功失败字符串,我们的flag呢?别急,我们将一起一步一步走进作者阴暗的心里世界。
修改伪码
首先,我们对代码进行小小的整容外加修改(一系列的变量替换,函数名称替换,变量格式更改),使其更加符合我们的编程习惯。
image-20210219213838160.png
13
image-20210219213904947.png
14
image-20210219213958032.png
"https://attach.52pojie.cn/forum/202102/19/221936vrr0z6un0rgxx9u6.png" file="https://attach.52pojie.cn/forum/202102/19/221936vrr0z6un0rgxx9u6.png" class="zoom" onclick="zoom(this, this.src, 0, 0, 0)" width="1037" id="aimg_2212419" inpost="1" />
image-20210219214551764.png
16
这样看起来并不直观,根据它的长度(64),以及最后的二维数组运算(mazeBuffer[8 * nPosY + nPosX]),我们可以大胆推断*它就是一个88 = 64大小的二维数组**。
在数据区域使用IDA的另一个小功能微调,首先按d转换为data模式,然后在标签名右键,array,选择如下设置
image-20210219215451888.png
17
得到如下直观的二维数组
image-20210219215506831.png
好吧,并不是很直观,我们再按一下r键,让它以ascii显示,这下直观了
image-20210219215554719.png
19
兄弟们,激动人心的时候到了
为什么每一次操作,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.zip2021-2-19 22:22 上传点击文件名下载附件附件下载积分: 吾爱币 -1 CB
解压密码:www.52pojie.cn