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

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


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

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

环境 & 工具

  • win xp系统(尝试使用win10系统复现失败,浪费在调试环境上的时间比实际学习的时间还长,只能说不愧是windows)
  • 吾爱破解版ollydbg
  • exeinfope(可使用其他类似查壳工具)
  • ImportREC
  • LordPE

脱壳

单步跟踪

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

查壳

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值