20242429 2026-2027-1 《网络与系统攻防技术》实验四实验报告

1.基础知识

本次实验围绕恶意代码分析展开,涉及的知识可以归纳为以下几条主线。

(1)PE 文件结构与识别

Windows 可执行文件遵循 PE(Portable Executable)格式,开头是 DOS 头,e_lfanew 指向 PE 签名,其后是文件头、可选头与节表。节表描述 .text、.data、.rsrc 等节区的虚拟地址、大小和文件偏移。用 file 命令可以读出“PE32 executable for MS Windows (GUI), Intel i386, N sections”一类的信息,判断目标是否为 32 位 GUI 程序、有多少个节,是恶意代码分析的第一步。

(2)加壳与脱壳

加壳器把原始可执行文件的代码和数据压缩、加密后存放在新的节区中,并把程序入口点改成一段解压存根(stub)。程序运行时由存根在内存中还原原始映像,再把控制权交回原入口(OEP)。UPX 是最常见的压缩壳,其典型特征是节名 UPX0/UPX1、文件尾部的“UPX!”标识,以及入口处 pushad、mov esi/lea edi、NRV2B 解压循环一类的指令序列。脱壳就是把原始映像从壳中还原出来,常见手段是用专用脱壳工具(UPX -d、超级巡警、PEiD 插件等),或者动态运行后在内存中 dump。

(3)静态分析与反编译

静态分析不运行样本,只对二进制做反汇编、反编译、字符串和导入表分析。IDA Pro 与 Ghidra 都能把机器码还原成汇编和类 C 伪代码,并通过交叉引用(XREF)把字符串、导入函数与调用点关联起来。恶意代码中的硬编码域名、URL、注册表路径、命令关键字,往往能在字符串表和伪代码里直接看到,是判断其功能最直接的证据。

(4)恶意代码分类与后门

恶意代码大致分为病毒、蠕虫、木马/后门、勒索软件、僵尸程序等。后门(Backdoor)不自我复制,而是通过伪装、捆绑等方式进入主机,建立持久的、隐蔽的远程控制通道;僵尸程序(Bot)则进一步接受 C&C 服务器指令,可被组织成僵尸网络发动 DDoS、发送垃圾邮件或作为跳板。

(5)僵尸网络与 IRC 协议

IRC(Internet Relay Chat)是基于文本的实时聊天协议,客户端注册时需要发送 PASS/NICK/USER 组合消息,加入频道时发送 JOIN,服务器用 353 数值回复广播频道成员名单,用 266 回复广播当前全局用户数(Current global users)。僵尸网络常借用 IRC 服务器作为命令控制信道,因此 IRC 流量中的服务器地址、JOIN/QUIT 记录和成员名单,可以用来估算僵尸网络的规模。

(6)网络取证

取证分析以 pcap 抓包文件为数据源,借助 tcpdump、tshark、tcpflow、Wireshark 等工具还原会话:按五元组过滤流量、重组 TCP 流、统计协议层次和端口分布、提取 HTTP URI 与 SMB 命令,从而判断攻击者用了哪些漏洞、哪些攻击得手。蜜罐是被故意布置的诱饵主机,其流量可以反映真实的攻击行为。

2.实验内容

本次实验共四个部分:

一、恶意代码文件类型标识、脱壳与字符串提取:对提供的 RaDa 恶意代码样本识别文件格式、运行平台和加壳工具;使用脱壳工具对其脱壳;对脱壳后的样本做字符串提取,找出编写作者。

二、使用 IDA Pro(本机以 Ghidra 替代)静态或动态分析 crackme1.exe 与 crackme2.exe,找出能够输出成功信息的特定输入。

三、分析自制恶意代码样本 RaDa,回答样本摘要、目的、特性、反分析技术、分类、相似工具、作者溯源、检测方法等八个问题。

四、取证分析实践:以 Snort 收集的蜜罐主机五天网络数据(botnet_pcap_file.dat)为数据源,回答 IRC、僵尸网络规模、攻击者 IP、攻击漏洞与攻击是否成功等问题。

3.实验过程

3.1 实验环境与样本准备

实验在 VMware Workstation 中的 Kali Linux 2026.2 虚拟机内完成,主机名为 niuyuxuan(本人姓名拼音),CPU 4 核、内存 2 GB、NAT 网络。分析工具包括 file、md5sum、objdump、strings、UPX 4.2.4、Ghidra 12.1.4、wine 10.0、tcpdump、tshark、tcpflow、Wireshark。为便于归档,所有材料放在 /home/kali/20242429_lab4 目录下,截图与脚本均以学号命名。

图35 PSEXESVC 服务创建与 4899 端口通信统计

4.问题及解决方案

问题1:实验材料中没有随附 RaDa 样本与抓包文件,虚拟机里也没有现成文件,无法直接开始分析。

解决方案:根据实验要求中的样本特征(SotM32、UPX 加壳)在 Honeynet 官方站点找到 Scan of the Month 32 的 RaDa.zip 与 Scan of the Month 27 的抓包,下载后校验 MD5:RaDa.exe 为 caaa6985a43225a0b3add54f44a0d4c7,与实验报告要求完全一致,说明拿到的是同一份样本;抓包文件解压后重命名为 botnet_pcap_file.dat,共 54536 个包、时间跨度 5 天,与题目描述吻合。

问题2:直接用 upx -d 脱壳失败,提示“file is modified/hacked/protected”。

解决方案:先用 objdump -h 和 strings 对比,发现节名是 JDR0/JDR1、魔数是 JDR!,判断是改过的 UPX 壳。编写 Python 脚本解析 PE 节表,把节名改回 UPX0/UPX1、把 JDR! 改回 UPX!,再执行 upx -d 就成功了。这个过程也说明:只改壳的特征串就能骗过一部分自动化工具,检测规则不能只依赖单一特征。

问题3:crackme2 改名后仍然得不到成功信息。

解决方案:阅读反编译代码发现它比较的是完整的 argv[0]。在 Linux 下用 wine 运行时,./crackmeplease.exe 会把“./”带进 argv[0],直接 wine crackmeplease.exe 传入的又是完整路径,因此都失败;改用 wine cmd /c crackmeplease.exe 让 cmd 以文件名调用,argv[0] 才是“crackmeplease.exe”,校验通过。这与在 Windows 上“要在 cmd 而不是 PowerShell 里运行”的经验是同一个原因。

问题4:本机没有 IDA Pro 与 PEiD,无法按教材的方式做图形化反汇编。

解决方案:在 Kali 中安装开源的 Ghidra 12.1.4 作为替代。Ghidra 同样提供反汇编、反编译、交叉引用和字符串窗口,功能上足以完成 crackme 与 RaDa 的分析;加壳识别则改用 objdump 查看节表加 strings 提取特征串,效果与 PEiD 一致。

问题5:统计“访问僵尸网络的主机数”时,最初按 JOIN 记录统计得到的结果与预期不符。

解决方案:检查发现抓包里同时存在两个方向的会话文件,JOIN 与 QUIT 记录分散在服务器到客户端、客户端到服务器两个文件中,且部分记录带控制字符。改为对全部会话文件统一用 grep -a 提取 JOIN/QUIT、按“@”截取主机名、tr 删除控制字符后排序去重,才得到稳定的 5582 台;同时也说明单一指标(在线数、JOIN 数、昵称数)各有偏差,需要交叉验证。

5.学习感悟、思考等

这次实验把“恶意代码分析”从概念变成了手上的一套流程:先用 file、md5sum 给样本“验明正身”,再看节表和字符串判断有没有加壳,然后脱壳、提字符串、进反汇编器找关键逻辑,最后回到网络流量里验证样本的实际行为。整个链条走下来,我对“静态分析看意图、动态与流量分析看行为”这句话有了更具体的理解。

印象最深的是脱壳这一环节。原以为 upx -d 一条命令就能解决,结果被“modified/hacked”挡了回来。把节名和魔数改回去之后立刻成功,这件事让我意识到,很多所谓的“反分析技术”并没有想象中高深,它们利用的往往是工具对特征的依赖;反过来,做检测时如果规则也只盯着一个特征,就很容易被同样的手法绕过。

另一个体会是工具不是目的。本机没有 IDA Pro,用 Ghidra 一样完成了反编译;没有 PEiD,用 objdump 加 strings 也能判断壳的类型。真正重要的是知道“要找什么”:找入口点附近的解压存根、找字符串的交叉引用、找参数比较的分支。工具只是把这些线索呈现出来。

取证分析部分让我第一次完整地看了一次真实的入侵过程:扫描、查点、爆破、上传、注册服务,每一步在流量里都有痕迹。特别是把 SAMR 枚举出的用户名和后面的口令爆破、PsExec 上传服务串起来之后,攻击链就变得非常清晰。这也让我理解了蜜罐的价值——它记录的不是“可能被攻击”,而是“确实被怎样攻击”。

当然,本次实验也有不足:受环境限制,样本和抓包是从公开渠道获取的,crackme 也只做了静态分析和 wine 下的运行验证,没有做真正的动态调试;RaDa 是 VB6 的 P-code 程序,Ghidra 的反编译结果可读性有限,对其命令分发逻辑的分析还不够深入。