其他分享
首页 > 其他分享> > 逆向脱壳实训 #2 手脱FSG及寻找IAT

逆向脱壳实训 #2 手脱FSG及寻找IAT

作者:互联网

逆向脱壳实训 #2 手脱FSG及寻找IAT

文章目录


之前的ASPACK和NSPACK跟UPX脱起来差不多,就没有再写文章记录

但FSG相对前三者无论是在脱壳上还是在修复上都有了不小的差别,所以记录下手脱的经验

环境 & 工具

脱壳

单步跟踪

同理,高地址跳转步进,低地址跳转跳过,注意无条件跳转长距离跳转

查壳

image-20211230093001703

OEP寻找

前期一路单步至此

image-20211230093304680

尝试跳过向上跳转

image-20211230093528995

程序进入运行态,说明主程序已经运行,说明跟踪程序入口点跟丢了:-(

image-20211230093801439

但是全程没有长距离跳转,说明程序的入口点应该在这个向上跳转的前面

那么0x4001D1处的无条件跳转有着最大的嫌疑

将断点设到0x4001D1处,直接运行至此处,随后f8跟进跳转

image-20211230151922166

发现此处正是一个长距离无条件跳转,跟进后到达OEP

image-20211230152521746
IAT校准

IAT(Import Address Table)即导入地址表,当程序需要调用系统dll(动态链接库)中的函数时(如CreateProcess等API),直接调用内存中的函数指针表IAT特定项,而函数指针表中保存的正是对应函数的入口地址

之所以需要进行如此转折而非直接在程序之中保存函数入口地址,是因为如果装载在内存中的dll位置一旦发生变化*(既然都叫dynamic link library了,动态一点也很正常吧 [doge])*,需要更改所有程序的对应函数入口跳转地址。而使用跳转后,当dll位置发生变化时,操作系统根据所指数据段中的字符串把表中的指针转换成函数新入口地址即可,极大的增加了dll的复用性使用效率

所以先看看ImportREC中自动获取的IAT大致位置

image-20211230161327360

在尝试使用自动获取的IAT地址修复程序后,发现该完整转存的镜像文件无法正常运行,所以只好手动找IAT的RVA(Relative Virtual Addresses)

image-20220101104532451

已知IAT的整体位置大概在0x250XX的位置,且当程序在使用表中函数时会直接call IAT某地址,所以先在程序中找到一个形式如call 0x250xx的语句

image-20211231000014608

在命令行中输入d 425210,然后就可以在数据窗口看见地址0x4025210的内容

image-20220101095139802

将数据窗口一直向上滚动直到出现空内容,空内容下方的第一项的地址即为RVA

image-20220101102706292

再一直向下滚动,最后一项与kernel有关的值减去RVA的值即为IAT的大小

image-20220101102954887

所以该程序的RVA地址0x425000,大小0x280

把RVA和大小填入

image-20220101104628652

与自动寻找的IAT对比

image-20220101104719401

其实还有一个懒方法,直接把大小填成0x1000

然后点击获取导入表->显示无效的->右键->剪切指针->修正转储即可

修复后

image-20220101105144744

标签:RVA,FSG,程序,手脱,地址,实训,跳转,脱壳,IAT
来源: https://blog.csdn.net/weixin_48066554/article/details/122265893