平台WP · 2021年9月26日 0

不简单的壁纸

首先打开图片简单浏览,没发现可疑的东西,那么扔进010瞅一眼,发现提示

这题使用了rabbit加密

仔细观察,又发现很多不符合png图片的信息,扔foremost看看,得到一个exe文件,打开后没什么有用的信息。

逆向分析一下这个exe文件

首先确认文件信息为64位无壳程序。

img

使用64位ida打开,按f5开始分析伪代码

img

逆向分析中可以倒着读函数,很多时候会比较省力。
倒着看是一个if判断,判断条件时fun2(v5)的返回值,当返回值非零的时候程序会输出“恭喜...”,否则输出“很遗憾...”,所以我们需要判断的就是v5为何值时fun2能够返回非零结果,双击fun2进入fun2分析

img

根据ida版本不同分析结果也可能不一样,如果v4,v5,v6的分析结果不是字符串而是一串数字就辅助ida分析一下,按快捷键“a”使ida以字符串格式分析该数据。

Strcpy函数的功能是将第二个参数的字符串值赋值给第一个参数,如果记不清可以去网上百度一下。
所以前三个函数将三个字符串的值赋值给了v4,v5,v6。

继续往下看,v9 = v6,在最上面的变量声明中声明了v9是个字符串指针

img

所以,这句的意思是使v9指针指向v6。然后后面给v8,v7初始化为0。

下面进入了重点,关键的while循环,在整个循环中,判断循环是否进行的条件是v8,而他在每轮循环中也会+1,很显然v8就是循环变量,也就是我们平时写循环时常用的变量i。

img

继续阅读代码,当i等于20时,v9会指向v5,也就是第二个字符串。当i等于38时,v9指向v4,也就是第三个字符串。

看完了if之后继续看下面的代码。新出现了一个变量v,他的值被赋为了a1[v8],a1是fun2这个函数接收的参数,也就是在main中看到的v5,注意是main函数里的v5,不是fun2里的v5。

img

然后 v2的值等于v7++,v7的初始值是0,也没有其他的赋值操作,所以这个v7也是一个循环变量,相当于平时写代码用的j。

最后有一个判断,如果v1的值不等于v9[v2],就返回0。前面在main函数中分析过了,我们需要函数返回非0值,所以v1的值会一直等于v9[v2]。那么v1的值在这个循环中是什么呢?是传入的v5。

v9的值呢?前面也分析出来了,v9在循环次数i小于等于20时指向v6字符串,在i大于20小于等于38时指向v5字符串,在i大于38时指向v4字符串。

而v1的值应该在每一次循环中都和v9[v2]相等,所以v1的前20个字符就是v6,20到38则是v5,最后38个以后的字符是v4。

现在我们得到了v1的值,因为v1的值是由a1赋予的。所以我们也得到了a1的值,而a1的值是从main函数传入的v5。于是我们也得到了main函数中v5的值。将字符串拼接一下

V5 = “Z,KmiA[e]+=n|fgFM`H?MKiBWM{dO*wewrWs0=uLxK_-X0jTFgQo”

到此函数fun2就分析结束了,继续回去看main函数

img

V5 是fun(v4)函数的返回值,v4的值是flag,所以只要通过v5逆推出v4就能拿到flag了

img

只有一个for循环,显然是依次对每一个字符进行了加密,执行完之后得到了v5。

分析一下这个for的逻辑,里面首先是个判断判断条件是i&1是否为0,该式子等价于

i%2 != 0。

看完判断条件去看d函数和a函数干了啥

imgimg

d给传入的a1[i]减了6,a给传入的a1[i]加了5

所以整个fun的逻辑就是判断i是不是2的倍数,如果是,就给a1[i]的值+5,如果不是,就给a1[i]的值减6。执行完之后得到的数组值为v5。

我们已知v5,所以我们只需要给程序执行流程反过来,就可以得到输入的v4。

也就是说,我们给a1数组的值赋值为v5字符串,然后也加一个判断,如果是2的倍数,就减5,如果不是2的倍数,就加6。

所以可以写出脚本如下

img

执行后得到

U2FsdGVkX18twlbLHfCEHQdHRSvjJ0rkrxRy+CpRsQZ3S6eZAmLu


但这明显不是flag,前面有提示这个是rabbit加密,尝试解密后发现无法解密,缺少密码,那么哪里还可以隐藏信息呢,只有一张图,返回去再看图片,修改高度,发现右下角key:nynu。输入密码再解密,得到flag:nynu{e45y_mi5c_e4sy_re}