20232310 2025-2026-1 《网络与系统攻防技术》实验四实验报告
1.实验内容
1.1识别恶意代码的文件类型标识,进行脱壳与字符串提取。
1.2使用IDA Pro静态或动态分析所给exe文件,找到输出成功信息的方法。
1.3分析自制恶意代码样本并撰写报告。
1.4取证分析实践。
2.实验目标
完成样本分析与取证报告撰写,最终掌握恶意代码分析、逆向工程及网络取证的核心方法,明晰僵尸网络机制及IRC协议应用,提升识别恶意代码、分析网络攻击与解决安全问题的能力。
3.实验环境
| 环境类型 | 配置详情 |
|---|---|
| 虚拟机 | Kali Linux,内存4GB,处理器 4 核,硬盘80GB,网络桥接模式 |
| 主机系统 | Windows11(用于运行PEiD、IDA Pro 等工具) |
| 核心工具 | PEiD v0.95、超级巡警虚拟机自动脱壳器V1.3、IDA Pro、Wireshark、tcpflow、tcpdump |
4.实验过程
4.1 恶意代码文件类型标识、脱壳与字符串提取
4.1.1 文件类型与加壳识别
首先对目标样本RaDa.exe进行基础分析,明确其文件属性与加壳情况:
在Kali虚拟机中执行file RaDa.exe命令,识别文件类型。结果显示该文件为PE32 executable for Ms Windows 4.00(GUI),针对Intel i386架构,包含3个段,确认是32位Windows图形界面可执行程序。

通过strings查看其内部数据,看看有没有什么特点

发现结尾还是有点特点的

在Windows主机中使用PEiD工具分析加壳情况。检测到该文件采用UPX加壳技术,版本区间为0.89.6-2.90,开发者为Markus&Laszlo,同时显示入口点0000FD20、文件偏移00004120等关键信息。

4.1.2 脱壳处理
使用“超级巡警之虚拟机自动脱壳器”对RaDa.exe进行脱壳:
打开脱壳工具,自动识别UPX壳。
点击脱壳,成功生成脱壳后的文件RaDa_unpacked.exe,输出路径默认保存在原文件目录下。

4.1.3 打开IDA Pro,选择PE Executable,即对Windows下的可执行文件进行分析。

所需分析的文件是经过脱壳后的RaDa_unpacked.exe文件。

默认配置完成反汇编。
选择IDA ViewA,在地址为00403F7A处可以看到RaDa文件的作者信息,为Raul Siles && David Perez;在地址为00403FD4处可以看到RaDa文件的创作时间,为2004年9月。

4.2 使用IDA Pro静态或动态分析crackme1.exe与crakeme2.exe,寻找特定输入,使其能够输出成功信息。
4.2.1分析文件crackme1.exe
在cmd中直接运行crackme1.exe,观察:
无参数输入:输出 “I think you are missing something.”
输入1个任意参数:输出 “Pardon? What did you say?”
输入2个及以上参数:输出 “I think you are missing something.”
初步认为程序需要特定格式的1个参数才能输出成功信息。

在IDA Pro中打开文件crackme1.exe,选择View→Graphs→Function calls,打开该文件的函数调用图。


函数调用图中,函数sub_401280调用了如fprint、print等函数,这些函数多用于字符串输入输出,因此sub_401280函数中可能存在我们需要的参数信息

选择Windows→Functions,打开函数管理工具。

双击需分析的函数sub_401280,打开该函数的流程图

在最上面main函数中,倒数第二行“cmp [ebp+arg_0],2”为判断是否有程序名和一个用户参数,main函数通常为int main(int argc,const char **argv),即第一个参数 argc 对应argv 的大小,第二个参数对应命令行的格式。
输入的参数不为2时,该程序将给出输出“I think you are missing something.”。当程序得到两个输入时,如果第二个输入为“I know the secret”,则程序给出输出“You know how to speak to programs, Mr. Reverse-Engineer”;否则输出“Pardon? What did you say?”。因此,我们需要输入的第二个参数为字符串“I know the secret”。

我们也输入这个参数试试,成功了

4.2.2分析文件crackme2.exe
在cmd中运行此文件,发现返回情况与crackme1.exe相似.但输入额外参数为“I know the secret”时,仍然无法验证通过,
说明还需寻找对应的正确参数

打开crackme2.exe的函数调用图,我们可以发现函数sub_401280会调用strcmp、fprintf、puts等函数,
这说明sub_401280函数可能是对参数进行判断的函数。

打开函数sub_401280的流程图,可以发现crackme2除了对“I know the secret”比较,
还对输入的第一个参数进行了比较,要求其为“crackmeplease.exe”

我们将该文件的文件名修改为crackmeplease.exe,再次运行
因为对第一个参数有要求,所以.\加在前面就会失败,要注意。

4.3 分析一个自制恶意代码样本rada
4.3.1 分析文件的基本信息
依次输入:
file RaDa.exe #识别文件类型
md5sum RaDa.exe #计算文件的md5摘要值
exiftool RaDa.exe | grep "Time Stamp" #提取文件元数据并过滤时间戳信息
我们可以看到:
文件类型:32位Windows GUI程序,针对X86,有三个字段
md5摘要值:caaa6985a43225a0b3add54f44a0d4c7
时间戳信息:2004:10:30 07:59:58+08:00

4.3.2 观察二进制文件的目的
使用IDA Pro分析脱壳后的RaDa_unpacked.exe文件,打开函数调用图,重点拆解sub_404FB0函数,它包含大量子函数调用,推测为核心逻辑模块。

打开流程图

首先是远程通信配置,发现命令mov edx, offset aHttp10_10_10_1;"http://10.10.10.10/RaDa"
而这个命令是将地址http://10.10.10.10/RaDa加载到edx寄存器。这说明IP地址10.10.10.10很可能是攻击者的命令控制服务器。

后续调用字符串拼接函数,分别将四个字符串复制到内存中。RaDa_commands.html可能是攻击者用来下发指令的网页文件。cgi-bin可能是Web服务器上存放脚本的目录。download.cgi可能是用于下载新指令或恶意模块的脚本。upload.cgi可能是用于上传窃取数据的脚本。

然后是本地环境构建,通过mov edx, offset aCRadaTmp指令,在 C 盘创建 “C:\RaDa\tmp” 目录,用于存储临时恶意文件或窃取的数据

再次是长期运行的保障,代码中包含修改注册表路径"Software\Microsoft\Windows\CurrentVersion\Run"的逻辑,将自身添加为开机自启动项,确保系统重启后仍能运行。

命令mov edx, offset aCRadaBin ; "C:\RaDa\bin",是将"C:\RaDa\bin"复制到内存。随后连续调用两次字符串拼接函数,得到完整的可执行文件路径“C:\RaDa\bin\RaDa.exe”。这个路径将被用于保存自身的文件,并完成开机自启动配置。

尝试运行脱壳后的RaDa进程,发现超时,被阻止。(但是其实应该已经成功了,我重启电脑后,又出现了弹窗,我只能去删除exe文件和注册表)

4.3.3 问题回答
(1)提供对这个二进制文件的摘要,包括可以帮助识别同一样本的基本信息。
文件类型:PE32 executable,针对Intel i386架构,包含3个段;
唯一标识:MD5 哈希值为caaa6985a43225a0b3add54f44a0d4c7;
采用 UPX 加壳(版本0.89.6-2.90),入口点 0000FD20,文件偏移 00004120;
编译时间为2004年10月30日,代码中提取到作者信息“Raul Siles && David Perez”,创作时间“September 2004”;
调用“MSVBVM60.DLL”“LoadLibraryA”等,依赖 Windows 系统环境。
(2)找出并解释这个二进制文件的目的。
该文件是一个远程控制后门。因为它建立了与服务器http://10.10.10.10/RaDa的通信,接收攻击者下发的指令。
还在C盘创建“C:\RaDa\tmp”“C:\RaDa\bin”目录,用来存储恶意脚本或者偷窃的数据。
而且通过修改Windows注册表“Software\Microsoft\Windows\CurrentVersion\Run”项,实现了开机自启动。
(3)识别并说明这个二进制文件所具有的不同特性。
基于HTTP协议与服务器交互,指令与数据使用不同的传输路径。
通过注册表自启动项实现系统重启后仍能运行,增强隐蔽性。
仅支持Windows系统,依赖“MSVBVM60.DLL”等组件,无法在Linux运行;
使用 UPX 加壳隐藏原始代码。
(4)识别并解释这个二进制文件中所采用防止被分析或逆向工程的技术。
该文件采用的反分析技术主要为UPX加壳保护。初始使用IDAPro分析原始文件时,仅能获取壳代码逻辑,核心字符串信息杂乱无章,无法识别恶意功能相关指令;经超级巡警脱壳工具处理后,才能还原原始代码结构,提取到C&C服务器地址、本地目录路径等关键信息。
(5)对这个恶意代码样本进行分类(病毒、蠕虫等),并给出你的理由。
归类为后门程序,理由如下:不具备病毒的自我复制感染特性,也无蠕虫的主动传播能力,需通过人工植入或载体传播进入目标系统;
核心行为是隐蔽驻留目标系统,通过远程通信接口接收控制指令,支持攻击者对目标主机进行文件管理、命令执行等远程操作。
这些行为符合后门程序定义。
(6)给出过去已有的具有相似功能的其他工具。
BackOrifice,早期远程控制后门工具,支持通过自定义协议实现文件操作、注册表修改等远程控制功能;
灰鸽子,具备持久化驻留、屏幕监控、敏感信息窃取等功能,通过C&C服务器实现对目标主机的远程管理;
NetBus,通过TCP/IP协议实现远程控制,支持文件上传下载、系统命令执行,与RaDa的C&C通信逻辑具有一致性。
我们用过的创造后门的软件msfvenom和veil。
(7)可能调查出这个二进制文件的开发作者吗?如果可以,在什么样的环境和什么样的限定条件下?
可能。因为脱壳后通过IDAPro分析,在地址00403F7A处提取到作者信息“RaulSiles&&DavidPerez”,创作时间标注为2004年9月。
如果这是开发者真名的话很可能查到。然后还可以在早期网络安全论坛、恶意代码分析社区,特别是2004年的,查一查有没有RaDa相关的痕迹。
(8)给出至少5种检测该恶意软件的方法,例如基于特征码的方法,需要详细介绍每种方法。
1.特征码检测:提取样本的MD5哈希值、UPX加壳特征字节作为特征码,导入杀毒软件,对文件系统进行扫描,匹配到特征码即判定为恶意。
2.行为检测:通过主机安全工具如Sysmon监控程序运行行为,重点检测是否存在修改注册表自启动项、创建“C:\RaDa”系列目录、发起可疑IP连接等异常操作,当异常行为触发时,判定为恶意软件。可有效检测加壳或变种样本。
3.网络流量检测:在网络防火墙或IDS中配置规则,拦截指向C&C服务器IP 10.10.10.10的通信流量,或包含“RaDa_commands.html”“cgi-bin/download.cgi”等特定路径的HTTP请求。
4.沙箱动态检测:将样本放入隔离沙箱环境中运行,记录其注册表操作、网络连接等行为。沙箱自动生成行为报告。
5.启发式检测:基于恶意代码共性特征构建检测规则,若程序同时满足“UPX加壳+修改系统关键注册表+发起非标准端口通信”等条件,即使未匹配到具体特征码,也判定为高风险恶意软件。
4.4 取证分析实践
4.4.1 IRC是什么?当IRC客户端申请加入一个IRC网络时将发送那个消息?IRC一般使用那些TCP端口?
(1)IRC是InternetRelayChat(互联网中继聊天)的缩写,是一种基于文本的实时通信协议。它采用客户端-服务器模型,用户通过IRC客户端连接到服务器后,可加入频道进行群聊或与其他用户私聊。
(2)IRC客户端申请加入网络时,要发送NICK命令和USER命令,部分情况需补充PASS命令。
NICK命令用于设置用户在网络中的唯一昵称,比如“20232310User”;
USER命令提供用户的基础信息如用户名、主机名,完成身份注册;
若服务器设置了访问口令,需先发送PASS命令输入口令,再进行注册。
(3)6667端口:最常用的默认非加密端口,明文传输数据;
6697端口:常用的SSL/TLS加密端口;
6660-6669端口:作为备用非加密端口。
4.4.2 僵尸网络是什么?僵尸网络通常用于什么?
僵尸网络是指由攻击者通过恶意软件如后门感染大量互联网设备,并在用户不知情的情况下形成的受控网络。
这些被感染的设备被称为“僵尸主机”或“肉鸡”,攻击者通过一台或多台C&C服务器,向所有僵尸主机下发统一指令,实现集中操控。
用于DDoS攻击、发送垃圾邮件、加密货币挖矿、充当网络跳板等。
4.4.3 蜜罐主机(IP地址:172.16.134.191)与那些IRC服务器进行了通信?
与IP地址209.126.161.29、66.33.65.58、63.241.174.144、217.199.175.10的IRC服务器进行了通信。
在Wireshark中打开botnet_pcap_file.dat文件,通过ip.src==172.16.134.191 and tcp.dstport==6667,筛选源IP为172.16.134.191,目的端口为6667的tcp数据包。分析可知,蜜罐主机与4台IRC服务器进行通信,IP分别是209.126.161.29、66.33.65.58、63.241.174.144、217.199.175.10。

4.4.4 访问过服务器的僵尸网络
问:在这段观察期间,多少不同的主机访问了以209.196.44.172为服务器的僵尸网络?
答:有3461个不同的主机访问了这一僵尸网络。
在kali虚拟机依次输入
sudo apt update
sudo apt-get install tcpflow
安装tcpflower

tcpflow --version查看版本

输入tcpflow -r botnet_pcap_file.dat “host 209.196.44.172 and port 6667”
使用tcpflow,从botnet_pcap_file.dat文件中,筛选出与IP为209.196.44.172且端口为6667的主机相关的所有TCP流量数据。
生成report.xml报告文件

查找源IP为209.196.44.172的文件,使用命令
cat 209.196.044.172.06667-172.016.134.191.01152 | grep -a "^:irc5.aol.com 353" | sed "s/^:irc5.aol.com 353 rgdiuggac @ #x[^x]*x ://g" | tr ' ' '\n' | tr -d "\15" | grep -v "^$" | sort -u | wc -l
发现有3461台不同的主机访问了以209.196.44.172为服务器的僵尸网络
grep -a "^:irc5.aol.com 353":筛选出以irc5.aol.com 353开头的行
sed ...:用sed命令删除每行开头的固定前缀,只保留成员名称部分。
tr ' ' '\n':将成员名之间的空格换成换行符,让每个成员名单独占一行。
tr -d "\15":删除文本中的回车符。
grep -v "^$":排除空行,只保留有效内容。
sort -u:对成员名排序并去重。
wc -l:统计最终的行数,即该IRC频道的独立用户数量。

4.4.5 被用于攻击蜜罐主机的IP地址
问:哪些IP地址被用于攻击蜜罐主机?
答:165个IP地址,具体如下

怎么操作的呢?输入:
tcpdump -n -nn -r botnet_pcap_file.dat 'dst host 172.16.134.191' | awk -F " " '{print $3}' | cut -d '.' -f 1-4 | sort | uniq | more > 20232409_1025.txt;wc -l 20232409_1025.txt,从botnet_pcap_file.dat
awk -F " " '{print $3}':用awk提取每行的第3个字段即“源IP.端口”。
cut -d '.' -f 1-4:把“源IP.端口”中的IP部分提取出来。
sort | uniq | more > 20232310.txt:对提取的IP地址排序、去重,分页显示后保存到20232310.txt 文件中。
wc -l 20232409_1025.txt:统计该文件的行数,也就是攻击172.16.134.191的IP总数。

4.4.6 攻击者使用的安全漏洞
在Wireshark中打开数据包文件,通过Statistics→Protocol Hierarchy查看协议分布:
攻击者主要使用TCP数据包发起攻击,占比约99.7%;
仅使用少量UDP数据包,占比约0.3%。

在Kali终端中使用指令
tcpdump -r botnet_pcap_file.dat -nn 'src host 172.16.134.191' and tcp[tcpflags]== 0x12 | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq
筛选主机172.16.134.191发起的所有TCP的源端口号

输入
tcpdump -r botnet_pcap_file.dat -nn 'src host 172.16.134.191' and udp | cut -d ' ' -f 3 | cut -d '.' -f 5 | sort | uniq
筛选主机172.16.134.191发送的所有UDP数据包的源端口号

4.4.7 成功的攻击与原因
成功的攻击有:TCP连接445端口、4899端口、80端口
(1)TCP连接135端口
用Wireshark打开botnet_pcap_file.dat,过滤条件为ip.addr==172.16.134.191 and tcp.port==135。

只有三次握手,没有后续的恶意数据包,所以没被成功使用
(2)TCP连接139端口
过滤条件为ip.addr==172.16.134.191 and tcp.port==139

攻击者尝试访问共享目录\PC0191\c,但服务器返回RST拒绝访问,后续也没有恶意数据包,所以没被成功使用
(3)TCP连接25端口
过滤条件为ip.addr==172.16.134.191 and tcp.port==25

有三次握手。但建立后,没有后续的恶意数据包,且服务器很快发送FIN,ACK请求断开连接,所以没被成功使用
(4)TCP连接445端口
过滤条件为ip.addr==172.16.134.191 and tcp.port==445

进行了大量重复的NTLMSSP认证,看起来像是在进行扫描,获取目标主机存在的活跃信息。
将过滤后的分组输出位csv,交给ai,让它生成Python脚本,再深挖

在 SMB 协议相关记录中,出现多次对 \System32\PSEXESVC.EXE 的删除请求与响应。可能是攻击者为清除痕迹或阻止后续检测而采取的行动
所以成功利用了该端口。

(5)TCP连接4899端口
过滤条件为ip.addr==172.16.134.191 and tcp.port==4899

大量rbakcupl > radmin-port [PSH,ACK]数据包,表示攻击者通过4899端口持续传输数据。
然后攻击者通过HTTP请求,发送目录遍历攻击HEAD /cgi/../../../../../winnt/system32/cmd.exe?/c+dir

(6)TCP连接80端口
过滤条件为ip.addr==172.16.134.191 and tcp.port==80

查看后续的数据包可知,在正常的TCP三次握手后,攻击者向80端口发送了由大量字符“c”,这是一个缓冲区溢出攻击。

(7)UDP连接137端口
过滤条件为ip.addr==172.16.134.191 and udp.port==137

数据包内容均为正常的名称查询与响应,未包含任何攻击
5.问题及解决
问题1:在powershell中运行改名后的crackmeplease.exe失败
问题1解决方案:参考同学的方法,我改成使用cmd运行,并且不使用".",避免了第一个参数不同。
原来PowerShell会自动加“./”影响文件名识别。
问题2:看同学的博客,不懂怎么才能在几万行的数据包中找到恶意攻击,同学们好像都是直接跳过去的
问题2解决方案:考虑到现在的ai都可以直接在服务器运行代码,我将.dat文件过滤后输出为csv文件,
然后投喂给ai,让ai帮忙写代码,进行深度检索,从而找到恶意攻击。
我询问了王老师,老师说熟练之后,可以直接一行一行往下看,也很快就能找到。
6.心得体会
通过这次恶意代码分析实验,我系统掌握了恶意代码分析的核心技术。从文件识别、脱壳、字符串提取到静态动态分析和IDA Pro的使用,都让我对网络安全领域的逆向思维有了更具体的认知。
分析crackme2时遇到问题,明明参数和文件名都改对了,在PowerShell里却一直报错,后来查资料才发现PowerShell会自动加“./”影响文件名识别,换成CMD就成功了,不同命令行工具的细节差异会直接影响结果。
用IDA分析函数流程时,我一开始对着复杂的调用图找不到重点,后来试着聚焦strcmp、printf这些关键函数,慢慢理清了参数判断逻辑。
特别是ai的运用,在分析大量数据时很有效果,可以方便我们新手快速定位。
现在我对网络攻防的兴趣更浓了,以后想深入学习动态调试和恶意代码对抗技术,争取能更高效地识别和防御各类安全威胁。

浙公网安备 33010602011771号