20242407 2026-2027-1《网络与系统攻防技术》实验四实验报告
实验四 恶意代码分析实践
一、基础知识
1.1 PE文件结构
PE是Windows操作系统中常见的可执行文件格式,主要包括EXE、DLL等文件类型。PE文件具有相对固定的组织结构,主要由DOS头、PE文件头、可选头、节区表和各个数据节区组成。不同部分保存着程序运行所需要的基本信息,例如目标平台、入口点地址、内存布局以及依赖的外部函数等。
PE文件中的节区用于存放不同类型的数据,常见的有.text、.data、.rdata和.rsrc等。其中,.text通常保存程序的执行代码,.data和.rdata分别用于保存可读写数据和只读数据,.rsrc则主要保存图标、对话框等资源信息。导入表记录了程序运行过程中需要调用的DLL及其函数,可以通过分析导入函数判断程序可能具有的功能。
在恶意代码分析中,PE结构是识别文件类型和判断程序特征的重要依据。通过检查文件头、节区数量、入口点和导入表,可以初步了解样本的编译环境和程序结构,同时也能够发现部分异常的文件特征。
1.2 加壳与脱壳
加壳是一种对可执行文件进行压缩、加密或代码保护的技术。经过加壳处理后,程序原本的代码和部分数据可能被隐藏,文件入口点通常会指向壳程序的代码,而不是原始程序的入口位置。当程序运行时,壳代码会先执行解压缩或解密操作,再将恢复后的程序代码交给系统执行。
常见的加壳工具包括UPX等。部分程序会使用修改过的加壳方式,使普通脱壳工具无法直接识别或处理。加壳会影响静态分析的效果,例如直接使用字符串提取工具时,可能只能获得少量壳程序自身的字符串,而无法看到原始程序中的关键内容。
脱壳的目的就是尽可能恢复程序原来的代码和数据结构。常见方法包括使用专门的脱壳工具,以及在程序运行过程中分析内存中的解压结果并进行转储。需要注意的是,脱壳或内存转储得到的文件不一定与原始文件完全一致,因此通常还需要重新检查文件格式、节区结构和导入表。
本次实验中,RaDa样本存在修改过的UPX加壳特征,因此需要结合文件识别工具、脱壳转储结果和字符串提取等方法进行分析。
1.3 字符串提取
字符串提取是恶意代码静态分析中比较常用的方法。程序在编译过程中可能会将网址、文件路径、注册表位置、命令名称和错误提示等信息保存在可执行文件中。通过提取这些字符串,可以在不运行程序的情况下初步了解程序可能具有的功能。
常见的字符串提取工具包括Linux系统中的strings命令。根据字符串的编码方式,可以分别提取ASCII字符串和Unicode字符串。例如,使用strings -a可以提取普通ASCII字符串,使用strings -el可以提取UTF-16小端编码的字符串。对于经过加壳、压缩或加密处理的程序,直接提取字符串可能无法获得完整结果,因此通常需要先进行脱壳或转储处理。
字符串提取的结果还需要结合程序代码进行验证。例如,发现一个网址只能说明程序中保存了该地址,并不能直接证明程序一定会访问它;还需要通过IDA等工具查找该字符串的交叉引用,进一步确认它在哪个函数中被使用,以及对应的程序功能。
在本次实验中,通过提取RaDa转储文件中的字符串,发现了C2通信地址、文件上传下载接口、系统目录和作者信息等内容,为后续分析提供了重要线索。
1.4 静态分析与反汇编
静态分析是指在不直接运行目标程序的情况下,通过检查文件结构、字符串、导入表和机器指令等信息研究程序行为。与动态分析相比,静态分析不会直接改变目标系统状态,能够从程序内部了解其功能实现方式,因此常用于恶意代码的初步分析。
反汇编是静态分析的重要手段。编译后的程序由机器指令组成,反汇编工具可以将这些指令转换为汇编语言,帮助分析人员理解程序的执行过程。IDA Pro是一款常用的逆向分析工具,能够识别程序中的函数、条件跳转和函数调用关系,并提供流程图和交叉引用等功能。
在IDA中,可以通过字符串窗口找到程序中的关键字符串,再利用交叉引用定位引用该字符串的代码位置。随后结合寄存器操作、参数传递、比较指令和条件跳转等内容,分析对应函数的执行逻辑。如果某些函数无法通过F5生成伪代码,也可以直接查看汇编指令完成分析。
本次实验中的两个Crackme程序就采用了字符串比较和条件跳转进行输入验证。通过分析strcmp调用及其返回值,可以确定正确的输入条件;对于RaDa样本,则主要通过字符串交叉引用和函数调用关系还原远程通信、命令执行及文件传输等功能。
1.5 恶意代码检测技术
恶意代码检测是通过分析文件特征或运行行为,判断目标程序是否具有恶意属性的过程。由于不同恶意代码在文件结构、代码内容和运行行为方面存在差异,因此实际检测中通常采用多种方法相互配合。
基于哈希的检测是比较常见的方法。MD5可以将文件内容转换为固定长度的摘要值,通过与已知样本库中的哈希值进行比较,可以快速判断文件是否与某个已知样本完全一致。这种方法速度较快,但文件内容发生变化后,摘要值也会随之改变,因此无法有效识别所有变种。
YARA是一种基于规则的文件识别工具,可以根据字符串、字节序列和文件结构等特征编写检测规则。PE结构检测则主要关注文件头、节区、入口点和导入表等信息。此外,还可以通过提取程序中的网址、文件路径和注册表位置等字符串建立特征规则。
除了静态检测,还可以通过动态行为监控观察程序运行时的进程创建、文件操作、注册表修改和网络通信等行为。不同检测方法各有适用范围,例如哈希适合识别已知样本,YARA适合根据特征匹配同类文件,行为检测则可以发现部分静态分析难以确认的恶意操作。本次实验结合MD5、YARA、PE结构和字符串等方法对RaDa样本进行了检测。
1.6 远程访问木马
远程访问木马(Remote Access Trojan,RAT)是一类能够使远程操作者控制受感染主机的恶意程序。它通常由运行在目标主机上的客户端程序和远程控制端组成,两者通过网络建立通信,客户端根据控制端发送的指令执行相应操作。
远程访问木马通常具有多种功能,包括远程命令执行、文件上传下载、屏幕截图、系统信息获取和进程管理等。部分程序还会通过修改注册表启动项、创建系统服务等方式实现持久化,使程序在系统重启后仍然能够运行。此外,一些样本会检查虚拟机环境、使用延时执行或加壳等技术,增加分析和检测的难度。
远程访问木马通常通过命令与控制(Command and Control,C2)服务器接收任务。C2服务器负责向受控主机下发命令,受控主机则根据指令执行操作并返回结果。因此,分析远程访问木马时,需要重点关注通信地址、命令分发逻辑、文件操作函数以及系统调用等内容。
本次实验分析的RaDa样本具有远程通信、命令执行、文件传输和屏幕截图等功能,符合远程访问木马的主要特征。
1.7 IRC与僵尸网络
IRC(Internet Relay Chat)是一种基于客户端和服务器模式的实时互联网聊天协议,用户可以通过IRC客户端连接服务器,并加入指定频道进行消息交流。IRC客户端连接服务器后,通常需要发送NICK命令设置昵称,发送USER命令提交用户信息,完成注册后再使用JOIN命令加入频道。
IRC协议中还有一些常见的命令和响应。例如,PRIVMSG用于向其他用户或频道发送消息,PING和PONG用于维持连接,QUIT用于退出网络。服务器在客户端注册成功后通常返回001响应,353响应则用于返回频道成员列表。IRC常见的TCP端口为6667,其他常用端口还包括6660至6669,加密IRC通信也经常使用6697端口。
僵尸网络是由多个受到恶意程序控制的主机组成的网络,这些主机通常被称为僵尸主机。攻击者通过命令与控制服务器向僵尸主机发送指令,从而统一控制大量分散的计算机。僵尸网络通常用于分布式拒绝服务攻击、垃圾邮件发送、信息窃取、恶意软件传播和网络代理等活动。
早期的部分僵尸网络利用IRC频道作为命令与控制通道。受控主机连接IRC服务器后加入指定频道,控制者通过PRIVMSG等消息向频道中的主机发送指令。通过分析IRC注册消息、频道加入记录和控制指令,可以判断主机是否加入僵尸网络,并进一步分析控制者的操作。
1.8 网络取证与SMB协议
网络取证是通过分析网络通信记录,调查主机之间的通信关系和网络攻击行为的过程。常见的数据源包括PCAP文件、网络设备日志和入侵检测系统产生的告警记录。PCAP文件保存了捕获到的数据包,可以通过Wireshark等工具进行分析。
Wireshark支持根据源IP、目的IP、端口和协议等条件筛选数据包,也可以使用Follow TCP Stream功能还原TCP连接中的应用层通信内容。在分析过程中,通常需要关注TCP三次握手、数据传输、连接关闭以及应用层请求和响应等信息。对于攻击流量,还需要结合服务器返回的数据判断攻击结果,不能仅凭攻击者发送了请求就认定攻击成功。
SMB(Server Message Block)是Windows系统中常用的网络文件共享协议,主要用于访问远程文件、打印机和其他共享资源。Windows系统中常见的管理共享包括ADMIN$和C$,其中ADMIN$通常指向系统目录,C$则对应C盘管理共享。获得相应访问权限后,远程主机可以通过这些共享执行文件访问和管理操作。
SMB还可以与Windows远程服务控制机制结合使用。攻击者可能先通过SMB访问管理共享,将程序文件写入目标主机,再通过服务控制接口创建和启动远程服务。分析这类流量时,需要检查SMB身份验证结果、文件创建和写入响应,以及CreateService、StartService和QueryServiceStatus等操作,从而判断远程服务是否真正创建并运行。
二、实验内容
本实验包含四项任务:
- 识别 RaDa 的文件格式、运行平台和加壳特征,检查转储文件,提取样本中的作者信息。
- 使用 IDA 分析两个 Crackme,找出能让程序输出成功信息的输入。
- 分析 RaDa 的用途、功能和检测方法,回答指导书中的八个问题。
- 分析 Windows 2000 蜜罐的抓包和 IRC 会话,回答网络取证的七个问题。
三、实验过程
3.1 任务一:RaDa 文件识别、脱壳与字符串提取
3.1.1 识别文件类型和加壳特征
先在 Kali 的 ~/network_attack/rada/samples 目录查看原始样本和转储文件的类型:
file RaDa.exe rada_dump_.exe
两者都被识别为 Windows PE32、I386、GUI 程序,但原始文件有 3 个节区,转储文件有 5 个节区。节区数量的变化说明后续分析时不能把两份文件当成完全相同的磁盘样本。命令输出如下:

接着用 DIE 检查原始 RaDa.exe。它显示文件大小约 20.50 KiB,编译器是 Visual Basic 6.0.8041,并标出 UPX [modified]。由此可以回答任务中的文件格式、运行平台和加壳工具三个问题。

3.1.2 对照原始文件与转储文件
为了给两份文件留下可核对的标识,分别计算 MD5:
md5sum RaDa.exe rada_dump_.exe
输出中,RaDa.exe 对应 caaa6985a43225a0b3add54f44a0d4c7,rada_dump_.exe 对应 6822fd4734dcb2b5064f3e78304d0eeb。后面哈希规则只命中原始文件,正与这两个摘要不同相吻合。

对已有的转储文件再做一次 UPX 检查:
upx-ucl -t rada_dump_.exe
结果为 NotPackedException: not packed by UPX。DIE 的 modified UPX 判断针对原始 RaDa.exe,这条命令检查的是 rada_dump_.exe;两项结果的对象不同。随后查看转储文件的导入和节区信息:
objdump -p rada_dump_.exe > rada_imports.txt
导入表可见 msvbvm60.dll,与前面的 VB6 识别一致;转储文件的 PE 信息显示 5 个节区。相关输出如下:

现存材料保存了转储文件及检查结果,未保存具体脱壳工具的操作画面。下面直接从已得到的转储文件继续分析。
3.1.3 提取字符串并查找作者
分别提取普通字符串和 Unicode 字符串,再用关键词缩小范围:
strings -a -n 5 rada_dump_.exe > rada_strings.txt
strings -el -n 5 rada_dump_.exe > rada_unicode.txt
grep -iE 'author|copyright|raul|david|siles|perez|sotm|rada' rada_strings.txt rada_unicode.txt
结果里有 Copyright (C) 2004 Raul Siles & David Perez、Authors: Raul Siles & David Perez 和 Scan Of The Month 32 (SotM) - September 2004。这三处信息相互对应,样本内标注的编写作者是 Raul Siles 和 David Perez。截图下半部分还显示了 C2 地址及本地目录,后续在 IDA 中会继续追踪这些字符串。

3.2 任务二:Crackme 逆向
3.2.1 crackme1.exe
将 crackme1.exe 载入 IDA 后,沿成功输出的引用找到参数比较处。程序把命令行参数与 I know the secret 比较,匹配后进入成功分支。IDA 中的比较位置如下:

在 PowerShell 中带上找到的参数运行:
.\crackme1.exe "I know the secret"
程序输出 You know how to speak to programs, Mr. Reverse-Engineer,与静态分析得到的条件一致。

3.2.2 crackmeplease.exe
第二个程序的判断多一层。IDA 中先比较 argv[0] 与 crackmeplease.exe,再比较 argv[1] 与 I know the secret。也就是说,密码正确之外,启动时传给程序的名称也要符合条件。两处比较在下图中:

成功分支中还有一段逐字节 XOR 循环,每个字节与 0x42 运算后才得到显示内容:

起初在 PowerShell 中带 .\ 前缀运行时没有通过程序名判断。改在 CMD 中按实际文件名执行:
crackmeplease.exe "I know the secret"
这次输出 We have a little secret: Chocolate。从失败到成功的差别,与前面看到的 argv[0] 校验相符。

3.3 任务三:RaDa 样本分析
3.3.1 二进制文件摘要和基本信息
原始 RaDa.exe 的 MD5 为 caaa6985a43225a0b3add54f44a0d4c7,转储文件 rada_dump_.exe 的 MD5 为 6822fd4734dcb2b5064f3e78304d0eeb。原始文件是约 20.50 KiB 的 Windows PE32/I386 GUI 程序,DIE 识别为 VB6 编译、modified UPX 加壳;转储文件有 5 个节区并导入 msvbvm60.dll。前面文件识别和哈希截图给出了这些基本信息。
3.3.2 二进制文件的目的
字符串中最醒目的是 http://10.10.10.10/RaDa。在 IDA 中追踪它的交叉引用,可以看到初始化和后续通信代码都使用了该地址:

再看 sub_404FB0,代码设置 RaDa_commands.html、download.cgi、upload.cgi,并准备 C:\RaDa\tmp 与 C:\RaDa\bin 等目录。命令页面与两个 CGI 接口分别对应获取控制内容和文件传输,说明程序围绕远程控制设计。

IDA 字符串窗口把通信地址、目录和注册表路径集中列了出来:

再从转储文件提取 Unicode 字符串,能在文本输出中找到同一批地址与路径。两种查看方式相互对照,也方便继续追踪代码引用:

3.3.3 功能特性
在 sub_4052C0 中,程序根据读到的命令字符串进入不同处理分支。截图里的 screenshot 分支是其中一例,反汇编还可定位到处理 sleep 的相关函数:

命令执行部分位于 sub_4066B0。这里取 COMSPEC,拼接 /C 参数后交给系统命令解释器执行。单独看 COMSPEC 只是字符串,放到这段调用过程里,才能判断它用于执行命令。

文件操作分为下载和上传。sub_406840 与下载处理相关;上传路径中能看到 multipart/form-data、Content-Disposition 等 HTTP 表单字段。下图显示请求字段的构造过程:

继续往下,sub_407470 一带处理文件名参数并调用后续文件处理函数,和前面的上传请求构造衔接:

转储文件中还出现 HKLM\Software\Microsoft\Windows\CurrentVersion\Run,指向开机启动配置。另有一段代码比较 http://192.168.、http://172.16.、http://10. 三种私有地址前缀,这属于地址判断逻辑:

综上,RaDa 具有远程获取命令、执行系统命令、文件传输、截图命令和启动项配置等功能线索。
3.3.4 防止分析或逆向工程的技术
原始文件的 UPX [modified] 特征使直接分析磁盘上的代码和字符串更困难,转储后才更容易看到完整配置。程序还读取 MACAddress,并与 00:0C:29: 这一 VMware 常见网卡前缀比较;若运行环境符合虚拟网卡特征,程序可以据此改变后续处理。IDA 中的比较位置如下:

另一张字符串截图同时出现 VMware、HTTP 上传等内容,与反汇编中的环境检查和文件传输相互印证:

3.3.5 恶意代码分类
RaDa 通过预设地址获取控制内容,还具备命令执行、文件传输和截图命令,符合远程控制木马或后门的特征。
3.3.6 具有相似功能的工具
Back Orifice、NetBus、SubSeven 都是较早出现的远程控制工具。它们与 RaDa 相似的地方是可以在远端对主机发出操作指令、访问文件等;RaDa 在本实验中表现出的 HTTP 页面和 CGI 方式,是分析它自身实现时更有用的特征。
3.3.7 rada开发作者
任务一中我们提取到的版权和作者字符串写有 Raul Siles、David Perez,因此可以给出样本的署名作者。
3.3.8 恶意代码的检测方法
检测同一样本可以从文件、代码和运行行为三个层面入手。本次已经做了哈希、PE 结构、YARA 三类规则检测,后面四种是结合分析结果提出的可行方法。
(1)精确哈希匹配。 用 MD5 或 SHA-256 与已知样本摘要比对,适合快速确认完全相同的文件。实验中的 RaDa_MD5_Detection 命中 RaDa.exe,没有命中 rada_dump_.exe,原因是转储后文件字节发生了变化。它对同一文件很准,对稍有改动的变种则不敏感。实际执行结果如下:

(2)PE 结构检测。 可以把节区数量、入口点、导入表及加壳特征组合成规则,对一批 PE 文件做初筛。实验中的 RaDa_PE_Structure 命中原始样本,没有命中转储样本;两份文件的节区结构不同,正好解释了结果差异。单靠结构可能误报,需要与字符串或行为信息配合。

(3)YARA 特征规则。 YARA 用字符串、字节序列和条件表达式描述一组特征,适合扫描同一类样本。本次分别扫描原始文件和转储文件:
yara -s ./rada.yar ./RaDa.exe
yara -s ./rada.yar ./rada_dump_.exe
原始加壳文件没有命中输出:

转储文件则命中 RaDa_SotM32,输出还列出匹配字符串的位置。加壳前后明文特征的可见性不同,解释了两次扫描的差异:

(4)字符串和 IOC 检索。 提取 ASCII、Unicode 字符串,检索 C2 地址、RaDa_commands.html、CGI 路径、目录和注册表启动项,能迅速缩小分析范围。任务一已用这个方法找到作者和通信配置。它适合初筛和辅助溯源,但字符串一旦被压缩、加密或替换就不容易检出。
(5)导入表和调用关系分析。 从 msvbvm60.dll 判断 VB6 环境,再沿 COMSPEC、/C、multipart/form-data 等线索查看使用它们的函数。与单纯搜字符串相比,调用关系能解释这些内容在程序中怎样起作用;缺点是耗时,且 VB6 程序需要结合运行库调用和反汇编阅读。
(6)网络流量检测。 可在隔离环境运行样本后,监测访问 RaDa_commands.html、download.cgi、upload.cgi 的 HTTP 请求以及文件传输。适合确认样本是否真的与控制端交互,或在网络边界上发现同类通信。若地址和路径改变、通信被加密,固定 IOC 的作用会减弱。本次没有 RaDa 自身的运行抓包。
(7)沙箱和主机行为监测。 在隔离系统记录进程、文件、注册表和网络变化,可以验证静态分析中看到的启动项、命令执行和文件操作。它能捕获某些只在运行时出现的行为;但 RaDa 有虚拟环境识别线索,沙箱结果需要与静态代码一起看。本次没有执行这一项。
3.4 任务四:Windows 2000 蜜罐取证
我们可以知道这份数据由 Snort 在五天内收集,并对部分敏感信息做了混淆。在回答问题之前,我们先看 IRC 连接,再统计频道主机,最后按时间线检查针对蜜罐的攻击与远程服务操作。
3.4.1 IRC 是什么,客户端如何加入,常用什么端口
IRC 是通过服务器和频道交流的实时通信协议。客户端先发 NICK 和 USER 完成注册,再用 JOIN 申请进入频道。常见 TCP 端口是 6667,其他常见端口在 6660—6669 范围,加密 IRC 常使用 6697。
在 Wireshark 中先用端口过滤查看 IRC 连接:
tcp.port == 6667
其中一条连接使用昵称 eohisou,服务器 irc4.aol.com 返回 433,表示昵称已被占用。这条连接不能作为成功入群的证据:

另一条连接里,蜜罐发送 NICK rgdiuggac、USER rgdiuggac localhost localhost :rgdiuggac。irc5.aol.com 返回 001 欢迎消息后,客户端发送 JOIN #x.......x,接着收到 353 成员列表。这一组消息说明它已经加入频道:

3.4.2 僵尸网络及其用途
僵尸网络是多个受控主机通过同一控制通道接受指令形成的网络,常见用途包括分布式拒绝服务、扫描和恶意程序传播。在这段 IRC 流中,昵称 jozix 通过 PRIVMSG 向频道发送 !m*、!r* 等指令,后面带目标 IP、端口和参数。频道消息如下,说明控制指令确实经过该 IRC 通道传递:

3.4.3 蜜罐通信过的 IRC 服务器
结合 TCP 连接与 IRC 响应,蜜罐接触过的服务器可以分成三种情况。
209.196.44.172(irc5.aol.com)返回欢迎消息,且有 JOIN、成员列表,成功加入的证据最完整。63.241.174.144(irc4.aol.com)返回433昵称冲突;217.199.175.10的会话出现server is full。到66.33.65.58、209.126.161.29还可见 SYN 或重传,属于连接尝试。
3.4.4 访问 209.196.44.172 僵尸网络的主机数量
我从 IRC 导出文本中提取 JOIN 和 QUIT 消息前缀 @ 后面的主机标识,分别去重。结果为:
| 统计方式 | 结果 |
|---|---|
| JOIN 消息 | 7,976 条 |
| QUIT 消息 | 7,662 条 |
| JOIN 中不同主机标识 | 4,787 个,含蜜罐 |
| JOIN 与 QUIT 合并后的不同主机标识 | 5,573 个,含蜜罐 |
题目问的是有多少不同主机访问该僵尸网络,我按实际 JOIN 的记录发现共有 4,787 个主机标识;去掉蜜罐自身是 4,786 个外部标识。统计截图如下:

3.4.5 用于攻击蜜罐的 IP
我分析数据包发现了三处攻击IP来源,分别是 24.197.194.106、210.22.204.101 和 61.111.101.78。前两个地址发出 IIS 漏洞利用特征请求;210.22.204.101 还与后续 Radmin 部署相关;61.111.101.78 对应 SMB/PsExec 部署链。下面继续分析它们尝试利用的入口,再看哪些攻击成功了。
3.4.6 攻击者尝试利用的漏洞
24.197.194.106 发出大量 HTTP HEAD 请求。路径中连续回退目录,再指向 /winnt/system32/cmd.exe,参数包含 /c+dir。这与针对 IIS 目录穿越并尝试执行命令的攻击方式相符,可对照 MS00-078。请求内容在下图中:

210.22.204.101 则发送 GET /NULL.IDA?CCCC... 长参数请求,属于 IIS Index Server ISAPI 缓冲区溢出攻击尝试特征,可对照 MS01-033。抓包显示了请求和连接结束:

61.111.101.78 使用 SMB 管理共享和 SVCCTL 创建远程服务。这是对远程管理机制的使用,本次没有把它写成某个具体的 SMB 协议漏洞。两类 IIS 请求在此只说明漏洞利用尝试;不好判断是否成功利用该漏洞完成攻击。
3.4.7 成功的攻击及过程
Radmin 服务。 210.22.204.101 之后通过 SVCCTL 创建并启动远程服务。帧 1811 的 QueryServiceStatus 响应显示 SVCCTL_RUNNING (4)、WERR_OK (0),表明服务已进入运行状态:

再看 TCP 4899 端口,第一次连接出现 RST,后面有 SYN、SYN/ACK、ACK 握手及双向 PSH/ACK 数据。服务运行和端口后续通信能够相互印证:

PsExec 服务。 61.111.101.78 的操作链更完整。帧 33234 中,蜜罐返回 SMB Session Setup AndX Response,状态为 STATUS_SUCCESS。这是后续访问管理共享的前提:

帧 33280 发起对 \\172.16.134.191\ADMIN$ 下 \System32\PSEXESVC.EXE 的创建请求;帧 33281 返回 STATUS_SUCCESS,Create action 表明文件原先不存在、此次已创建。请求和响应分别如下:


创建后继续写入服务程序。帧 33363 的 Write AndX Response 确认一次写入 61,440 字节,FID 对应 PSEXESVC.EXE:

文件准备好后,帧 33378 的 CreateServiceA 返回 WERR_OK,帧 33385 的 StartServiceA 也返回 WERR_OK。这两帧分别对应服务创建和发出启动请求:


后续几帧先显示 START_PENDING;到帧 33471,QueryServiceStatus 返回 SVCCTL_RUNNING (4) 和 WERR_OK,确认 PsExec 服务实际运行过。综合文件创建、写入和服务状态,可以判断这条远程部署链成功。Radmin 也有运行状态与 4899 通信作为证据;但未发现该IIS 请求有成功攻击的证据。

四、问题及解决方案
四、问题及解决方案
问题1:IDA Pro部分函数无法正常反编译
问题描述
在使用IDA Pro分析RaDa样本时,按下F5尝试反编译部分函数,程序提示Decompilation failure,无法正常生成伪代码,影响了后续的静态分析。
一开始我显示的界面是这样的:

原因分析
最初使用的是老师提供的软件包中的IDA版本,该版本可能较旧,反编译功能存在一定限制,无法正常处理部分函数。因此,需要更换版本以保证反编译功能正常使用。
解决方案
不再使用老师提供的软件包,而是前往IDA Pro官方网站下载最新版软件,并完成安装。
安装完成后,重新使用新版IDA Pro载入RaDa样本,继续进行函数反编译和交叉引用分析。更换软件版本后,解决了原先的软件使用问题,能够继续完成后续的逆向分析工作。
问题2:第二个Crackme程序输入正确但无法通过校验
问题描述
在运行第二个Crackme程序时,即使输入了正确的密码I know the secret,程序仍然没有输出成功信息。
原因分析
通过IDA分析发现,该程序不仅会检查用户输入的密码,还会检查程序自身的名称。程序首先将argv[0]与crackmeplease.exe进行比较,只有程序名和密码两项条件同时满足,才会进入成功分支。
在PowerShell中使用.\crackmeplease.exe运行时,传入的程序名称包含路径前缀,导致程序名比较不满足要求。
解决方案
改用CMD运行程序,并直接使用实际文件名启动:
crackmeplease.exe "I know the secret"
执行后,程序成功输出:
We have a little secret: Chocolate
说明程序名和密码两项校验均已通过。
问题3:PsExec远程服务启动后一直显示START_PENDING
问题描述
在分析PsExec远程服务部署过程时,已经确认StartServiceA请求返回成功,但随后检查多个QueryServiceStatus响应时,服务状态始终显示:
State: SVCCTL_START_PENDING (2)
因此,无法立即确认远程服务是否真正启动。
原因分析
Windows服务启动并不是瞬间完成的。StartServiceA返回成功只能说明启动请求被接受,服务仍然需要一定时间完成初始化。
因此,在服务刚启动时查询状态,可能仍然得到START_PENDING,不能仅凭启动请求成功就判断服务已经进入运行状态。
解决方案
继续检查后续的QueryServiceStatus响应数据包,观察服务状态的变化。
前面的数据包33387、33389和33391均显示服务处于START_PENDING (2)。继续向后检查,最终在数据包33471中发现:
State: SVCCTL_RUNNING (4)
Win32 Exit Code: WERR_OK (0)
Service Exit Code: 0
由此确认PsExec远程服务已经成功进入运行状态。
五、学习感悟、思考等
这次实验让我感受最深的,是分析恶意代码不能停在工具给出的第一个结果上。DIE 把 RaDa 原始文件识别为 modified UPX,而对转储文件运行 UPX 测试又提示未加壳。如果不先看清命令针对的是哪一个文件,很容易把两条结果当成冲突。后来再对照节区数量、MD5 和提取出的字符串,我才把原始样本与转储文件的关系理顺。YARA 在原始文件上没有命中,在转储文件上却能找到 RaDa 特征,也说明加壳前后能直接看到的信息确实不同。IDA 中有些 VB6 函数很难只靠反编译窗口看明白,我从 C2 地址、命令字等字符串的交叉引用入手,再回到反汇编看参数和调用,分析思路比盯着一大段代码更清楚。
两个 Crackme 的规模不大,却让我注意到“找到密码”和“满足程序全部条件”不是一回事。第一个程序只要输入正确字符串就能进入成功分支;第二个程序除了比较密码,还检查启动时的程序名。我开始用 PowerShell 带 .\ 前缀运行没有成功,回头核对 argv[0] 后改用 CMD,才得到预期输出。这一步让我意识到,逆向时不能只看到一个熟悉的比较字符串就急着下结论,还要沿分支检查前后是否有别的判断。
蜜罐抓包的分析更像把零散片段拼成时间线。IRC 中既有昵称冲突,也有真正收到欢迎消息、加入频道的连接;如果只看某一个报文,就容易把连接尝试写成已入群。统计主机数时,JOIN 去重是 4,787,JOIN 与 QUIT 合并去重是 5,573,两者都能算出来,但回答题目必须先明确统计口径。HTTP 目录穿越和 NULL.IDA 请求看起来有明显攻击特征,能确认的仍是攻击尝试;Radmin 和 PsExec 则有文件写入、服务创建、启动以及 RUNNING 状态等连续证据。特别是 PsExec 先处于 START_PENDING,往后看才确认运行。这让我更重视请求、响应和后续状态之间的联系。
参考资料
- OmniUnpack: Fast, Generic, and Safe Unpacking of Malware
- Limits of Static Analysis for Malware Detection
- A Survey on Automated Dynamic Malware-Analysis Techniques and Tools
- Learning and Classification of Malware Behavior
- A Multifaceted Approach to Understanding the Botnet Phenomenon
- BotSniffer: Detecting Botnet Command and Control Channels in Network Traffic
- BotMiner: Clustering Analysis of Network Traffic for Protocol- and Structure-Independent Botnet Detection
- Honeycomb: Creating Intrusion Detection Signatures Using Honeypots
浙公网安备 33010602011771号