20242415 2026-2027-1 《网络与系统攻防技术》实验四实验报告
20242415 2026-2027-1 《网络与系统攻防技术》实验四实验报告
1. 基础知识
PE 文件与加壳:PE(Portable Executable)是 Windows 下可执行文件(.exe/.dll)的统一格式,文件头中的节区表记录了代码段、数据段的分布。加壳(Packer)是把真实代码压缩/加密后包上一层"壳代码",程序运行时先在内存中解压还原再执行。恶意代码加壳的主要目的是对抗静态分析——加壳后文件里的字符串和代码全部面目全非。因此分析恶意代码的第一步通常是:识别壳 → 脱壳 → 再分析。
字符串提取:strings 命令扫描二进制文件,把连续的可打印字符片段抽取出来。脱壳后的样本中,硬编码的 URL、注册表键、命令参数、作者信息都会暴露,是静态分析性价比最高的手段。需要注意 Windows 程序常用 UTF-16 编码存储字符串,字符间穿插 00 字节,默认的 strings 识别不了,需要加 -e l 参数按 16 位小端编码提取。
逆向工程基本方法:不逐行硬读汇编,而是先找"地标"(字符串、API 调用、导入表),通过交叉引用(xref)定位到关键判断逻辑,再读比较指令还原验证流程。IDA Pro 的流程图视图(Graph view)可以直观展示条件分支。
恶意代码分类:按传播方式区分——病毒需要感染其他文件/宿主;蠕虫能自主网络传播;木马/僵尸程序(Bot)不自我复制,而是潜伏在受控主机上,通过 C2(命令与控制)信道接收攻击者指令。大量 Bot 组成的网络即僵尸网络(Botnet),受控主机称"肉鸡",常用于 DDoS、垃圾邮件、窃密等。
IRC 协议:Internet Relay Chat,1988 年诞生的多人文本聊天协议,客户端/服务器架构。客户端注册时发送 NICK(昵称)和 USER(用户信息)消息,用 JOIN 加入频道。默认端口 TCP 6667(常用 6660~6669)。由于 IRC 天然支持一对多广播,早期僵尸网络普遍用 IRC 频道做 C2 信道。
蜜罐与取证:蜜罐是故意暴露、没有业务价值的诱捕系统,攻击者的所有行为都是高价值情报。对蜜罐网络流量的取证分析主要用 tcpdump(逐包过滤统计)和 tcpflow(按 TCP 连接重组完整会话)两类工具。
2. 实验内容
一、对 rada 恶意代码样本进行文件类型识别、脱壳与字符串提取,找出编写作者。
二、使用 IDA Pro 分析 crackme1.exe 与 crakeme2.exe,寻找特定输入使其输出成功信息。
三、深入分析 rada 样本,回答样本摘要、目的、特性、反分析技术、分类、同类工具、作者调查、检测方法共八个问题。
四、取证分析:Snort 收集的蜜罐主机(172.16.134.191)5 天网络数据,分析其被攻破加入僵尸网络的过程,回答七个问题。
3. 实验过程
3.1 任务一:文件识别、脱壳与字符串提取
(1)文件格式、运行平台和加壳工具
解压 rada.rar 得到 RaDa.exe 后,先算哈希验明正身:
md5sum RaDa.exe

MD5 为 caaa6985a43225a0b3add54f44a0d4c7,与 Honeynet SotM-32 官方公布的值一致,确认样本完好。
file RaDa.exe
sha1sum RaDa.exe
sha256sum RaDa.exe


file 的结果:PE32 executable for MS Windows 4.00 (GUI), Intel i386, 3 sections。说明文件格式为 PE32,运行平台为 Windows(x86,图形界面程序)。注意"3 sections"——正常 Windows 程序一般有 5~9 个节区,只有 3 个是可疑信号。
用 Detect It Easy 进一步查壳:

DIE 显示:打包工具: UPX[modified],编译器为 Visual Basic 6.0。说明加的是 UPX 壳,但被修改过。直接用 UPX 官方工具测试也验证了这一点——它认出了是自己的包,但拒绝解包:

CantUnpackException: file is modified/hacked/protected。检查文件节区发现,标准 UPX 的节区名 UPX0/UPX1 被改成了 JDR0/JDR1,这正是"modified"的原因,也是作者对抗一键脱壳的手段。
结论:文件格式 PE32,运行平台 Windows x86,加壳工具为修改版 UPX。
(2)脱壳
按实验要求使用超级巡警万能脱壳机。它的原理是不依赖文件头特征,让程序先运行,等壳在内存中解压完毕后把真实代码抓取出来,所以文件头被魔改也不影响。

脱壳机识别出 UPX 0.89.6 - 1.02 / 1.05 - 1.22 -> Markus & Laszlo,并提示 Unpack successfully,生成 RaDa_unpacked.exe。
脱壳后再用 DIE 复扫验证:

文件从 20.50 KiB 恢复到 67.22 KiB,"打包工具"一栏消失,只剩编译器信息(Visual Basic 6.0),脱壳成功。
(3)字符串提取找作者
脱壳后用 strings 提取字符串。这里踩了个坑:先用默认模式 strings RaDa_unpacked.exe | grep -i "author" 一无所获。想到 DIE 显示程序是 VB6 写的,而 VB6 内部用 Unicode(UTF-16LE)存字符串,字符之间隔着 00 字节,默认 strings 会把它们切成碎片。改用 16 位小端模式重新提取:
strings -e l RaDa_unpacked.exe | grep -i "author"

找到关键行:Authors: Raul Siles & David Perez, 2004,上面还有一行 --authors,说明这是程序自带的一个命令行参数。
结论:rada 的编写作者是 Raul Siles 和 David Perez(2004 年)。
3.2 任务二:IDA Pro 分析 crackme1 与 crackme2
crackme1.exe
将 crackme1.exe 拖入 IDA,Shift+F12 打开字符串窗口,发现四条关键字符串:

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—— 成功信息
查看 _main 函数的流程图验证猜想:

入口处 cmp [ebp+argc], 2 + jz,即要求命令行参数恰好 1 个;通过后在 loc_4012D2 中把 argv[1] 和字符串 I know the secret 压栈调用 strcmp,test eax, eax + jz 判断——相等走成功分支,不等走 "Pardon?" 分支。逻辑与猜想完全吻合。
cmd 中三种情况验证:

crackme1.exe → I think you are missing something.
crackme1.exe hello → Pardon? What did you say?
crackme1.exe "I know the secret" → You know how to speak to programs, Mr. Reverse-Engineer
注意密码含空格必须加引号,否则会被拆成多个参数导致 argc 不等于 2。crackme1 破解成功。
crackme2.exe
同样先看字符串:

除了和 crackme1 类似的密码 I know the secret、错误提示外,多了一条 crackmeplease.exe 和一句 I have an identity problem.。直接试运行:

带参数运行返回 I have an identity problem.——程序在检查它自己的文件名。结合 crackmeplease.exe 这条字符串,判断程序要求自身必须叫这个名字。改名后运行:

copy crackme2.exe crackmeplease.exe
crackmeplease.exe "I know the secret"
→ We have a little secret: Chocolate
crackme2 破解成功。 值得一提的是,成功信息 We have a little secret: Chocolate 在字符串表里并不存在,字符串表中只有两条乱码('b*#4'b#b.+66.'b1'!0'6xb 之类),说明成功信息是加密存储、运行到成功分支时才解密的——crackme2 比 crackme1 多了"文件名自校验"和"字符串加密"两层保护,这正是恶意代码对抗 strings 分析的常见手法。
3.3 任务三:rada 样本深度分析
(1)样本摘要
| 项目 | 内容 |
|---|---|
| 文件名 | RaDa.exe |
| 文件格式 | PE32 executable (GUI),Intel i386 |
| 大小 | 20992 字节(脱壳后 67.2 KB) |
| MD5 | caaa6985a43225a0b3add54f44a0d4c7 |
| SHA1 | 4164423ece62c5c4287f8c20030b84e43a6cfda |
| SHA256 | 13c2379e9d9f679396e21a3391804cc834892f25691381b6d078d07b56d38f90 |
| 编写语言 | Visual Basic 6.0(Native 编译) |
| 加壳 | UPX(修改版,节区名被改为 JDR0/JDR1) |
| 特殊标记 | 内含字符串 "This program is the binary of SotM 32"(Honeynet 2004 年 10 月挑战赛样本) |

凭借以上哈希值,可以在 VirusTotal 等平台唯一标识同一样本。
(2)(3)目的与特性
对脱壳后的文件做双编码字符串提取(ASCII + UTF-16),再按关键词定向挖掘:

挖掘结果归纳如下:
网络行为:
http://10.10.10.10/RaDa—— C2 服务器地址RaDa_commands.html—— 定期从该页面读取控制者下发的命令download.cgi/upload.cgi—— 通过 CGI 脚本下载/上传文件http://192.168.、http://172.16.、http://10.—— 备选服务器均为内网网段(教学样本故意为之)Upload file using http And multipart/form-data—— HTTP 表单方式上传
持久化:
C:\RaDa\bin、C:\RaDa\tmp—— 将自身复制到安装目录HKLM\Software\Microsoft\Windows\CurrentVersion\Run\—— 写注册表实现开机自启
攻击能力:
Starting DDoS Smurf remote attack ...—— 支持 Smurf 型 DDoS 攻击(向广播地址发送伪造源地址的 ICMP 包,借整个网段的主机反射淹没目标)
功能开关:共 16 个命令行参数——--server(指定 C2)、--commands(命令页面)、--period(心跳周期)、--installdir / --noinstall / --uninstall(安装控制)、--cycles、--verbose、--visible、--gui、--authors 等。
结论:RaDa 的目的是作为僵尸网络的客户端(Bot)——感染主机后定期连接 C2 服务器读取指令,具备文件上传下载、远程命令执行、DDoS 攻击能力,并通过注册表 Run 键实现持久化。
(4)反分析技术
RaDa 共用了三层手段防止被分析和逆向:
- 修改版 UPX 壳:把标准 UPX 的节区名 UPX0/UPX1 改成 JDR0/JDR1 并破坏了 UPX 头部校验,导致官方工具
upx -d直接报 CantUnpackException 拒绝工作,一键脱壳失效;同时壳本身也让直接的字符串提取只剩乱码。 - Unicode 字符串存储:程序用 VB6 编写,字符串以 UTF-16LE 存储,默认的 strings(只认 ASCII)提取不到任何有意义的内容,逃避最基础的字符串分析。
- 虚拟机检测:字符串中发现
HKLM\Software\VMware, Inc.\VMware Tools\InstallPath——程序读注册表检测是否运行在 VMware 虚拟机中,一旦发现自己处于分析人员常用的虚拟环境,就隐藏关键行为(包括作者信息)。
(5)分类
RaDa 属于木马/僵尸程序(Bot),不是病毒也不是蠕虫。 判断依据:病毒的特征是感染其他正常文件、依附宿主传播;蠕虫的特征是无需人为干预自主在网络间复制扩散。RaDa 两者都不具备——它没有感染其他文件的逻辑,也没有自主传播模块,而是感染后静默潜伏、等待 C2 指令的"肉鸡"客户端,需要借助其他手段(如蠕虫、漏洞利用、社工)被植入主机。
(6)同类工具
- Sub7、Back Orifice 2000、NetBus:与 RaDa 同时代的著名远程控制木马(RAT),功能定位几乎相同。
- Agobot / SDBot / rBot:IRC 协议的僵尸程序,Botnet 方向的代表。
- 现代后继者:Zeus(银行木马 botnet)、Mirai(物联网 botnet),控制信道从 IRC 演进到了 HTTP/P2P。
(7)作者调查
可以。 程序自带 --authors 参数,运行 RaDa.exe --authors 会以弹窗形式报出作者:

但有限定条件:由于 RaDa 会检测 VMware 环境,必须在非 VMware 的环境(物理机或其他虚拟机)中运行,作者信息才会正常显示;在装有 VMware Tools 的虚拟机里它会对分析者隐藏这一行为。此外还要先知道 --authors 这个参数的存在——这本身需要通过静态分析(strings)才能发现。我的运行环境是 Windows 物理机,弹窗正常显示了 Authors: Raul Siles & David Perez, 2004,与 strings 静态提取的结果一致,动静两条路互相印证。
(8)检测方法(五种以上)
- 哈希黑名单检测:将样本的 MD5/SHA1/SHA256 录入 IOC 特征库,文件落地或传输时比对哈希值即可识别。优点是绝对精确、零误报;缺点是样本改一个字节哈希就全变,只能检测已知样本。我的 Windows Defender 就是靠特征直接认出 RaDa 并报毒的,这本身就是该方法的实例。
- 特征码 / YARA 规则检测:从样本中选取独有特征串编写规则,例如:
特征串要选取正常软件不可能出现的独特内容,兼顾检出率与误报率;rule RaDa { strings: $a = "Authors: Raul Siles & David Perez" wide $b = "RaDa_commands.html" wide $c = "Starting DDoS Smurf remote attack" wide $d = "JDR0" condition: any of them }wide修饰符对应 UTF-16 编码,针对 VB6 程序必须加。 - 网络特征检测(Snort 规则):RaDa 的 C2 通信是固定模式的 HTTP 请求,可编写规则:
该 URL 路径特征明确,正常业务几乎不会访问,误报率低;同时把 URL 路径作为特征而不是硬编码 IP,对更换服务器的变种也有一定覆盖。alert tcp any any -> any 80 (msg:"RaDa C2 beacon"; content:"GET /RaDa/RaDa_commands.html"; sid:1000001;) - 行为检测(HIDS/EDR):不依赖样本特征,监控高危行为组合——进程写注册表 Run 键 + 在 C:\RaDa\bin 释放文件 + 周期性向外发起 HTTP 连接,单个行为都可能正常,组合出现即判定恶意。这种方式对加壳、变种都有效。
- 周期外连异常检测:Bot 的心跳是"机器节律"(固定时间间隔发包),而人类浏览网页的时间是随机分布的。对内网主机的外连时间序列做统计分析,找出"每 N 秒准时访问同一地址"的主机,即可定位肉鸡。
- 加壳/熵检测(启发式):加壳文件的节区熵值接近随机数据,且节区数量异常少。用 DIE、PEiD 等工具做启发式扫描,发现"高熵 + 修改版 UPX"特征即标记可疑,可作为前置筛查手段。
- 沙箱动态分析:把样本放进隔离沙箱运行,记录其注册表修改、文件释放、网络连接全行为,自动产出行为报告,对未知样本尤其有效。
3.4 任务四:僵尸网络取证分析
(1)IRC 基础
IRC(Internet Relay Chat,互联网中继聊天)是采用客户端/服务器架构的多人文本聊天协议。客户端申请加入 IRC 网络时,注册阶段发送 NICK(设置昵称)和 USER(声明用户名、主机名、真实姓名)两条消息,之后用 JOIN #频道名 加入频道。IRC 一般使用 TCP 6667 端口,常用范围为 6660~6669。
(2)僵尸网络
僵尸网络(Botnet = Robot + Network)是攻击者通过漏洞、蠕虫等手段批量感染主机并植入 Bot 程序后,形成的可统一遥控的网络。受控主机称"肉鸡"(zombie),通过 C2(命令与控制)信道接收指令。典型用途:发起 DDoS 攻击、发送垃圾邮件、窃取信息、点击欺诈、充当攻击跳板、挖矿等。
(3)蜜罐与哪些 IRC 服务器通信
过滤源地址为蜜罐、目标端口 6667 的包,对目标 IP 去重:
tcpdump -nn -r botnet_pcap_file.dat 'src host 172.16.134.191 and tcp dst port 6667' \
| awk -F'>' '{print $2}' | awk '{print $1}' \
| cut -d. -f1-4 | sort -u

蜜罐与 5 台 IRC 服务器进行了通信:209.126.161.29、209.196.44.172、63.241.174.144、217.199.175.10、66.33.65.58。一只 Bot 换 5 台服务器,说明控制端有故障转移机制,防御时封单个 IP 无法根除。
(4)多少主机访问过以 209.196.44.172 为服务器的僵尸网络
最初我试图直接统计访问该服务器的源 IP 数量,结果只有 1——因为数据是蜜罐侧 Snort 收集的,只能看到蜜罐自己的流量。换个思路:蜜罐上的 Bot 登录 IRC 加入频道时,服务器会按协议把频道全体成员名单(353 号 RPL_NAMREPLY 报文)推送给它,这份名单就是整个僵尸网络的花名册。
用 tcpflow 重组蜜罐与 209.196.44.172:6667 的会话:
tcpflow -r botnet_pcap_file.dat 'host 209.196.44.172 and port 6667'
ls -la

生成了两个方向的流文件,其中服务器发给蜜罐方向的文件约 1 MB(209.196.044.172.06667-172.016.134.191.01152)。提取其中的 353 报文,解析成员昵称并去重计数:
cat 209.196.044.172.06667-172.016.134.191.01152 \
| grep -a " 353 " \
| sed 's/.*:.* 353 .* @ #[^ ]* ://' \
| tr ' ' '\n' | tr -d '\r' | grep -v '^$' \
| sort -u | wc -l

结果:3461 台不同的主机在这段观察期间访问了该僵尸网络。蜜罐只是被动围观,却因 IRC 协议"进频道即广播名单"的特性拿到了整个 botnet 的规模数据。
(5)哪些 IP 攻击了蜜罐
统计所有目标为蜜罐的包的源 IP 并去重:
tcpdump -nn -r botnet_pcap_file.dat 'dst host 172.16.134.191' \
| awk '{print $3}' | cut -d. -f1-4 \
| grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' \
| sort -u | wc -l

共有 165 个 IP 地址被用于攻击蜜罐主机。
(6)攻击者尝试了哪些安全漏洞
攻击目标端口就是漏洞的"指纹"。为避免蜜罐自己外连的返程流量干扰,只过滤 SYN(不带 ACK)的新建连接:
tcpdump -nn -r botnet_pcap_file.dat \
'dst host 172.16.134.191 and tcp and tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0' \
| awk '{print $5}' | tr -d ':' | awk -F'.' '{print $NF}' \
| sort -n | uniq -c | sort -rn | head -20

结合端口分布与 UDP 流量(137、1434 等),攻击者尝试的漏洞包括:
| 端口 | 对应漏洞/攻击 |
|---|---|
| 445、139 | MS04-011 LSASS 漏洞(震荡波 Sasser 利用)、SMB 空会话/弱口令 |
| 135 | MS03-026 DCOM RPC 漏洞(冲击波 Blaster 利用) |
| 80 | IIS Unicode / IDA/IDQ 溢出(尼姆达遗产) |
| 1433 / 1434(UDP) | MSSQL 弱口令 / SQL Slammer 蠕虫 |
| 6129 | DameWare 远程管理软件漏洞/弱口令 |
| 4899 | Radmin 远程控制爆破 |
| 3127 / 2745 / 5554 等 | MyDoom、Bagle、Sasser 等蠕虫遗留后门的二次扫描 |
(7)哪些攻击成功了
判据:蜜罐有没有在对应端口上回数据——只有 SYN 没有 SYN-ACK 是端口关闭;SYN-ACK 之后有持续带载荷(Flags [P.],length > 0)的双向数据,才是真正的会话建立。
检查 445 端口,蜜罐向 195.36.247.77 回了 SYN-ACK 并持续发送大量数据:

打过 445 的攻击者共 8 个:

129.116.182.239、195.36.247.77、209.45.125.69、210.22.204.101、61.111.101.78、66.139.10.15、66.8.163.125、80.181.116.202。其中 195.36.247.77 与蜜罐有双向各 7~9 KB 的完整 SMB 会话数据,LSASS/SMB 方向攻击成功。
对其他重点端口做同样的"蜜罐有没有回数据"测试:

- 6129(DameWare):蜜罐全部回
[R.](RST),连接被拒,攻击失败; - 80(IIS):蜜罐对 213.23.49.158 返回了
HTTP/1.1 200 OK,Web 服务正常应答,发生了成功交互; - 139、4899:有 SYN-ACK 但数据量很小,浅尝辄止。
用 tcpflow 重组 195.36.247.77 与蜜罐 445 端口的会话,strings 提取到 \PIPE\lsass(LSASS 服务的命名管道):

结论:攻击者利用的正是 MS04-011 LSASS 漏洞。结合双向各 7~9KB 的完整会话数据,判定 445 端口攻击成功,蜜罐由此被植入 Bot 并连入 IRC C2。
4. 问题及解决方案
-
问题1:strings 默认模式搜不到作者信息,但文件明明脱壳成功了。
-
问题1解决方案:DIE 显示程序是 VB6 编写,VB6 用 UTF-16LE 存字符串,字符间有
00字节,默认 strings 只认连续 ASCII。改用strings -e l(16 位小端模式)后成功提取。以后分析 Windows 样本,strings 默认模式和-e l要各跑一遍。 -
问题2:
upx -d脱壳失败,报 CantUnpackException: file is modified/hacked/protected。 -
问题2解决方案:样本的 UPX 节区名被魔改成 JDR0/JDR1 且头部校验被破坏,官方工具拒绝解包。两条路解决:一是按实验要求用超级巡警脱壳机从内存抓取,不依赖文件头;二是把节区名 sed 改回 UPX0/UPX1 后再用 upx -d。这也让我理解了"修改壳头"是恶意代码的主动反分析手段。
-
问题3:Windows 上运行 RaDa.exe 提示"拒绝访问",文件还莫名消失。
-
问题3解决方案:Windows Defender 识别并拦截了样本。在"病毒和威胁防护→排除项"中把实验目录 D:\cxdownload 加入白名单后恢复文件;同时把 Defender 的检测记录截图留作"特征码检测"方法的证据。实验结束后删除排除项。
-
问题4:统计访问 botnet 的主机数时,无论怎么过滤结果都是 1。
-
问题4解决方案:数据是蜜罐侧收集的,看不到其他肉鸡的流量,数源 IP 此路不通。改用 tcpflow 重组蜜罐自己的 IRC 会话,解析服务器下发的 353 频道成员名单,得到 3461 台。取证时要先想清楚"传感器站在哪、能看到什么"。
5. 学习感悟、思考
这次实验把恶意代码分析的完整流程走了一遍:识别、脱壳、静态提取、逆向、动态验证、流量取证。最大的收获不是某条命令,而是思路上的三个转变。
第一,先找地标再读细节。一开始面对 IDA 里几千行汇编完全无从下手,学会"字符串→交叉引用→判断逻辑"这条路线后,crackme 的分析变成了按图索骥。取证也一样,3461 这个数字不是靠蛮力数出来的,而是理解 IRC 协议行为后"借"服务器之手拿到的。
第二,对抗是双向的。RaDa 的魔改 UPX、Unicode 字符串、VMware 检测,每一层都精准地打在我最初使用的"默认方法"上——upx -d 失败、strings 无输出,都是作者算好的。防守方每发明一个工具,攻击者就研究它的盲区。这让我理解为什么安全从业者必须理解工具的原理而不只是用法:只有知道 upx 靠什么识别自己的包,才能想出"把节区名改回去"这种对策。
第三,数据会讲故事,前提是你问对问题。一份 pcap 摆在那里,问"蜜罐连了谁"得到 5 台服务器,问"谁连了蜜罐"得到 165 个攻击者,问"蜜罐在哪些端口回了数据"得到攻击成败。同一个数据源,答案的质量完全取决于问题的质量。
另外踩坑的过程也让我对工具有了肌肉记忆:Windows cmd 的 /d、strings 的 -e l、awk 的字段数、Broken pipe 不是错误……这些课本不会写的细节,才是动手的意义。
浙公网安备 33010602011771号