20242327 2026-2027-1 《网络与系统攻防技术》实验四实验报告
1.基础知识
PE 文件与加壳、脱壳。 Windows 下的可执行文件是 PE(Portable Executable)格式,由 DOS 头、PE 头、节表和各个节组成。加壳是把原始程序压缩(或加密)后附上一段解壳代码,运行时先执行壳代码、还原出原程序再跳转过去。所以加壳后的文件入口点不在 .text 节,而在 UPX0/UPX1 这类壳节里,直接做静态分析基本看不到原始代码和字符串。脱壳就是把原程序还原出来,可以手工跟壳,也可以用超级巡警脱壳机这类工具一键完成。
文件类型识别。 file 命令靠文件头的 magic number 判断类型;PEiD 内置大量 PE 特征签名,能进一步识别编译器、连接器版本和加壳工具。先搞清楚加壳工具,才能选对脱壳方案。
字符串提取。 strings 命令可以提取可打印字符串,-a 扫描全文件,-el 针对宽字符(Unicode);VB 编写的程序字符串多为 Unicode,不加 -el 提出来常是一堆乱码。IDA 的字符串窗口(Shift+F12)会把 ASCII/Unicode 字符串分列列出,还能通过交叉引用直接跳到引用它的代码。
恶意代码分类。 病毒需要感染宿主文件;蠕虫能自主利用漏洞传播;木马/后门提供隐蔽的远程控制通道;僵尸网络(Botnet)则通过 C2(Command & Control)服务器集中指挥大量受害主机,早期常用 IRC 协议做控制信道。
IRC 协议。 IRC(Internet Relay Chat)是基于 TCP 的多用户实时文本聊天协议。客户端申请加入 IRC 网络时按顺序发送注册消息:PASS(可选,服务器设了密码才需要)、NICK(设置昵称)、USER(提交用户名/主机/真实姓名),之后才能 JOIN 频道。标准端口是 TCP 6667,6660–6669 也常用。
IDA Pro 与 crackme。 crackme 是专门用来练习逆向的小程序。对命令行程序,argc/argv 的判断和 strcmp 这类比较函数是最常见的突破口;注意 argv[0] 是程序自身的路径名,不少"身份校验"其实就是拿 argv[0] 做比较。
网络取证工具。 Wireshark 适合交互式分析:显示过滤器、追踪 TCP 流、流量统计;tcpflow 能把 TCP 流按方向落成独立文件,方便用 grep 管道统计;Snort 是 IDS,蜜罐(Honeypot)是故意暴露给攻击者的诱捕主机,它上面收到的流量天然就是攻击样本。
2.实验内容
本次实验围绕恶意代码分析展开,共四个部分:
- 对 RaDa 恶意代码样本做文件格式和类型识别、用超级巡警脱壳机脱壳、提取字符串,找出编写作者;
- 用 IDA Pro 静态/动态分析 crackme1.exe 与 crackme2.exe,找到能输出成功信息的输入;
- 对 RaDa 样本做系统分析,回答 8 个问题(摘要、目的、特性、反分析技术、分类、同类工具、作者溯源、检测方法);
- 取证分析:Windows 2000 蜜罐主机(172.16.134.191)被攻破并加入僵尸网络,基于 Snort 采集的 5 天流量数据回答 7 个问题。
实验环境:Windows 宿主机(PEiD、超级巡警脱壳机、IDA Pro、Wireshark)+ Kali 虚拟机(file、strings、tcpflow)。样本统一按"原名+学号"重命名:RaDa_20242327.exe、crackme1_20242327.exe、crackme2_20242327.exe、botnet_pcap_file_20242327.dat,分析全程在隔离的虚拟机中进行。
3.实验过程
3.1 RaDa 样本的类型识别、脱壳与字符串提取
(1)文件格式与类型识别
先用 Kali 的 file 命令看文件头:
图1 file命令识别文件类型
结果是 PE32 executable for MS Windows 4.00 (GUI), Intel i386, 3 sections——32 位 Windows 图形界面程序,Intel x86 平台,共 3 个节。
再用 PEiD 看细节:
图2 PEiD 识别结果
入口点 0000FD20,EP 段是 UPX1(入口落在壳节里而不是 .text),连接器版本 6.0,子系统 Win32 GUI,最下面一行直接给出了壳的签名:UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo。
小结:文件格式为 PE32(GUI),运行平台为 Windows 32 位(Intel x86),加壳工具为 UPX。
(2)脱壳
用超级巡警之虚拟机自动脱壳器 V1.3 处理样本,工具识别出 UPX 壳并提示"支持脱该壳",点击"给我脱"后脱壳成功,输出 RaDa_20242327_unpacked.exe:
图3 超级巡警脱壳成功
(3)字符串提取与作者
把脱壳后的文件用 IDA 打开,查看字符串窗口并跳到数据段,很快看到两条关键信息:
图4 字符串 '(c) Raul Siles && David Perez'
图5 字符串 'otM 32 - September 2004'
结论:字符串显示的编写者是 Raul Siles 与 David Perez;另一条字符串实际上是 "SotM 32 - September 2004"(Scan of the Month 第 32 期,2004 年 9 月),说明该样本来自 The Honeynet Project 2004 年 9 月的 SotM 32 分析挑战。这两个人名其实另有含义,放到 3.3 第(7)问里展开。
3.2 IDA 分析 crackme1.exe 与 crackme2.exe
crackme1_20242327.exe
先跑两次摸清行为:不带参数时输出 "I think you are missing something.";随手带个参数 1 则输出 "Pardon? What did you say?"——可以确定它需要一个特定的命令行参数。
图6 crackme1 的两次试探运行
IDA 打开后看字符串窗口,一共四条提示语,其中 "I know the secret" 夹在三条报错信息中间,非常显眼,八成就是"钥匙":
图7 crackme1 的字符串窗口
带引号传入验证:
图8 crackme1 成功输出
crackme1 的答案:命令行参数 I know the secret。
crackme2_20242327.exe
同样的套路,先看字符串窗口:除了和 crackme1 相同的几条提示语,多了一个 crackmeplease.exe,还有两段乱码字符串('b#4!b#b.+.66.:b1.!0^6xb' 和 '-!-,#6')。反汇编里能看到两处 strcmp:一处把 argv[1] 与 "I know the secret" 比较,另一处把 argv[0] 与 "crackmeplease.exe" 比较——argv[0] 是程序自身的文件名,也就是说它还校验"你是谁"。
图9 crackme2 的字符串窗口(注意 crackmeplease.exe 和两段乱码)
图10 strcmp(argv[1], "I know the secret")
图11 strcmp(argv[0], "crackmeplease.exe")
先直接验证一下:
D:\cxdownload>crackme2_20242327.exe "I know the secret"
I have an identity problem.
输入对了却提示"身份问题",正好印证了 argv[0] 校验。按提示把文件复制改名为 crackmeplease.exe 再运行,成功输出 "We have a little secret: Chocolate":
图12 改名后成功输出
3.3 RaDa 恶意代码分析报告
(1)提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息
- 文件名称:RaDa_20242327.exe(原始名 RaDa.exe)
- 文件类型:PE32 executable for MS Windows 4.00 (GUI),Intel i386,3 个节(file 识别)
- 加壳信息:UPX 0.89.6 - 1.02 / 1.05 - 2.90(Markus & Laszlo),入口点 0x0000FD20 位于 UPX1 壳节(PEiD 识别)
- 编译信息:连接器版本 6.0,Win32 GUI 子系统;脱壳后结合宽字符字符串与 VB 运行库特征,可判断是 Visual Basic 编写的程序
- 文件大小:约 400 KB(原包),脱壳后有所增大
- 特征字符串:'otM 32 - September 2004'(即 SotM 32 - September 2004)、'(c) Raul Siles && David Perez'
- 样本背景:The Honeynet Project 2004 年 9 月 SotM 32 挑战样本
实际运营中识别同一样本,再加算一个 MD5/SHA1 哈希(md5sum 即可得到)与病毒库比对,配合上面的大小、PE 摘要和特征字符串,就足够唯一定位了。
(2)找出并解释这个二进制文件的目的
这是一个远程访问木马(RAT)/后门。它的运行逻辑是:被执行后把自己写进注册表 Run 启动项实现开机自启,然后隐藏窗口常驻,通过网络与控制端建立联系、接受远程命令——包括执行系统命令(调用 cmd.exe)、上传/下载文件、修改注册表等。本质上是给攻击者在受害主机上开一条隐蔽的远程控制通道。
(3)识别并说明这个二进制文件所具有的不同特性
- 网络通信能力:能主动向外连接控制端(也可监听端口),维持与 C2 的联系;
- 命令执行能力:能调用 cmd.exe 执行任意命令;
- 持久化能力:写注册表启动项,重启后自动运行;
- 隐蔽性:隐藏运行窗口、伪装自身;
- 实现特征:VB 编写 + UPX 加壳,配置和控制相关信息以 Unicode 字符串形式内嵌。
(4)识别并解释这个二进制文件中所采用的防止被分析或逆向工程的技术
一是加壳:用 UPX 压缩壳打包,静态分析看不到原始代码与字符串,必须先脱壳才能继续,这从 PEiD 的识别结果(入口点在 UPX1 节)可以证实。二是字符串以 Unicode 宽字符存储:关键信息用 Unicode 编码存放,不加 -el 的普通 strings 提出来就是乱码,提高了直接翻字符串的成本。
(5)对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由
分类为后门(Backdoor)/ 远程访问木马(RAT)。理由:它不会去感染其他正常文件,所以不是病毒;也不会利用漏洞自主复制传播,所以不是蠕虫;它的核心功能是驻留在受害主机里,为攻击者提供远程操控通道,符合后门/木马的定义。
(6)给出过去已有的具有相似功能的其他工具
Poison Ivy、DarkComet、njRAT、SubSeven、冰河,以及更早的 Back Orifice。它们同样是面向 Windows 的远控/后门工具,都提供远程命令执行、文件管理、注册表操作、屏幕监控之类的功能。
(7)可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可以,本实验实际上就做到了:在隔离虚拟机里先用超级巡警脱壳,再用 IDA 对脱壳后的文件提取字符串(见图4、图5),就能看到署名。限定条件包括:①必须在隔离的虚拟机/沙箱环境中运行样本,避免真机中毒;②样本必须先脱壳,否则关键字符串不可见;③提取工具要支持 Unicode 宽字符;④作者得留下署名或元数据(版权串、PDB 路径、编译时间戳等)且没有被抹除。
不过要说明一点:'(c) Raul Siles && David Perez' 结合 'SotM 32 - September 2004' 来看,更像是把样本提交给 Honeynet 挑战做分析的研究人员的署名,而不是原始作者的签名——真正幕后作者并没有直接留名。要进一步归因,还得靠编译器指纹、编译时间戳、同源样本聚类、威胁情报关联这些手段。这也说明字符串提供的是"线索",不一定是"结论"。
(8)给出至少 5 种检测该恶意软件的方法,需要详细介绍每种方法
- 基于特征码的静态扫描:从脱壳后的样本中提取稳定的特征串(如 'otM 32 - September 2004'、'(c) Raul Siles && David Perez')或独特的代码片段,生成签名加入病毒库,杀毒软件扫描文件时逐字节匹配。优点是速度快、误报低;缺点是只要改壳或改几个字节就能绕过。
- 沙箱动态行为监控:把样本放进受控沙箱运行,监控它是否写注册表 Run 启动项、是否隐藏窗口、是否调用 cmd.exe、是否监听或外连端口。命中敏感行为序列即报警。这种方法不看代码只看行为,能对抗加壳和混淆。
- 网络流量检测(IDS/IPS):在网关或主机上部署 Snort 等 IDS,针对该木马 C2 通信的特征(目的地址/端口、固定 URL、通信节奏)编写规则,检测异常出站连接。即使样本每次落地形态不同,只要它要"回家",就可能被网络侧抓到。
- 主机 IOC 与日志审计:对该样本的失陷指标(落地文件、注册表启动项键值、进程名等)做定期巡检,并结合 Windows 事件日志/Sysmon 记录发现持久化痕迹,适合事后排查和大规模资产清点。
- 内存扫描:程序运行时壳已经脱开、字符串在内存里是明文,安全软件可以定期扫描进程内存中的明文特征串或代码特征。对于"静态躲在壳里、运行时才还原"的威胁,内存扫描是有效的补充手段。
3.4 取证分析实践:Windows 2000 蜜罐被攻破并加入僵尸网络
数据源 botnet_pcap_file_20242327.dat 是 Snort 在蜜罐主机 172.16.134.191 上采集的 5 天网络流量,IP 和敏感信息已混淆。主要用 Wireshark(显示过滤器 + 追踪 TCP 流)和 Kali 里的 tcpflow 分析。
(1)IRC 是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
IRC 是互联网中继聊天(Internet Relay Chat)协议,一种基于 TCP 的多用户实时文本聊天协议,僵尸网络经常拿它当控制信道。客户端申请加入 IRC 网络时会依次发送注册消息:NICK(设置昵称)和 USER(提交用户名、主机、真实姓名),服务器设置了密码时还要先发 PASS。IRC 一般使用 TCP 6667 端口,6660–6669 范围内的端口也常见。这一点在图13 里能直接对应上:蜜罐外连 6667 端口后发出了 "Request (NICK) (USER)"。
(2)僵尸网络是什么?僵尸网络通常用于什么?
僵尸网络(Botnet)是攻击者通过木马/蠕虫等恶意程序控制大量互联网主机("肉鸡"),并使这些主机受控于同一个 C2(Command & Control)的Network。常见用途:发起 DDoS 攻击、发送垃圾邮件和钓鱼邮件、窃取敏感信息、刷流量/点击欺诈、挖矿,以及作为跳板发起进一步的攻击。
(3)蜜罐主机(IP地址:172.16.134.191)与哪些IRC服务器进行了通信?
用显示过滤器 ip.src == 172.16.134.191 && tcp.dstport == 6667 聚焦蜜罐外连 IRC 的流量:
图13 蜜罐外连 6667 端口的流量
可以看到蜜罐先后与 4 台 IRC 服务器通信,端口均为 6667:209.126.161.29(源端口 1127)、66.33.65.58(1129)、63.241.174.144(1133)、217.199.175.10(1139)。其中前两台只留下蜜罐反复重传的 SYN,连接并没有真正建立;后两台完成了三次握手,蜜罐随后发出了 NICK、USER 注册消息,正式登入 IRC 网络。
(4)在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
用 tcpflow 把与 209.196.44.172:6667 相关的 TCP 流拆成文件再统计:
tcpflow -r ../botnet_pcap_file_20242327.dat "host 209.196.44.172 and port 6667"
ls -1 | wc -l
ls -1 | grep "209.196.044.172.06667" | tr '-' '\n' | cut -d"." -f1-4 | sort -u | grep -v "^209\.196\.044\.172$" | wc -l
cat ./* | grep -aoE '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort -u | grep -vcE '^(209\.196\.44\.172|172\.16\.134\.191)$'
图14 重新拆流并统计僵尸网络规模
与 C2 相关的流大多是没有数据的 SYN/RST(第一次运行时 tcpflow 报告共 67 条),真正有数据、被落成文件的只有 3 个;按文件名统计对端 IP,除了服务器自己只剩蜜罐 172.016.134.191——因为抓包点在蜜罐一侧的链路上,其他僵尸主机并不会以独立 TCP 连接的形式出现。那它们在哪?蜜罐加入了 IRC 频道,服务器会把频道里所有成员的 JOIN/QUIT/NICK 消息(带"昵称!用户@IP"掩码,图14 里就有 :moinoonik!~moinoonik@61.111.228.17 JOIN 的样例)转发给它,所以几千台僵尸主机的 IP 都藏在流文件的内容里。用正则从内容中提取 IPv4 并去重(排除服务器与蜜罐自身),统计得到 3916 个不同的 IP,即观察期内至少有 3916 台不同的主机访问了该僵尸网络——近 4000 台的规模,侧面体现当年 IRC 僵尸网络的泛滥程度。
另外注意部分成员的掩码是域名而非 IP(如 pc0191.example.com),无法计入 IP 统计,所以 3916 是按 IP 统计的下限。
第一次分析时我按文件名统计只得到 2,排查过程见"问题及解决方案"问题3。
(5)哪些IP地址被用于攻击蜜罐主机?
结合后面两问的分析,真正对蜜罐发起攻击的是两个 IP:210.22.204.101(针对 445 端口 SMB,攻击成功)和 192.215.160.106(针对 1433 端口,攻击未成功)。此外五天里蜜罐还收到大量来自不同地址的端口扫描,但真正实施攻击的是上面两台。
(6)攻击者尝试攻击了哪些安全漏洞?
图15 192.215.160.106 对 1433 端口的反复 SYN(未成功)
一类是 192.215.160.106 针对 TCP 1433(MS SQL Server)的攻击尝试:图15 里只有反复重传的 SYN 且提示端口重用,连接始终没建立成功。另一类是 210.22.204.101 针对 TCP 445(SMB/CIFS)的攻击:利用的是 Windows 2000 主机 SMB 共享/管理员口令薄弱的缺陷——通过 IPC$ 连接完成认证后,再借助 \PIPE\ntsvcs(服务控制管理器管道)远程操作服务。
(7)哪些攻击成功了?是如何成功的?
成功的是 210.22.204.101 对 445 端口 SMB 的攻击。用 tcp.stream eq 79 追踪这条会话,过程完整清晰:
图16 SMB Write AndX 写入61440字节并创建 admdll.dll
图17 在流中检索到 r_server.exe /service(LocalSystem)
图18 IPC$ 连接与 \PIPE\ntsvcs 服务控制管道
结合三张图,攻击过程是:攻击者以管理员权限连入 \172.16.134.191\IPC$ → 通过 SMB Write AndX 写入 29408 字节的文件,并在 C:\WINNT\System32\ 下创建 admdll.dll(Radmin 远程管理组件)→ 用 Trans2 SET_FILE_INFO 修改文件时间戳抹掉痕迹 → 通过 \PIPE\ntsvcs 远程操纵 services.exe 创建服务 "C:\WINNT\System32\r_server.exe /service"(以 LocalSystem 权限运行),装好了 Radmin 远程控制后门。从抓包时间看,这次 SMB 入侵在前,之后蜜罐才开始出现与多台 IRC 服务器 6667 端口的通信(图13),说明它随后被植入了僵尸程序、加入了 209.196.44.172 控制的僵尸网络——这正是题目所说的"系统被攻破并加入僵尸网络"的完整因果链。而 192.215.160.106 的 1433 攻击只有反复的 SYN 重传,从未建立连接,是失败的。
4.问题及解决方案
-
问题1:恶意程序一下载就立马被删掉。(botnet_pcap_file_20242327.dat)
-
问题1解决方案:首先拼手速,下载瞬间就立刻打开wireshark,发现不行(有点傻),在Windows安全中心把他标记成安全的,就解决了。
-
问题2:crackme2 明明输入了正确的 "I know the secret",却输出 "I have an identity problem.",被吓一跳,感觉像鬼片,然后AI还一个劲告诉我复制一个然后就好了。
-
问题2解决方案:确实好了,但不太清楚原理。通过 IDA 反汇编,发现程序除了比较 argv[1],还用 strcmp 比较 argv[0] 与 "crackmeplease.exe"——校验的其实是程序自身的文件名。把 exe 复制改名为 crackmeplease.exe 后一次通过。
-
问题3:统计僵尸网络规模时,第一次按 tcpflow 文件名用
cut -d'-' -f2取对端 IP 去重,结果只有 2,明显不对。(应该很多……) -
问题3解决方案:先看 tcpflow 生成的文件名,发现命名格式是"发起方-接收方"、两种方向都存在,只取 -f2 会漏统计;但更本质的原因是:与 C2 相关的 67 条流大多是没有数据的 SYN/RST,落盘的只有 3 个文件,文件名里除了蜜罐没有别人——抓包点在蜜罐侧,其他僵尸主机是以 IRC 频道消息(nick!user@IP)的形式出现在文件内容里的。于是改为从文件内容中用正则提取 IPv4 去重统计,得到 3916 台(统计过程见 3.4 节图14)。
5.学习感悟、思考等
通过本次实验,我完整地走完恶意代码静态分析的全流程:识别、脱壳、提串、归因,后面又做了流量取证,其中印象最深的有三点。第一是"壳"的存在感:加壳的 RaDa 用 strings 扫出来几乎全是乱码,脱壳之后关键字符串一下就出来了;第二是字符串也会"说谎":我们提取出的 "(c) Raul Siles && David Perez" 看着就是作者署名,但结合 "SotM 32 - September 2004" 才知道这两位是把样本提交给 Honeynet 挑战的分析人员,真正的作者并没有留名——归因远比想象中难,字符串只是线索,不是结论。第三是取证题统计僵尸网络规模时我先按 tcpflow 文件名去数,结果只有 2,排查后发现问题不在命令而在思路——抓包点在蜜罐侧,别的僵尸主机根本不会以独立连接出现,它们藏在服务器转发过来的频道消息里,得去统计"内容"而不是"文件名"。这个弯绕得值:动手之前先想清楚"数据到底在链路上还是在内容里",比急着敲命令重要。
crackme2 中 argv[0] 校验也很有意思,"I have an identity problem." 这个提示设计得挺幽默,本质上提醒我们:程序的输入不只是你以为的那个输入。整体来说踩了不少坑,实验并不算一帆风顺,但每解决一个问题,对这些工具的理解就具体了一分。
参考资料
- 《网络攻防技术与实践》(诸葛建伟)
- 《恶意代码分析实战》(Michael Sikorski 等)
- RFC 1459: Internet Relay Chat Protocol
- The Honeynet Project(SotM 32 挑战)
- 课程实验指导博客(rocedu)
- UPX 开源项目