查看原文
其他

关于unicorn去搞VMP的iat那点事

L0x1c 看雪学苑 2022-07-01


本文为看雪论坛优秀文章

看雪论坛作者ID:L0x1c


其实看了很多帖子,关于unicorn去搞vmp的事情,最开始来源于大表哥的github项目 unicorn_pe,于是自己也研究了一下unicorn和capstone的东西感觉很好用!于是准备写一下,一起来学!


VMP寻找OEP


其实关于vmp去找OEP的这一步我觉得是很关键的,因为在最开始加完vmp后,可以发现对应的text段,data段都是空的。
 
可以看到是没有数据的,vmp在运行后,会动态的解密,这样text段就会有数据了。
 
一般我们写代码都会用到像编译器这种东西,用什么vs呀,易语言呀,vc++ 6.0呀 等等等的,他们这些东西编译出来的都会有一点框架,所以我们一般对相应的遇见的第一个api下段就可以找到入口点,一般的api也就是GetVersion,GetSystemTimeAsFileTime,如果下段后的栈回溯在text段内,那么我们继续回溯即可。
 
可以看到相应的可以对上了,我们直接溯到call jmp的位置进行dump即可。
 


VMP寻找iat


我们先分析没有加壳的代码:
 
可以发现call 为 FF 15 call (当然还有 FF 25) (mov reg,iat call reg / jmp reg)
 
这里以 FF 15 call 为例子,这里面都变成了 E8 call,因为要保持原来的6个字节的问题 所以一般 都是 push reg call xxxx / call xxxx ret
 
 
以第一个 push eax call sub_4FBE6B 为例子。
.vmp00:004FBE6B 90 nop ; No Operation.vmp00:004FBE6C 9F lahf ; Load Flags into AH Register.vmp00:004FBE6D 98 cwde ; AX -> EAX (with sign).vmp00:004FBE6E 58 pop eax.vmp00:004FBE6F E9 62 5A EC FF jmp loc_3C18D6.vmp00:003C18D6 87 04 24 xchg eax, [esp-4+arg_0] ; Exchange Register/Memory with Register.vmp00:003C18D9 E9 F5 D8 F2 FF jmp loc_2EF1D3 ; Jump.vmp00:002EF1D3 50 push eax.vmp00:002EF1D4 B8 3F 15 28 00 mov eax, 28153Fh.vmp00:002EF1D9 E9 2F 45 16 00 jmp loc_45370D ; Jump.vmp00:0045370D 8B 80 51 E1 00 00 mov eax, [eax+0E151h].vmp00:00453713 8D 80 CD 4A 08 4C lea eax, [eax+4C084ACDh] ; Load Effective Address.vmp00:00453719 87 04 24 xchg eax, [esp+0] ; Exchange Register/Memory with Register.vmp00:0045371C E9 8C 35 E4 FF jmp nullsub_32 ; Jump.vmp00:00296CAD C3 retn ; Return Near from Procedure

可以看到上面的流程最后一个retn 又因为xchg交换了 eax和esp的内存,所以可以判定出 iat的地址有关系的几句汇编是:
mov eax, 28153Fhmov eax, [eax+0E151h]lea eax, [eax+4C084ACDh]xchg eax, [esp+0]

iat = [28153F+0E151]+4C084ACD
可以看到表示的没有问题。


iat脚本


这里我使用的是unicorn来获取到对应的api,因为在恶意样本的操作的时候,一定会用到api做一些恶意的功能,也会对分析来说多了一点帮助。
 
使用方法:
 
用x64dbg转到对应的段的内存布局进行文件dump
 
讲文件放在项目的目录下,以及将当前环境的reg的值填入(这里我延用了周壑老师的代码,进行了修改)。
 
 
因为周壑老师说的是抛异常的形式,那么我就按照异常的形式来捕获iat,因为对于api的这些内存的位置,我是没有map到内存中的,所以遇到iat就会出现异常。
 
因为我看了很多地方都是E8 call,而且在text段中 call的位置为vmp段,所以直接暴搜E8 call即可,把这些位置记录下来然后遍历即可,根据ldr以及pe的解析就可以搞出来iat啦!
 
效果:
 



 


看雪ID:L0x1c

https://bbs.pediy.com/user-home-873515.htm

*本文由看雪论坛 L0x1c 原创,转载请注明来自看雪社区




# 往期推荐

1.【符号执行】KLEE安装与KLEE论文阅读笔记

2.一次Web探测服务器技术学习总结

3.解锁一辆车的非“优雅”方式

4.如何入门工控漏洞挖掘

5.重温搭建pwn环境

6.Windows平台下堆溢出攻击






球分享

球点赞

球在看



点击“阅读原文”,了解更多!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存