【Reverse_Win】SQCTF 2015 Reverse 250

大神做题目从来都喜欢炫技,把大神手脱壳(就是一个ESP而已233)的小题目整理一下发上来,自动过滤所有炫(dou)技(bi)部分~

ps 大神现在做题都国际化了233

ps2 以后可能转Linux了,做windows被嫌弃【捂脸】

来源: Securinets Quals CTF 2015

题目:找到程序中的flag

类型: Reverse

分数: 250

难度:中(难中易三个级别)

描述:

Hint : Find the serial (Trouvez le céréale)

题目链接:

https://github.com/ctfs/write-ups-2015/tree/master/securinets-ctf-2015/crack/reverse

答案: BZ9dmq4c8g9G7bAY

 

 

解题思路:

这里只给了一个rev文件,那就先看看文件类型,看来exe后缀被去掉了

放到peid里面看看

【Reverse_Win】SQCTF 2015 Reverse 250

这里虽然查出了壳,但是到网上找了个软件根本脱不了,没办法,手脱。OD载入,可以看到pushad指令,这是大多数带壳程序都会用的指令

【Reverse_Win】SQCTF 2015 Reverse 250

这里我们用esp定律来确定入口点,f8执行pushad指令,此时的esp变成了0012ffa4,跟踪到堆栈,在这里下个硬件断点,这里不能下内存断点,因为内存断点会被程序检测出来

【Reverse_Win】SQCTF 2015 Reverse 250

下完断点直接运行,程序果断停在了0041416处,上一条指令就是popad指令,程序已经解压完成,OEP已经不远

【Reverse_Win】SQCTF 2015 Reverse 250

执行玩return我们就可以到达OEP

往下翻一翻,我们可以看到call GetCommandLineA,通过它我们可以找到IDA表

这里就是整个IAT表(起点和终点均已标出)

【Reverse_Win】SQCTF 2015 Reverse 250

现在先把程序dump下来

%%%%%%%过滤了用不到的部分(=%%%%%%%%%%%%

重新用OD载入,我们可以看到程序已经脱壳成功

既然已经脱壳成功,索性直接用IDA6.6来进行分析,点击start函数,按F5,点开sub_401000(不难看出,这里就是main函数)

【Reverse_Win】SQCTF 2015 Reverse 250

点开DialogFunc函数

经过分析,我们可以得出下图(其中serial表示序列号的第一个字符,s1到是5依次表示序列号的第2个到第15个字符),到达这里我们就算是快要大工告成了,我们所需要做的就是人工进行序列号的拼装。

拼装结果如为BZ9dmq4c8g9G7bAY

【Reverse_Win】SQCTF 2015 Reverse 250

好吧,运行程序测试一下

【Reverse_Win】SQCTF 2015 Reverse 250

 

 

过滤部分如下,虽然用不着,但是了解PE结构和为了后面手脱更复杂的壳还是用得到的。

 

【Reverse_Win】SQCTF 2015 Reverse 250

这里需要注意的是去掉重建输入表的勾选,然后点脱壳并指定文件名即可

【Reverse_Win】SQCTF 2015 Reverse 250

然后打开import RECconstructor,attach到被调试进程

【Reverse_Win】SQCTF 2015 Reverse 250

这里重新看一下IAT表

【Reverse_Win】SQCTF 2015 Reverse 250

可以得出OPE = 0x4016bb - 0x0400000(段地址) = 0x16bb

RVA = 0x40c000 - 0x400000 = 0xc000

Size = 0x40c110 - 0x400000 = 0x110

接下来点击import我们可以在import function found中找到IAT中的函数,最后点击fix dump并选择我们刚刚dump下来的文件就可以了

【Reverse_Win】SQCTF 2015 Reverse 250

你可能感兴趣的:(in)