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

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

实验名称:恶意代码分析
实验环境:Kali Linux(VMware 虚拟机,host-only 断网)、Windows 宿主机(IDA Pro)
样本:RaDa.exe(rada 后门)、crackme1.exe、crackme2.exe

1. 基础知识

PE 文件结构:Windows 可执行文件以 MZ 开头,偏移 0x3C 处的 e_lfanew 指向 PE\0\0 签名,其后是文件头(Machine 说明架构)、可选头(Subsystem 说明是控制台还是图形界面)与节表。代码在 .text,只读数据与字符串在 .rdata,资源在 .rsrc。

加壳与脱壳:壳把原程序的节区压缩后塞进自己的节,改写入口点(OEP)指向解压代码,并把导入表削减到只剩 LoadLibraryA/GetProcAddress。因此加壳样本有三个可测量的痕迹:节名异常(UPX0/UPX1)、代码节熵接近 8.0、导入函数极少。脱壳分静态(工具直接还原文件)与动态(运行到 OEP 后 dump 内存并重建导入表)两条路;判断是否脱干净不能只看工具提示,要看节表、熵、导入表是否回到正常程序的样子。

字符串提取:strings 扫描连续可打印字符,默认只认 ASCII;VB6、.NET 等程序大量使用 UTF-16,必须加 -el 才能提取到宽字符字符串。作者署名、C&C 地址、注册表路径通常以常量形式躺在数据节里,加壳时看不见,脱壳后一目了然。

Visual Basic 6 程序特征:依赖 MSVBVM60.DLL,字符串以 Unicode 存储,编译器版本会写在 PE 里(可用 Detect It Easy 识别)。这类样本的字符串提取必须用宽字符模式。

IRC 与僵尸网络:IRC 是纯文本聊天协议,客户端连接后先发 NICK 设昵称、再发 USER 登记,服务器回 001~004 完成注册,之后 JOIN 进频道。默认端口 TCP 6667,常用 6660–6669。僵尸网络是被 C&C 统一指挥的受控主机集合,常用于 DDoS、发垃圾邮件、窃密、做跳板。

流量取证:capinfos 看数据规模 → tshark 显示过滤器缩小范围 → -T fields 导出字段做统计 → follow,tcp 重组会话读应用层内容。TCP 是字节流,统计昵称、URL 这类内容必须先做流重组。

2. 实验内容

任务 内容 主要工具
一 对 rada 样本做文件类型识别、脱壳与字符串提取,找出编写作者 file、readpe、Detect It Easy、超级巡警、UPX、strings
二 用 IDA Pro 静态/动态分析 crackme1.exe 与 crackme2.exe,找出能输出成功信息的输入 IDA Pro、Wine、gdb
三 分析 rada 样本并撰写报告(8 问) 同上
四 蜜罐 5 天流量取证(IRC 僵尸网络) capinfos、tshark、Wireshark

3. 实验过程

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

(1)文件格式、运行平台与加壳工具

file RaDa.exe
# RaDa.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386, UPX compressed

交叉验证截图
交叉验证截图
两种工具交叉验证的结果:

项目 结论 证据
文件格式 PE32 file 输出 + PE 头 Magic = 0x10B
运行平台 32 位 Windows(Intel i386,GUI 子系统) 文件头 Machine = 0x14C,Subsystem = 2
加壳工具 UPX 0.89.6 - 1.02 / 1.05 - 1.22 Detect It Easy 识别;file 显示 UPX compressed;节表异常、熵接近 8
编译语言 Visual Basic 6.00.8041 [Native] Detect It Easy 识别

节表在加壳状态下只有壳自己的节,代码节熵接近 7.9;导入表被削减到只剩壳所需的少数函数——这三条就是“加壳”的物证。

(2)脱壳

使用window系统下的软件进行脱壳:
执行结果
执行结果
在kali系统下查看结果:

upx -l RaDa.exe
# 确认壳版本与压缩率
upx -d RaDa.exe -o RaDa_unpacked.exe

执行结果
脱壳是否彻底,用四项数据验收(不看工具提示):

指标 加壳态 脱壳后 结论
节区数量与名称 异常节名(UPX0/UPX1 等) 恢复为 4 个正常节 通过
代码节熵 约 7.9 明显下降 通过
文件大小 约 21 KB 67.22 KiB 解压后变大,合理
导入表 仅壳所需少数函数 恢复为 VB6 运行时与业务 API 通过

执行结果
执行结果

(3)字符串提取与作者溯源

加壳状态下 strings 一无所获,所有字符串工作都在脱壳后的文件上做。该样本是 VB6 程序,字符串为 Unicode,必须用 -el:

strings -a -el -n 4 -td RaDa_unpacked.exe | grep -inE 'author|copyright|@|pdb|http'

结果:
执行结果
命中结果(文件偏移为十进制/十六进制):

偏移 字符串
6718 (0x1A3E) Security through obscurity is the key.
9124 (0x23A4) http://10.10.10.10/RaDa
11436 (0x2CAC) http://www.honeynet.org/scans/index.html
11524 (0x2D04) Copyright (C) 2004 Raul Siles & David Perez
12012 (0x2EEC) --authors
13156 (0x3364) Upload file using http And multipart/form-data
13256 (0x33C8) Copyright (C) 2001 Antonin Foller, PSTRUH Software
14340 (0x3804) Authors: Raul Siles & David Perez, 2004

结论:样本作者是 Raul Siles 与 David Perez(2004 年)。

三条证据互相印证:两处署名(0x2D04、0x3804)+ 程序内置的 --authors 参数(0x2EEC,运行即可打印作者)。

需要排除的一条干扰:偏移 0x33C8 的 Copyright (C) 2001 Antonin Foller, PSTRUH Software 并非样本作者,而是样本引用的第三方 HTTP multipart 上传组件(其配套字符串就是 0x3364 那条),属于“借来的代码”。

3.2 任务二:crackme1 与 crackme2 逆向

先对文件进行分析:
执行结果
执行结果

(1)在kali下盲跑,收集提示语

wine crackme1.exe            # I think you are missing something.   exit=1
wine crackme2.exe            # I think you are missing something.   exit=1

执行结果
执行结果
crackme1 有“参数缺失”和“口令错误”两个分支;crackme2 在口令之前多了一道身份校验,喂任何口令都报身份问题。
再查找关键行:
执行结果

(2)crackme1:单参数口令

strings 与 IDA 的 Shift+F12 均能看到三条关键字符串:I know the secret、Pardon? What did you say?、I think you are missing something.。在 IDA 中双击字符串按 X 定位引用,可见 strcmp(argv[1], "I know the secret"),不等则走失败分支。
执行结果

wine crackme1.exe "I know the secret"
# You know how to speak to programs, Mr. Reverse-Engineer
# exit=0

执行结果

(3)crackme2:身份校验 + 口令校验

strings 显示该样本含 crackmeplease.exe、I have an identity problem. 与 I know the secret。它要求 argv[0] 整串等于 crackmeplease.exe:

cp crackme2.exe crackmeplease.exe
wine crackmeplease.exe "I know the secret"
# I have an identity problem.   exit=2

改名本身不够——Wine 直接启动时传给程序的是完整路径 Z:\home\kali\...\crackmeplease.exe,整串比较必然失败。改由 cmd 拉起子进程,argv[0] 即“所敲的那串”纯文件名:

执行结果
执行结果
执行结果

printf '@echo off\r\ncrackmeplease.exe "I know the secret"\r\n' > run.bat
wine cmd /c run.bat
# We have a little secret: Chocolate
# exit=0

执行结果

样本 输入 输出 退出码
crackme1 I know the secret You know how to speak to programs, Mr. Reverse-Engineer 0
crackme2 改名 + cmd 启动 + I know the secret We have a little secret: Chocolate 0

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

(1)二进制文件摘要

项目 内容
文件名 RaDa.exe(脱壳后 RaDa_unpacked.exe)
文件类型 PE32 executable for MS Windows 4.00 (GUI), Intel i386(32 位图形界面程序)
文件大小 原文件 20.5 KB(20,992 字节),脱壳后 67.22 KiB(68,833 字节)
编译语言 Visual Basic (6.00.8041) [Native](Detect It Easy 识别)
加壳情况 UPX 0.89.6 - 1.02 / 1.05 - 1.22,脱壳成功,脱壳后恢复 4 个正常节区
MD5 CAA6985A43225A0B3ADD54F44A0D4C7
脱壳后的MD5 02BFA8E6D4ED8ED8049004FDAD840D2A
SHA-256 13C2379E9D9F679396E21A3391804CC834892F25691381B6D078D07B56D38F90
作者署名 Raul Siles & David Perez, 2004(字符串偏移 0x2D04、0x3804)
C&C 地址 http://10.10.10.10/RaDa(偏移 0x23A4)

其他内容如下:

执行结果
执行结果
执行结果

(2)二进制文件的目的

结合其 VB 编写、具备网络通信与隐藏特性的属性,该类样本通常是远程控制木马(RAT)或僵尸网络客户端(Bot)。

目的:在受害者主机上建立隐蔽后门,接受远程控制端(C2 服务器)的指令,进而实施文件窃取、系统破坏、作为 DDoS 肉鸡或横向移动的跳板。

本样本的具体证据支持这一点:

  • 控制通道硬编码为 http://10.10.10.10/RaDa,说明它通过 HTTP 与固定控制端通信;
  • 存在 Upload file using http And multipart/form-data 字符串,说明具备把受害者文件回传的能力;
  • 作者自述 Security through obscurity is the key.,说明其安全模型建立在“不引起注意”而非强加密之上;
  • C&C 使用 10.10.10.10 这类私有地址,且字符串中出现 Honeynet Project 的链接,说明该样本是为研究/教学环境构造的公开样本。

(3)二进制文件的不同特性

  • 伪装特性:程序名 RaDa 不含明显的恶意语义,运行后无窗口、无提示(GUI 子系统但后台静默),用于降低用户警觉。
  • 持久化特性:后门类样本通常将自身复制到 %AppData% 或系统目录,并修改 HKCU\Software\Microsoft\Windows\CurrentVersion\Run 实现开机自启。
  • 网络通信特性:主动外连硬编码的 C2 地址(http://10.10.10.10/RaDa),以 HTTP 请求伪装成普通 Web 流量,并周期性维持心跳。
  • 文件传输特性:内置 multipart/form-data 上传模块,可把受害者主机上的文件回传给控制端。
  • 自保护特性:通常使用互斥体(Mutex)防止重复运行,并带进程守护逻辑,避免被用户结束。
  • 作者指纹特性:程序内置 --authors 参数,运行即打印作者信息,与多数刻意抹除痕迹的恶意样本相反。

(4)防止被分析或逆向工程的技术

  • 加壳(Packing):使用经典 UPX 壳压缩可执行文件,使静态分析(直接 strings)看不到明文代码与字符串;这是本样本最主要、也是本次实验中实际验证到的反分析手段。
  • 字符串形态带来的干扰:VB6 程序字符串以 Unicode 存储,只跑 strings(ASCII 模式)会漏掉绝大部分内容,必须加 -el;这对初学者构成事实上的“提取门槛”。
  • 依赖隐蔽性:作者明示 Security through obscurity is the key.,其防护思路是“不被发现”,而非加密或反调试。
  • 反调试/反虚拟机(待确认):同类 VB6 后门常见 IsDebuggerPresent 调用或 VMware/VirtualBox 注册表键检测,但本次字符串证据中未见明确对应项,需在 IDA 中检查导入表与启动流程后确认,报告中不作定论。

(5)分类与理由

分类:木马(Trojan)/ 后门程序(Backdoor)。

理由:它不具备自我复制和感染其他正常文件的寄生能力(排除传统病毒);也不具备利用系统漏洞在无交互情况下自动扫描并感染其他主机的蠕虫特性;它依赖用户运行或通过其他渠道投放,随后在后台静默运行,为攻击者提供远程访问权限——符合木马/后门的定义。其 C2 模型具备僵尸网络客户端的雏形,但当前证据不足以判定为完整的 bot。

(6)具有相似功能的其他工具

工具 相似点
Gh0st RAT(红狼/黑防) 国内流传极广的远控木马,源码公开、变种多
Poison Ivy(毒藤) 经典远程控制木马,自定义协议 C2
PlugX 高级远程访问木马,APT 常用,模块化
灰鸽子 服务端生成、上线通知、持久化
Back Orifice 2000 早期后门范式,隐蔽驻留 + 远程控制
Meterpreter(Metasploit) 渗透测试载荷,后渗透功能强大(作对比参考)

(7)能否调查出开发者

可以,且本样本中已直接定位到作者。

依据:脱壳后的宽字符字符串在偏移 0x2D04 命中 Copyright (C) 2004 Raul Siles & David Perez,在 0x3804 命中 Authors: Raul Siles & David Perez, 2004;程序还内置 --authors 参数(偏移 0x2EEC),运行即主动打印作者信息。三处证据一致,判定作者为 Raul Siles 与 David Perez,时间 2004 年。

需要注意的限定条件:

  • 证据强度:署名与时间戳均可伪造,因此结论应表述为“高度可信”,而非法律意义上的作者认定;必要时需结合外部资料(公开研究文献、同作者其他样本的代码风格)交叉印证。
  • 分析环境:样本须在断网虚拟机中分析,且分析前先计算哈希,保证样本未被修改。
  • 干扰排除:偏移 0x33C8 的 Copyright (C) 2001 Antonin Foller, PSTRUH Software 属于样本引用的第三方上传组件,必须排除,否则会把库作者误当成样本作者。
  • 合规边界:溯源仅限静态分析与公开资料检索,不得对 C2 地址发起任何主动探测或攻击。

(8)检测该恶意软件的 8 种方法

  1. 基于特征码(签名)检测:提取原壳或脱壳后文件的 MD5/SHA-256,与杀毒软件特征库、威胁情报平台比对;也可编写 YARA 规则匹配其特有字符串(如 http://10.10.10.10/RaDa、Security through obscurity is the key.)。优点是零误报、速度快,缺点是改一个字节即失效,需配合模糊哈希(ssdeep)。
  2. 静态启发式扫描:分析 PE 结构——节区使用 UPX、被识别为 VB6 编写、导入表中含敏感 API(URLDownloadToFile、WScript.Shell、RegCreateKeyEx),组合命中即判定可疑。优点是不依赖样本库,能拦截加壳的未知样本;缺点是正常软件也会加壳,存在误报。
  3. 导入表 / API 组合特征:把“网络通信 + 注册表自启 + 文件操作 + 命令执行”四类 API 同时出现视为强信号,例如 InternetOpenUrlA 与 RegSetValueExA、ShellExecuteA 同现。
  4. 动态沙箱行为分析:将样本放入 Cuckoo Sandbox 或商业沙箱运行,监控其是否写入启动目录、修改 Run 键、外连未知 IP,并记录 API 调用序列。优点是能还原真实行为链;缺点是样本可能检测虚拟化环境而不执行。
  5. 网络流量监控(IDS/IPS):在网关部署 Snort/Suricata,监控与已知恶意 IP 的通信,或按“固定 URI + 固定请求周期 + multipart 上传”的流量特征告警。优点是边界侧即可发现、与主机无关;缺点是 HTTPS 与域前置会让内容不可见。
  6. 主机行为监控(EDR/Sysmon):监控进程树异常(Office/浏览器 → cmd)、%AppData%/%Temp% 下的可执行文件落地、Run 键写入。优点是直接反映“做了什么”,不受加壳影响;缺点是需要部署探针并维护白名单。
  7. 内存扫描:针对加壳样本,杀毒软件在运行时扫描进程内存(如 MSVBVM60 的内存空间),寻找解密后的代码特征,而不是只扫硬盘文件。优点是对抗加壳与多态;缺点是需要运行时介入。
  8. 日志关联 / SIEM 规则:把 DNS、代理、EDR 事件按主机聚合,用“Run 键写入 + 固定 URI 轮询 + 子进程执行”的三段式组合规则告警,体现纵深防御;缺点是规则调优成本高。

3.4 任务四:蜜罐 5 天流量取证

说明:课程资料包未随附该 pcap(botnet_pcap_file.dat),本机也未检索到该文件,故本节给出完整分析方案与判定标准。

数据源为 Snort 在蜜罐旁采集的 5 天流量,IP 已做混淆,蜜罐地址为 172.16.134.191。

(1)IRC 与加入消息、端口

IRC 是 1988 年出现的纯文本实时聊天协议,客户端—服务器模型,服务器之间可互联。客户端加入网络时依次发送:

NICK <昵称>
USER <用户名> 0 * :<真实姓名>
JOIN #<频道>

服务器注册成功后返回 001~004 数值应答。默认端口 TCP 6667,常用 6660–6669,另有 7000、6697(TLS)、194(服务器互联)。

(2)僵尸网络

指大量被同一套恶意代码感染、由 Botmaster 通过 C&C 通道统一指挥的主机集合;单台主机称 bot(肉鸡)。用途包括 DDoS、垃圾邮件与钓鱼、窃取账号与数据、代理跳板、分发恶意软件、点击欺诈与挖矿。

(3)蜜罐通信过的 IRC 服务器

capinfos botnet_pcap_file.dat
tshark -r botnet_pcap_file.dat -q -z io,phs | head -40
tshark -r botnet_pcap_file.dat \
  -Y 'ip.src==172.16.134.191 && tcp.dstport>=6660 && tcp.dstport<=6669' \
  -T fields -e ip.dst -e tcp.dstport | sort | uniq -c | sort -rn

对结果中的每个流用 tshark -q -z follow,tcp,ascii,<流号> 复核,看到 NICK/USER 与 001 欢迎语才计入。

(4)访问 209.196.44.172 的主机数量

两种口径互相印证:

# 口径 A:源 IP 去重
tshark -r botnet_pcap_file.dat -Y 'ip.dst==209.196.44.172 && tcp.dstport==6667' \
  -T fields -e ip.src | sort -u | wc -l

# 口径 B:从 NICK 消息提取昵称去重
tshark -r botnet_pcap_file.dat -Y 'tcp contains "NICK"' -T fields -e tcp.payload \
  | tr -d ':' | xxd -r -p | grep -ao 'NICK [^[:space:]]*' | awk '{print $2}' | sort -u | wc -l

两者通常不相等:NAT 后多台主机共用一个出口 IP 会使 IP 数偏少,bot 重连换昵称会使昵称数偏多。

(5)攻击蜜罐的 IP

判据为“主动发起的 SYN”:

tshark -r botnet_pcap_file.dat \
  -Y 'ip.dst==172.16.134.191 && tcp.flags.syn==1 && tcp.flags.ack==0' \
  -T fields -e ip.src -e tcp.dstport | sort | uniq -c | sort -rn | head -30

(6)被尝试的漏洞

按目的端口归类,再回载荷找指纹(详细端口—漏洞对照见下表):

端口 可能漏洞 载荷特征
135 MS03-026(Blaster) DCOM 绑定 + 超长路径
445 MS04-011 / MS08-067 / PsExec NTLMSSP、ADMIN$、PSEXESVC.EXE
80 MS03-007 WebDAV PROPFIND、/..%c0%af
1433/1434 SQL Slammer、弱口令 单包 376 字节 UDP 放大
4899 / 6129 / 5900 Radmin / DameWare / VNC 登录握手、长字符串

(7)哪些攻击成功及判定依据

四条证据链,任一成立即可判定主机被攻陷:

  1. 反弹 shell:tcp.port==4444 出现 Microsoft Windows 2000 [Version 5.00.2195] banner,其后跟随 dir、whoami 等交互;
  2. 二次载荷:udp.port==69 或 HTTP 下载,出现 tftp -i ... GET xxx.exe;
  3. SMB 写入:445 流中出现 NTLMSSP 认证成功 + PSEXESVC.EXE + ADMIN$ 访问;
  4. 事后上线:蜜罐首次外连 6667 发送 NICK 的时刻 T,回看 T 之前 5–10 分钟的入站会话,定位得手的那次攻击。

4. 问题及解决方案

  • 问题 1:超级巡警在 Wine 下启动后报“加载脱壳引擎失败”,无法脱壳。

  • 问题 1 解决方案:检查发现其 plugins 目录为空,脱壳引擎未随包发布,属工具环境缺陷。改用 window下脱壳,并用“节数、熵、导入表、OEP”四项数据验收,脱壳后文件恢复 4 个正常节区。

  • 问题 2:wine 运行样本时报大量 ole:...MarshalInterface 与 start_rpcss failed 错误。

  • 问题 2 解决方案:判定为 32 位运行库缺失、Wine 前缀按 64 位初始化。执行 dpkg --add-architecture i386 安装 wine32:i386,删除旧前缀后用 WINEARCH=win32 WINEPREFIX=~/.wine32 wineboot -u 重建,正常。

  • 问题 3:winedbg --gdb 调试 crackme2 时直接崩溃(Internal crash at 00006FFFFCBE0A8A)。

  • 问题 3 解决方案:改用静态分析(IDA Shift+F12 找字符串、X 看交叉引用)定位校验逻辑;winedbg 崩溃是 Kali 上 Wine 调试器的已知问题,不影响静态结论。

  • 问题 4:crackme2 改名为 crackmeplease.exe 后仍报“I have an identity problem.”。

  • 问题 4 解决方案:抓取其进程创建参数发现 argv[0] 是完整路径 Z:\home\kali\...\crackmeplease.exe,而样本要求整串等于 crackmeplease.exe。改用 wine cmd /c run.bat 由 cmd 拉起子进程,argv[0] 变为纯文件名,校验通过并输出成功信息。

  • 问题 5:脱壳后的 dump 文件运行报 0xc0000135(找不到 DLL)。

  • 问题 5 解决方案:判断为 dump 时只还原了内存镜像、未重建导入表,程序无法定位 kernel32 等导入。该文件仅用于静态分析(strings、IDA),不用于动态运行。

5. 学习感悟、思考等

这次实验最大的体会是:结论必须由数据推出来,而不是由印象写出来。

任务一里我一开始以为壳就是 UPX,后来发现脱壳产物的节名是 JDR0/JDR1,才意识到“加壳工具”这一栏要拿 upx -l 和 DIE 的结果说话,不能照抄模板。同样,作者这一问最有价值的不是记住“Raul Siles & David Perez”这个名字,而是理解为什么要排除偏移 0x33C8 那条 PSTRUH 版权——它是样本借用的第三方上传组件。能从一堆字符串里分辨出“谁的代码”和“借了谁的代码”,才是字符串分析真正的门槛。

任务二让我第一次直观看到“运行环境也是校验条件”。crackme2 的口令明明是对的,卡住的原因却是 argv[0] 带了完整路径。这提醒我:分析样本时,程序的运行上下文(路径、用户名、机器名、父进程)本身就是攻击面的一部分,很多反分析手段就藏在这些“非代码”的地方。

另一个收获是工具链的脆弱性。超级巡警的插件缺失、winedbg 崩溃、dump 的导入表没修复——这些问题都不是“我不会”,而是实验环境的现实。学会判断“这是工具的锅还是我的锅”,并用替代方案(upx -d、静态 IDA、只做静态分析)绕过,比死磕一个工具更有价值。

参考资料

实验指导书

posted @ 2026-11-10 21:29  髯鸸  阅读(4)  评论(0)    收藏  举报