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

1. 基础知识

(1)恶意代码文件格式与 PE 结构 Windows 可执行文件采用 PE(Portable Executable)格式,由 DOS 头、PE 头、节表(Section Table)和各节(.text/.data/.rsrc 等)组成。通过文件头魔数可识别文件类型;节名、入口点和导入表反映程序功能;哈希值(MD5/SHA256)是样本唯一指纹。

(2)加壳与脱壳原理 加壳工具(如 UPX)在原始程序外包裹一层加载器,运行时先解压/解密原始代码到内存再执行。加壳会改变文件大小、节结构,使静态字符串和特征码被隐藏。脱壳方法包括:使用对应版本脱壳工具、在内存中 Dump 已解压映像、或手工跟踪解压 stub。

(3)静态与动态逆向分析 静态分析使用反汇编器(IDA Pro)查看程序逻辑,通过字符串表、函数调用图定位关键算法;动态分析通过调试器跟踪程序执行流程。crackme 是用于练习逆向的验证程序,常见技巧是字符串定位 + 比较函数(strcmp)逆向。

(4)僵尸网络与 IRC 协议 IRC(Internet Relay Chat)是一种基于文本的实时群聊协议,客户端通过 TCP(常用端口 6667)连接服务器,加入频道并收发消息。僵尸网络(Botnet)是被恶意程序感染的主机集群,通过 IRC 等信道接收攻击者命令,常用于 DDoS、垃圾邮件发送和点击欺诈。

(5)网络流量取证 使用 tshark/Wireshark 对 pcap 流量进行过滤(Display Filter)、字段提取(-T fields)和统计(sort | uniq -c),可识别通信协议、统计攻击源、判定漏洞利用是否成功。

实验环境:Kali Linux 虚拟机(主机名 linlu),Windows 11 物理机;所有样本文件名均含学号 20242413。

2. 实验内容

  1. 对 rada 恶意代码样本进行文件类型识别,给出文件格式、运行平台和加壳工具;
  2. 对 rada 样本进行脱壳处理,并提取字符串找出编写作者;
  3. 使用 IDA Pro 静态分析 crackme1.exe 与 crackme2.exe,寻找特定输入使其输出成功信息;
  4. 分析 rada 样本并回答 8 个分析性问题;
  5. 对 Snort 收集的蜜罐 5 天网络流量进行取证分析,回答 7 个问题。

3. 实验过程

3.1 任务一:rada 样本的文件类型识别、脱壳与字符串提取

3.1.1 文件格式与运行平台识别

将样本下载到 Kali 工作目录 ~/exp4_20242413 后,使用 file 命令识别:

file RaDa.exe

结论:rada 样本为 PE32 可执行文件,运行在 MS Windows 平台,32 位 Intel i386 架构,包含 3 个节。

3.1.2 计算哈希值

为样本建立唯一标识,计算 MD5 和 SHA256:

cp RaDa.exe rada_20242413.exe

md5sum rada_20242413.exe

sha256sum rada_20242413.exe

3.1.3 脱壳前字符串提取与加壳识别

先观察加壳前的字符串特征:

strings rada_20242413.exe | head -n 40

使用多种工具交叉验证加壳类型:

upx -l rada_20242413.exe

exiftool rada_20242413.exe | grep -i "pack|compile|linker"

readpe rada_20242413.exe 2>/dev/null || objdump -h rada_20242413.exe

结论:样本使用 UPX 加壳,但作者对 UPX 进行了修改——标准 UPX 的节名应为 UPX0/UPX1,而此处被改为自定义的 JDR0/JDR1,导致标准 upx -d 无法直接脱壳。

3.1.4 脱壳处理

尝试标准 UPX 脱壳:

upx -d rada_20242413.exe -o rada_unpacked_20242413.exe

标准脱壳失败。由于 rar 压缩包内附带了 rada_dump_.exe(76KB,5 sections),经验证其为脱壳后的内存 dump:

file rada_dump_.exe

cp rada_dump_.exe rada_dumped_20242413.exe

ls -lh rada_dumped_20242413.exe

3.1.5 脱壳后字符串提取与作者识别

对脱壳后样本提取字符串:

strings rada_dumped_20242413.exe | head -n 60

筛选作者信息:

strings rada_dumped_20242413.exe | grep -i "author|copyright|name|rada|raul|siles|perez|david"

结论:rada 恶意代码的编写作者为 Raul Siles & David Perez。


3.2 任务二:IDA Pro 静态分析 crackme1/2

3.2.1 crackme1.exe

使用 IDA Pro 打开 crackme1.exe,分析完成后按 Shift+F12 打开 Strings window:

观察到四个关键字符串:I think you are missing something.、I know the secret、Pardon? What did you say?、You know how to speak to programs, Mr. Reverse-Engineer。双击 I know the secret,通过 DATA XREF 跳转到引用位置:

分析:程序接收一个命令行参数,与 I know the secret 做 strcmp 比较,相等则输出成功信息。

验证:

crackme1.exe

crackme1.exe "wrong input"

crackme1.exe "I know the secret"

结果:正确输入为 I know the secret。

3.2.2 crackme2.exe

同样用 IDA Pro 打开 crackme2.exe,查看 Strings window:

分析:比 crackme1 多出 crackmeplease.exe 和 I have an identity problem.,说明程序会先检查自身文件名是否为 crackmeplease.exe,再检查参数。

验证:

crackme2.exe

crackme2.exe "I know the secret"

copy crackme2.exe crackmeplease.exe

crackmeplease.exe

crackmeplease.exe "wrong"

crackmeplease.exe "I know the secret"

结果:需要先将程序复制为 crackmeplease.exe,再传入参数 I know the secret。


3.3 任务三:rada 恶意代码样本分析

基于任务一的逆向结果,回答以下问题:

(1)提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息

  • 文件格式:PE32 executable (GUI)
  • 运行平台:MS Windows 4.00,Intel i386
  • 大小:21 KB(加壳),76 KB(脱壳后)
  • MD5:caaa6985a43225a0b3add54f44a0d4c7
  • SHA256:13c2379e9d9f679396e21a3391804cc834892f25691381b6d078d07b56d38f90
  • 加壳工具:修改版 UPX(节名 JDR0/JDR1)
  • 作者:Raul Siles & David Perez

(2)找出并解释这个二进制文件的目的

该程序是一个后门/僵尸网络客户端。脱壳后的字符串显示其包含 Command_install、Module1、Form1 等组件,具备网络通信能力,运行后会连接远程服务器等待指令。

(3)识别并说明这个二进制文件所具有的不同特性

  • 带有 GUI 界面(Form1、Module1);
  • 使用修改版 UPX 加壳,自定义节名 JDR0/JDR1;
  • 具备远程命令接收与执行能力;
  • 支持安装/配置等交互功能(Command_install)。

(4)识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术

  • UPX 加壳:将原始代码压缩加密,静态分析时无法直接看到明文代码和字符串;
  • 修改 UPX 特征:将标准节名 UPX0/UPX1 改为 JDR0/JDR1,使标准 upx -d 无法识别和脱壳,增加自动化解壳难度。

(5)对这个恶意代码样本进行分类,并给出理由

分类为后门(Backdoor)/僵尸网络(Botnet)客户端。理由:程序具备远程控制特征,会连接 C2 服务器,接收并执行远程命令,符合僵尸网络节点的行为模式。

(6)给出过去已有的具有相似功能的其他工具

  • Agobot / Phatbot:早期 IRC 僵尸网络家族;
  • SDBot / SpyBot:基于 IRC 的 Windows 僵尸网络;
  • Conficker:利用 SMB 漏洞传播的蠕虫/僵尸网络混合体。

(7)可能调查出这个二进制文件的开发作者吗?

可以。在脱壳后的样本中通过 strings 提取到明文信息:(c) Raul Siles & David Perez。限定条件:需要成功脱壳(或获取内存 dump),因为加壳状态下字符串被隐藏。

(8)给出至少5种检测该恶意软件的方法

  1. 基于特征码的静态检测:提取脱壳后的 PE 节哈希或字符串签名(如 Raul Siles、Command_install)加入病毒库;
  2. 基于行为的动态检测:监控程序是否创建 IRC 连接、申请可执行内存、修改注册表启动项;
  3. 基于网络流量的检测:监控对 IRC 端口(6667 等)的出站连接和 NICK/USER 报文;
  4. 基于加壳特征的启发式检测:识别修改版 UPX 的 JDR0/JDR1 节名、高熵代码段;
  5. 基于 YARA 规则的检测:编写规则匹配 PE 头、特定字符串组合和节结构异常。

3.4 任务四:取证分析实践

使用 tshark 对 botnet_pcap_file.dat(18 MB)进行分析。

3.4.1 IRC 通信与服务器识别(问题3)

提取所有 IRC 协议流量:

tshark -r botnet_pcap_file.dat -Y "irc" | head -n 20 tshark -r botnet_pcap_file.dat -Y "irc" -T fields -e ip.src -e ip.dst | sort | uniq

结论:蜜罐主机与 3 个 IRC 服务器通信:

  • 209.196.44.172
  • 217.199.175.10
  • 63.241.174.144

3.4.2 访问 209.196.44.172 的主机数(问题4)

tshark -r botnet_pcap_file.dat -Y "ip.dst==209.196.44.172" -T fields -e ip.src | sort | uniq | wc -l

结论:在这段观察期间,1 个主机访问了以 209.196.44.172 为服务器的僵尸网络。

3.4.3 攻击蜜罐主机的 IP 地址(问题5)

tshark -r botnet_pcap_file.dat -Y "ip.dst172.16.134.191" -T fields -e ip.src | sort | uniq | wc -l tshark -r botnet_pcap_file.dat -Y "ip.dst172.16.134.191" -T fields -e ip.src | sort | uniq | head -n 30

结论:共有 165 个不同 IP 地址用于攻击蜜罐主机。

3.4.4 攻击者尝试攻击的安全漏洞(问题6)

统计攻击蜜罐时瞄准的 TCP 端口:

tshark -r botnet_pcap_file.dat -Y "ip.dst==172.16.134.191" -T fields -e tcp.dstport | sort | uniq -c | sort -nr | head -n 20

结论:攻击者尝试利用多种服务漏洞,重点包括:

  • 445 (SMB):MS08-067 等 Windows SMB 远程代码执行漏洞;
  • 80 (HTTP):Web 服务漏洞或蠕虫扫描;
  • 139 (NetBIOS):SMB 相关共享/会话服务;
  • 4899、1152、1061 等:IRC 控制端口或随机蠕虫扫描端口。

3.4.5 哪些攻击成功了(问题7)

445 端口 SMB 攻击详细分析:

tshark -r botnet_pcap_file.dat -Y "ip.dst172.16.134.191 and tcp.dstport445" | head -n 10

80 端口 HTTP 攻击详细分析:

tshark -r botnet_pcap_file.dat -Y "ip.dst172.16.134.191 and tcp.dstport80" | head -n 10

蜜罐主机 outbound 分析(被控制后回连):

tshark -r botnet_pcap_file.dat -Y "ip.src==172.16.134.191" -T fields -e tcp.dstport | sort | uniq -c | sort -nr | head -n 20

结论:

  • 445 端口的 SMB 攻击成功:图18 显示攻击者完成了完整的 SMB 会话建立、DCERPC 绑定和后续文件读写操作,这是典型的远程代码执行利用链(如 MS08-067)。
  • 80 端口的 HTTP 攻击未成功:图19 显示只有短连接扫描(HEAD/GET 后立刻 RST/FIN),无实质性 payload 交互。
  • 蜜罐已被攻破并加入僵尸网络:图20 显示蜜罐 outbound 到 IRC 标准端口 6667 高达 8934 次,证明攻击成功后植入了 IRC 僵尸网络客户端。

4. 问题及解决方案

问题1:Windows 自带解压工具无法解压密码保护的 rada.rar。 解决方案:Windows 资源管理器不支持密码 RAR 解压。将 rar 文件传到 Kali,使用 unrar x rada.rar 并输入密码 rada 成功解压。也尝试了 7z,但 7z 对该 RAR 版本支持不佳(报 Unsupported Method),换用 unrar 解决。

问题2:标准 upx -d 无法脱壳,报 CantUnpackException: file is modified/hacked/protected。 解决方案:分析发现该 UPX 壳被作者修改,标准节名 UPX0/UPX1 被替换为 JDR0/JDR1,导致 upx 官方工具无法识别。改用 rar 包内附带的 rada_dump_.exe(经 file 验证为 76KB、5 sections 的脱壳后 PE 文件)作为脱壳样本继续分析。

问题3:Kali 与物理机之间的文件传输网络不通。 解决方案:确认 VMware 虚拟机网络适配器为 NAT 模式,物理机使用 python -m http.server 8080 开启 HTTP 服务,Kali 通过 curl -O 下载。注意 Windows 上应使用 python 而非 python3 启动服务。

问题4:IDA Free 首次使用时不熟悉界面操作。 解决方案:通过 Shift+F12 打开 Strings window 定位关键字符串,再通过 DATA XREF 交叉引用跳转到引用代码处,从而快速定位 strcmp 比较逻辑,无需逐行阅读汇编。

5. 学习感悟、思考等

本次实验让我对恶意代码的完整生命周期有了更立体的认识:从静态加壳隐藏自身,到逆向脱壳提取证据,再到通过流量取证确认实际危害。rada 样本的修改版 UPX 壳是一个很好的教学案例——它告诉我们,安全分析不能只依赖自动化工具,当标准工具失效时,需要结合文件结构知识(节名异常)和备选方案(包内 dump 文件)来推进分析。

IDA Pro 分析 crackme 的过程也让我体会到,逆向不一定需要完全读懂每一行汇编。通过 Strings → XREF → 比较函数这条链路,可以快速定位核心逻辑。这种"由果溯因"的思路在分析大型程序时尤其高效。

取证分析部分则把视角从单一样本拉到了网络层面。看到 165 个 IP 同时攻击一台蜜罐、445 端口的 SMB 漏洞被成功利用、随后蜜罐加入 IRC 僵尸网络,这些冷冰冰的数字背后是一条完整的攻击链。这也让我更理解为什么企业安全需要多层防御——单点失守(如 SMB 漏洞)就可能导致主机沦为僵尸网络的节点。