一、前言
最近看了两篇文章可以过免杀,并且显示vt全绿,效果很好,于是兴致勃勃动手实验一下。
二、过程
文字介绍的过程很简单,是使用exe镂空的一种手法,直接替换函数的字节码为自己的shellcode,但是为了实现这个过程,遇到了很多坑。
1、字节码被修改
重定向表是什么?
通过ida确认资源地址
重定向表指向了一批地址,这批地址的对应的字节码是需要进行修改的。
那么系统如何寻找重定向的呢?
1、寻找模块地址偏移
rdata的区段起始地址为0x53000,而重定向表的地址为0x45339c,那么偏移实际为:
0x45339c - 0x5300
2、获取内存中的rdata模块地址
3、计算内存中的地址
0xbf3000 + (0x45339c - 0x5300)
4、系统直接修改内存中的字节码地址
通过ida来到引用的地址,看看如何重定向的,因为ida默认的地址为0x400000(0x401000为pe头),引用地址为0x401310,ollydbg的地址为:0xba0000(0xba1000为pe头),0xba0000 + 0x401310-0x4000就是最终地址了
然后会发现内存中的字节码和ida中的字节码不一样,因为系统会根据重定向表修改内存中的字节码。
对比下面字节码,68是push,后面四位地址是倒叙的地址,直接修改地址。
ida:68 9c 33 45 00 # 0x00 0x45 0x33 0x9c
ollydbg: 68 9c 33 bf 00 # 0x00 0xbf 0x33 0x9c
这个是对于exe本身的重定向,其他的函数调用也是一样的,call 的地址直接被修改。
快速过滤没有重定向
寻找没有这种下划线的
最终不会弹出告警的
2、shellcode空间不够
1、通过ida | edit | Segment | Rebase Program 设置跟ollydbg一样的基地址
2、通过ida的函数列表寻找函数长度大的函数(我生成的shellcode有903字节)
3、通过jmp跳转到大空间函数
找到4c6c80地址
确实有很大的空间,只要跳开前面一段
但是运行这个exe无法执行到这个函数,我们就可以直接jmp一下即可。
如何获取到ASLR后的这个函数地址呢?很简单,通过ebp地址即可。
mov eax,[ebp+4] # 获取到0x4b9422函数地址,
mov eax,0xd85e # 要跳转到0x4c6c80,计算0x4c6c80 - 0x4b9422地址差,所以这里要相加
jmp eax # 就可以跳转到目的地址了
3、修改后出现0x0000005报错
运行程序还是报错了,由于是快速闪退,我们可以通过系统日志查看报错的代码。0x0000005是c开发者以及玩pwn最常见的错误代码,通常往不可写的地址写就会报错。
但是我这段shellcode就是下载exe并且执行exe,为什么会报这种错误?于是我使用vs进行调试发现如果是在改内存。
发现之前的shellcode使用了编码器
最终替换不使用编码器的shellcode即可
即可正常运行。
4、最终效果
当然还是被杀,感觉这个并没有太大的作用,还是需要做反沙箱才行。
三、总结
个人觉得效果并不是很好,比较浪费时间而且操作复杂(需要自己重新写shellcode,以及加入反沙箱,做到这步就可以实现免杀了),自己搞一个开源产品编译,然后替换里面的资源以及签名也是一样的(主要是用来迷惑人工逆向)。
原文始发于微信公众号(lufeisec):“VT全绿”-手动patch exe免杀
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论