继上次改shellcode被打爆后,把基础汇编学的差不多了,现在再来和火绒solo一下
CS给出的shellcode里面的CALL和JMP转移时候的机器码用的都是偏移量, 只要算好偏移不用担心跳转不到地址
本来这个在8086汇编里面写过的但是那文章好像..不见了..
没事重新提一下,先来看两条汇编语句和对应的机器码
1 | mov eax,12345678 机器码:B878563412 |
可以看出mov的机器码里面要会有值,但是jmp直接使用偏移
首先还是要生成一个木马,就用最简单的加载器
1 |
|
这样写生成的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 | 原来的shellcode |
重新编译一下顺便看看能不能用,每次修改都要看看能不能使用
可以看到火绒还是直接爆出了CS的特征,说明shellcode里面有特征码没有消除
直接用MYCCL,过程就不重复了,可以看MYCCL使用方法那篇
得到特征码048B
现在去找一下对应的汇编指令
1 | mov eax, dword ptr ds:[ebx+ecx*4] -> 8b048b |
这里同样可以使用JMP跳到底部再回来,JMP需要五个字节所以会把下面那个也覆盖掉,要在下面补上
跳到底部做运算
现在再次修改shellcode
1 | .....\x8B\x04\x8B\x01\xD0...\xe9\xd9\xfc\xff\xff |
改了这个还是可以被火绒查到,继续找特征码修改特征
这次找到了\xff\xd5,这个在第一次尝试修改的时候就容易被查,对应的代码是CALL EBP
整个shellcode里面有很多\xff\xd5,这次要找的是\x57\x57\x57\x57\x57上面的那个
同样的跳到最底部再回来
这次选择覆盖上面的指令push 0x726774C,因为下一条指令也是两个字节不够五个字节,这样还要多覆盖一条太麻烦,所以就选上面这条了,顺便说一下push 0x726774C这条是卡巴斯基的特征码,估计是指向什么函数指针,只是简单的看了一下具体不知道
1 | .....\x68\x4c\x77\x26\x07\xff\xd5.....\xe9\x46\xfd\xff\xff |
图就不贴了和上面一样的
这次修改好之后火绒报了一个混淆器
说明shellcode的特征已经被改掉了,火绒已经识别不出来了
再次用MYCCL寻找特征码,PE文件200C的位置发现一个01,看了一下应该是没用的数据,不知道为什么会报毒,改为00后成功免杀并不影响使用
优点:针对性强,而且可以不需要写复杂的加载器
缺点:修改复杂并且不通用,每个shellcode都要改一下,毕竟长度不一样偏移也不一样
后面也不一定要修改PE文件200C的位置, 继续修改shellcode还是能免杀的,主要还是修改push 0x726774C,当时想这样过卡巴斯基的,无奈卡巴还有流量检测,光修改特征码还是不太够,不过修改之后静态检测还是可以过的,拿出来也可以直接过火绒,不需要修改PE文件
说回来当时shellcode改完之后放到卡巴里面找特征码找到了两个
CALL ESP这个记得不是很清楚了
push 0x726774C这个很清楚,因为对684C特征码管很严