逆向脱壳-fsg手动脱壳

本文以2020湖湘杯第二道逆向为例,原题为无壳的exe文件:exe程序链接:链接:https://pan.baidu.com/s/1PlfSOKKBTF8a7qL8dKwwNQ      提取码:cscj 

逆向脱壳-fsg手动脱壳_第1张图片

首先对文件easyre.exe进行fsg加壳,加壳版本为fsg2.0:工具链接为:链接:https://pan.baidu.com/s/1YKXVfvHXiEnaKgAQUzTlAw       提取码:6zt3 

对加完fsg壳之后的程序进行查壳,显示为:

逆向脱壳-fsg手动脱壳_第2张图片

可以看出有许多地方发生了改变,最重要的就在于程序入口的改变,大家都知道fsg为压缩壳,原理就在于在程序原OEP之前或在程序之后加上一段数据,使得程序调用是通过压缩段数据进行转发的,不影响程序的正常运行。首先将压缩后的程序进行OD载入:

逆向脱壳-fsg手动脱壳_第3张图片

在载入之后一路F8单步步过运行,当遇到如上图所示,向上跳转的情况时,在跳转的下一跳汇编指令,F4执行到目标指令处,继续F8运行,直到:

逆向脱壳-fsg手动脱壳_第4张图片

当运行在如图所示处时,发现,通过第2条jmp指令完成了无条件循环,而在第1条jmp指令处,之前存在jnz指令,实现有条件跳转,这时,就可以判定,第一条jmp指令跳转后的地址就是原程序的OEP,所有,在该处下一个断点,F9执行到这里,之后,F7/F8单步执行就会跳转到正常程序的OEP处,进入发现OD将原程序的汇编代码转换成为了数据进行显示,接下来将数据转换为代码,鼠标右键->分析->分析代码,结果为:

逆向脱壳-fsg手动脱壳_第5张图片

找到正常的OEP后·,使用LordPE工具,工具链接为:链接:https://pan.baidu.com/s/1ZVoMzTPnatTLYl4OVzNK1A      提取码:brtg 

将正在运行的程序DUMP下来,操作为:

逆向脱壳-fsg手动脱壳_第6张图片

首先,纠正镜像文件的大小,接下来完全脱壳,执行dump下的程序,显示为:

逆向脱壳-fsg手动脱壳_第7张图片

出现这样的原因在于,程序dump时,没有将原程序的IAT进行正确一起dump下来,接下来进行IAT修复,使用工具ImportREC,工具地址为:链接:https://pan.baidu.com/s/1spm8-9FTnKN-dwPSxmk9Qg    提取码:29q1 

加载OD运行时弹出的exe进程信息,并进入OD中在原OEP处点击鼠标右键->用OllyDump脱壳调试程序中复制入口点修改地址:

逆向脱壳-fsg手动脱壳_第8张图片

将地址放入ImportREC工具中去,如图所示:

逆向脱壳-fsg手动脱壳_第9张图片

将入口地址放入1处,点击2  IAT自动搜索,点击确定,再点击获取导入表,再点击显示无效的,如果有,则将无效的进行删除,没有则进行点击修正转储到之前dump下来的程序中去。

逆向脱壳-fsg手动脱壳_第10张图片

在这里如果原程序中IAT只有一个DLL,程序就能正常运行,反之,则不能正常运行,原因是,正常情况下,每一个DLL结束时是以00000000结尾,但是在fsg壳中,IAT的DLL以7FFFFFFF结尾,导致ImportREC不能正确的识别出多个DLL,导致不能正确查找出完整的DLL,所以要手动进行修改,进入OD中原OEP出,发现程序call了一些函数,跟踪地址在地址栏处查看:

逆向脱壳-fsg手动脱壳_第11张图片

接着跟踪40F140找到,程序在内存中还原的IAT:

逆向脱壳-fsg手动脱壳_第12张图片

全部改好后用ImportREC再次进行IAT修复,得到出图所示:

逆向脱壳-fsg手动脱壳_第13张图片

现在,运行dump出的exe程序,就能正常运行:

逆向脱壳-fsg手动脱壳_第14张图片

结束!!!

你可能感兴趣的:(脱壳,Re,反汇编)