[2019红帽杯]easyRE

一道比较绕的题,第一次见这种题型,我决定为它单独写一篇wp。

程序无壳,拖进IDA先看字符串,上面有很显眼的一大串:

双击跟进,看上去像某种base加密的密文,直接进行base64解密, 但是解密结果还是密文,竟然是套娃...

最终结果是: 看雪论坛的一个帖子链接,好奇打开,发现是讲主动防御的一篇文章,和flag只能说半毛钱关系没有...

懵逼的评论区: 看来上当的不在少数...

发现线索:

交叉引用跟进所在函数,看到了很多似乎有用的代码:

这部分的加密函数很简单:

直接写出解密脚本: (PS:脚本一开始用c语言写的,但是无论代码怎么改解密结果看上去很怪。后来看了其他师傅的wp都是python写脚本,以后得多用python了,c语言出错原因很迷) 顺便,看wp得到一些提示:

1. memset的后面一般都会跟上scanf或者read函数
2. 有些时候连续创建的几个数组可能是同一个数组,可以查看地址进行核验(如上文的v12 v13 v14,第一次见我还懵逼了会儿)
这里v12的数组大小是13,而v14和它的距离也正好是13,说明它们的地址是连在一起的,v14同理。也就是说得到了v12的基地址,也就可以控制v12/13/14。至于那个127,在子串中可以表示为分隔符,但在这个地方直接写作”\x7F”就行了。

言归正传,得到一段莫名其妙的提示(后面用得上):

而这部分代码,

sub_400E44 函数双击进去发现是 base64 加密,大概率和最开始的帖子链接的那一长段密文有关系,所以这压根就是个干扰函数,头一次见。

现在没思路了,双击 off_6CC090 想找点线索,结果真给我找到了:

byte_6CC0A0 开始有一些字符,交叉引用跟进看函数,

注意line20,102和103代指的字符分别是f和g(HIBYTE,最高位),根据上面得到的提示,猜测和flag这个词有点关系。下面循环里数组成员是从0到24共25个,结合上面看到的 byte_6CC0A0 开始的字符,正好25位。v1和v4数组相同,根据line23,v1的元素和byte_6CC0A0的元素进行循环异或可以得到明文,那么就得求v1的内容。根据两次异或等于没有的特性,用 byte_6CC0A0 前四位和明文“flag”进行异或得到v1为“&YA1”。

v1有了,现在只需把密文还原即可, flag的内容很有意思,“主动防御测试”,和开头作为干扰元素出现的帖子内容太贴切了。