蓝帽杯初赛逆向LOADER复现
分析
首先一进来直接开幕雷击
可以看到加载了一个程序在里面,点进unk可以发现MZ开头的数据,直接猜想里面有一个程序。当时第一反应是dump程序出来,但是发现dump出来的东西运行不了,于是直接放弃了。后来经过wjh大佬指点,可以直接动调。于是直接开调
动调这个也可以讲一点,基本上程序进行输入输出的地方肯定是关键函数。这个题要找到关键函数的话,键盘上先多按f8,注意call哪个函数之后程序输出东西了,那么打个断点,然后重新开始程序再f9到这个地方f7进这个call,这样反复,肯定能快速找到主要函数。
例如这边就找到main_0了,然后下面几个call其实点进去看一下就差不多知道了,其实主函数在这里(可以熟练用快捷键n去改一下这些函数名,方便识别。)
那么调到这里之后,可以继续往下走,发现下面一个就是输入数据,这个时候可以点进函数返回的数据下去看一下,可以看到这其实是一个结构体,我们可以选择进入structures创建一个结构体。当然也可以不创建。
这边这一块,点进数据看一下,可以发现其实是检测前五位是不是flag{
同理在这边也可以发现是flag格式的检验,同时可以知道flag总长度是42
利用同样的方法,可以很快的知道下面的循环在做的事情,也就是提取flag{}括号内前十八位数据放入v13
同理也可以得到下面这个函数的作用,就是把字符串变成int值。(听说可以对照着字符串去nim-lang的源码搜,长知识了)
接下来是几个关键的函数,同样可以通过对数据的观察,猜测函数做的事情。例如calculate这个,最开始我是不知道他是干嘛的,因为不像之前的str2int,这个出来之后是一堆奇怪的数字。
但是能知道的就是他对v28和v27两个这两个变量(实际存放的是输入flag的前十八位的数字)做了什么操作然后给了v31。那么传入两个数字的话,应该是进行了一系列运算。
那么可以先拿出v31的数据,与前十八位的数据进行对比。最后我们可以发现其实这个函数是拿前两个参数相乘,给到第三个参数里面。假如还是说不清楚是干嘛的,可以去源码搜一搜,可以发现是运算的函数,基本上猜一下也就出来了。
同理,有好几个乘法,还有一个减法
最后这里是一个check,动调可以在上面直接拿到密文9
于是我们最后可以得出一个式子
$$
inp1^2-11*(inp2^2)=9
$$
同时数字需要为18位数也就是100000000000000000<inp1<999999999999999999
解答
我们把式子直接拿到网站上面可以解出来结果
拼接起来发现会少一位,发现y只有17位,那么加个-或者前面加个0应该都行。
补充
观察到别的师傅的wp里面的x是有一个确切的范围的,应该是前面这一部分判定了x的范围。
总结
比赛的时候去看取证了,re没做,实际复现起来的话,应该是花了挺久的,可能有三四个小时(还是在看了一点wp,知道是解方程之后才完成的。)不过比赛的时候,可能不会这么顺利,因为会想着把东西dump出来,或者是卡在加减乘除的识别上面。还是做题少了
感谢分享,赞一个