【CTF】Reverse LOADER pell方程 nim-lang 蓝帽杯 逆向学习

CTF · 2022-07-11 · 2333 人浏览

蓝帽杯初赛逆向LOADER复现

分析

首先一进来直接开幕雷击

image-20220711174310559

可以看到加载了一个程序在里面,点进unk可以发现MZ开头的数据,直接猜想里面有一个程序。当时第一反应是dump程序出来,但是发现dump出来的东西运行不了,于是直接放弃了。后来经过wjh大佬指点,可以直接动调。于是直接开调

动调这个也可以讲一点,基本上程序进行输入输出的地方肯定是关键函数。这个题要找到关键函数的话,键盘上先多按f8,注意call哪个函数之后程序输出东西了,那么打个断点,然后重新开始程序再f9到这个地方f7进这个call,这样反复,肯定能快速找到主要函数。

image-20220711182948682

例如这边就找到main_0了,然后下面几个call其实点进去看一下就差不多知道了,其实主函数在这里(可以熟练用快捷键n去改一下这些函数名,方便识别。)

image-20220711183137866

那么调到这里之后,可以继续往下走,发现下面一个就是输入数据,这个时候可以点进函数返回的数据下去看一下,可以看到这其实是一个结构体,我们可以选择进入structures创建一个结构体。当然也可以不创建。

image-20220711183432128

这边这一块,点进数据看一下,可以发现其实是检测前五位是不是flag{

image-20220711185006778

同理在这边也可以发现是flag格式的检验,同时可以知道flag总长度是42

image-20220711185130813

利用同样的方法,可以很快的知道下面的循环在做的事情,也就是提取flag{}括号内前十八位数据放入v13

image-20220711185316759

同理也可以得到下面这个函数的作用,就是把字符串变成int值。(听说可以对照着字符串去nim-lang的源码搜,长知识了)

image-20220711200300342

接下来是几个关键的函数,同样可以通过对数据的观察,猜测函数做的事情。例如calculate这个,最开始我是不知道他是干嘛的,因为不像之前的str2int,这个出来之后是一堆奇怪的数字。

但是能知道的就是他对v28和v27两个这两个变量(实际存放的是输入flag的前十八位的数字)做了什么操作然后给了v31。那么传入两个数字的话,应该是进行了一系列运算。

那么可以先拿出v31的数据,与前十八位的数据进行对比。最后我们可以发现其实这个函数是拿前两个参数相乘,给到第三个参数里面。假如还是说不清楚是干嘛的,可以去源码搜一搜,可以发现是运算的函数,基本上猜一下也就出来了。

image-20220711200505953

同理,有好几个乘法,还有一个减法

image-20220711203042109

最后这里是一个check,动调可以在上面直接拿到密文9

image-20220711203119883

于是我们最后可以得出一个式子

$$ inp1^2-11*(inp2^2)=9 $$

同时数字需要为18位数也就是100000000000000000<inp1<999999999999999999

解答

我们把式子直接拿到网站上面可以解出来结果

image-20220711203500459

拼接起来发现会少一位,发现y只有17位,那么加个-或者前面加个0应该都行。

补充

观察到别的师傅的wp里面的x是有一个确切的范围的,应该是前面这一部分判定了x的范围。

image-20220711203807347

总结

比赛的时候去看取证了,re没做,实际复现起来的话,应该是花了挺久的,可能有三四个小时(还是在看了一点wp,知道是解方程之后才完成的。)不过比赛的时候,可能不会这么顺利,因为会想着把东西dump出来,或者是卡在加减乘除的识别上面。还是做题少了

RE
  1. 匿名用户 2022-07-29

    感谢分享,赞一个

  2. 小迷妹 2022-07-11
    牛哇
Theme Jasmine by Kent Liao