Merak::CTF 万物起源 赛场WP

iPlayIDA WP

首先下载附件查壳


没有壳,64位,直接上ida64打开
直奔main函数,发现里面是一个经典的输入flag判断对错的流程。然后我们分析其代码。
注意到最终判断flag是否正确的核心是v6和v7是否相等,v7已知,所以我们将主要目光投在算出v6的函数sub_13F6(s)上
该函数核心思想是将传入的flag->a1,每连续三个(0-2,3-5)合并成一个24位int,再重新分成4个6位的int,
分别作为索引(下标)于aAbcdefghijklmn数组中找到对应的值存储于v12中返回


如果觉得难以理解也可以看我自己写的简化代码如下:
知道了原理以后我们就可以反过来逆向啦,
于是乎我写了这样一个代码根据v7来逆向求解flag,此时不到11点半,开赛不到2个小时,但最终我到12点半才提交,并且上图中有这么多调试代码,这是为啥呢?因为我算出的flag没有一个是可读字符,全是乱码,我以为是自己写的代码的问题,于是一直调,最后才发现原来原文中有陷阱。
尽管aAbc数组在最初就有赋值,但除了它以外所有的变量全是局部的,要么是函数内定义的,要么是引用时传入的,唯有这个数组是全局的,那么有没有一种可能,这个数组在main函数开始前就有被修改过呢?
于是我考虑查询这个数组的其他出现位置,于是。。。


我找到了另一个包含它的函数,里面将这个数组每个数都和不同数组异或了一遍
虽然不知道这个函数啥时候运行的,运行了几遍(我是新手,不知道咋查,学长教教我),但如果它不在main前面,我就算不出一个正确的flag,于是我假定它在main前运行过1次给aAbc数组初始化。于是在自己的求解代码中将这一段代码照葫芦画瓢ctrlC+V了一遍。果真成功求解出了flag。


Pinball WP
啊啊啊啊,分不够分不够,趁着提示再做一题,刚上手游戏,打了两节历史课,但是用ce怎么都找不到数据(我是铸币,没发现这个玩意是个压缩包,上网查Unity逆向,发现人家的都是文件夹就我的是个exe才发现,明明之前扫出来了RAR的)
我们直接改后缀名为rar,然后解压,就是一个正常的Unity游戏文件夹啦
直接用ida打开exe发现找不到有用信息,了解Unity逆向后才知道原来不能这么看
根据教程,找到Pin_ball/Pinball_Data/Managed/Assembly-CSharp.dll
一般而言Unity的底层C#是在这里看的,然后使用dnSpy打开它


感觉ball和游戏关系不大,游戏胜利条件应该在Game()类里,进去找找


果然找到了pointsToWin,本来是80万多的,我这里已经修改过了,然后就是编辑,改成1,保存,打开游戏,拼命从AI手中拿1分,就得到flag啦。


iPlayCalc WP
初下载下来是一个exe,先查壳
是个upx,然后懵懂无知的我直接上upx解压,然后寄了
遇事不决上网查,得知可能是被修改过导致UPX解压不了,同时用010打开一个正常的和这个玩意(右侧正常,左侧报错),发现UPX标识被更改,我们改回去再解压。


结果是不好的,依然解压不了,没事再探,最终用OllyDbg的这个脚本给它硬解了出来


然后我直接IDA打开,找到main函数,虽然不像解压前那样混淆了,但依然意义不明
然后不会做了,没看懂文章。先跳过。。。


iPlayApple
没有苹果,只能做尝试
后缀改成.zip打开


把这些全都打开查看可疑字符串,
值得注意的有password part1和part2
以及一些flag字样

posted @ 2024-09-29 18:27  Woxuany1  阅读(14)  评论(2编辑  收藏  举报