关于unicorn去搞VMP的iat那点事
2022-2-2 17:59:0 Author: mp.weixin.qq.com(查看原文) 阅读量:45 收藏


本文为看雪论坛优秀文章

看雪论坛作者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平台下堆溢出攻击

球分享

球点赞

球在看

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


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458428134&idx=1&sn=90a3eca5f502317c302dc647b0f59679&chksm=b18f926c86f81b7a8a387c1e5485577328158c2bbb2972f13e64e64fe2c2378fd734b66897ac#rd
如有侵权请联系:admin#unsafe.sh