标签:
大神做题目从来都喜欢炫技,把大神手脱壳(就是一个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
?
?
解题思路:
这里只给了一个rev文件,那就先看看文件类型,看来exe后缀被去掉了
放到peid里面看看
这里虽然查出了壳,但是到网上找了个软件根本脱不了,没办法,手脱。OD载入,可以看到pushad指令,这是大多数带壳程序都会用的指令
这里我们用esp定律来确定入口点,f8执行pushad指令,此时的esp变成了0012ffa4,跟踪到堆栈,在这里下个硬件断点,这里不能下内存断点,因为内存断点会被程序检测出来
下完断点直接运行,程序果断停在了0041416处,上一条指令就是popad指令,程序已经解压完成,OEP已经不远
执行玩return我们就可以到达OEP
往下翻一翻,我们可以看到call GetCommandLineA,通过它我们可以找到IDA表
这里就是整个IAT表(起点和终点均已标出)
现在先把程序dump下来
%%%%%%%过滤了用不到的部分(=%%%%%%%%%%%%
重新用OD载入,我们可以看到程序已经脱壳成功
既然已经脱壳成功,索性直接用IDA6.6来进行分析,点击start函数,按F5,点开sub_401000(不难看出,这里就是main函数)
点开DialogFunc函数
经过分析,我们可以得出下图(其中serial表示序列号的第一个字符,s1到是5依次表示序列号的第2个到第15个字符),到达这里我们就算是快要大工告成了,我们所需要做的就是人工进行序列号的拼装。
拼装结果如为BZ9dmq4c8g9G7bAY
好吧,运行程序测试一下
?
?
过滤部分如下,虽然用不着,但是了解PE结构和为了后面手脱更复杂的壳还是用得到的。
?
这里需要注意的是去掉重建输入表的勾选,然后点脱壳并指定文件名即可
然后打开import RECconstructor,attach到被调试进程
这里重新看一下IAT表
可以得出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
标签:
原文地址:http://www.cnblogs.com/windcarp/p/4457509.html