目录 Table of Contents
基础脱壳教程4:手脱FSG壳
方法很多, 单步法或者 ESP 定律法都可以
这里我们用单步跟踪
单步发现一个连续的跳转, 然后发现一个无条件跳转 jmp
一般作者防止自己软件被脱壳, 会把 OEP 地址存放在寄存器中, 本例中是在 [ebx+C]
FSG 2.0 -> bart/xt
重点为修复
修复步骤是 : LordPE 修正镜像大小, 完整转存
然后 ImportREC 输入 OEP A86D, 然后获取 IAT, 获取输入表, 只有一个函数, 无无效函数, 修复转存文件 fix dump
查壳发现壳已经脱掉了, 是 VC++ 程序, 然后发现无法运行
我们来手动查找 IAT
视频中随便找了一个 call dword ptr ds:[425210]
, 这里也可以找其他函数, 不过要注意找的是程序的函数而不是系统的函数
减去基址 00400000 就是 25210, 我们在 ImportREC 显示出的函数中找一下这个
找到这个之后发现是个 getVersion, 与 OD 中显示的是一致的
然后我们在 OD 命令行中输入 d 425210
然后 OD 在数据窗口 (左下角) 列出了一大堆指针
CTF wiki 中给了一种操作更加简单的方法 :
在 OEP 处右键查找
>所有模块间的调用
, 显示出调用的函数列表,
我们双击其中的某个函数 (注意这里要双击的应该是程序的函数而不是系统函数) ,
然后右键跟随
, 进入函数, 然后右键 数据窗口中跟随->内存地址
,
这里因为显示是十六进制值, 不方便查看, 我们可以在数据窗口点击右键选择长型->地址
, 就可以显示函数名.
现在我们用鼠标向上拉
拉到第一个 00000000 为止, 也就是 IAT 表的起始位置
然后记下 000000 下面那个不为零的地址 00425000 77DA6BF0 ADVAPI32.RegCloseKey
然后向下拉, 找到最后一个函数, 记下地址 00425280 7C838DE8 kernel32.LCMapStringA
ImportREC 重新载入一下, RVA
也即是起始地址
这里我们写 00425000 减去基址, 也就是 25000
IAT 大小
就是 00425280 - 00425000 = 280,
当然, 我们可以直接在大小
这里输入 1000(不过会带来很多垃圾指针),
从第一个函数拖到最后一个函数, OD 下方会显示块大小0x280
然后获取输入表
, 直接把无效函数删掉就好, 然后就是 转存到文件
了 (视频里是修复转存文件
, 也就是Fix dump
)
程序运行成功 ~
特殊的 ESP 定律法, 或者说是 FSG2.0 这种壳专用的 ESP 定律法
单步跳到0040015B 94 xchg eax,esp ; qqspirit.0047A208
看右下角的堆栈窗口, 从上看到下第四个就是 0040A486D, 就是刚才我们找到的 OEP
然后我们右键, 选择在反汇编窗口中跟随
, 记得删除分析, 出现这种空代码0040A86D 0000 add byte ptr ds:[eax],al
不用怕, 在这里下断点, 右键断点
>设置硬件执行断点
, 然后 shift+F9 运行直接跳到 OEP