2024江西工控“振兴杯”初赛WriteUp
字数 1759 2025-08-22 12:23:25
江西工控"振兴杯"初赛WriteUp技术解析
协议分析 - 被攻击的电机
分析步骤
-
流量包分析:
- 打开提供的网络流量包文件
- 使用过滤器筛选出写数据的包(通常使用Wireshark的过滤功能)
-
关键数据识别:
- 在过滤结果中查找包含"13 88"的数据包
- 特别注意数值大于3000的数据包
-
Flag提取:
- 从符合条件的数据包中直接提取flag
- 最终flag格式:
flag{c90a00000006030600721388}
Omron协议分析
分析步骤
-
协议过滤:
- 使用Wireshark过滤器筛选出Omron协议相关的流量
-
异常流量识别:
- 按数据包长度排序,查找异常长度的数据包
- 重点关注长度为104的数据包
-
解密过程:
- 从识别出的数据包中提取密文
- 使用适当的解密方法(具体方法未在原文中详细说明)解密获得flag
组态编程 - 西门子组态分析
程序逻辑解析
-
程序段一:
- 启动条件:按钮A按下且D点已接通
- 动作:给C置位,使C对应的灯亮起
-
程序段二:
- 启动条件:按钮B按下
- 动作:给C复位,使C对应的灯熄灭
-
程序段三:
- 启动条件:再次按下按钮B
- 延时:等待12秒
- 动作:给D复位
-
程序段四:
- 启动条件:按钮E按下
- 延时:等待10秒
- 动作:给D置位
- 连锁反应:D置位后,由于程序段一的条件满足,C也会被置位,灯再次亮起
正确操作流程
- 首先启动按钮A
- 然后启动按钮E并等待10秒
- 这样D会被置位,进而导致C被置位,灯亮起
Flag格式
flag{E_10_D_1}
Smart编程分析
数据处理流程
-
初始转换:
- VW100通过MOV_W函数将18转换为二进制:
10010
- VW100通过MOV_W函数将18转换为二进制:
-
位移操作:
- VW104通过SHL_W函数将VW100左移3位:
10010左移3位=144 - VW108通过SHR_W函数将VW104右移2位:144右移2位=36
- VW104通过SHL_W函数将VW100左移3位:
-
表格操作:
- 设置VW500为5(表格最大条目数)
- 将VW108(36)加入表格,表格内容变为
100100 - 从表格中先进先出取出VW600=36
-
位运算:
- 将240和VW600进行按位与运算:36&240=32
- 结果存入VW700=32
-
数据类型转换与计算:
- 将VW700转换为双整数VD704=32
- VD704+17=VD708=49
- 将VD708转换为实数VD712=49.0
- 使用SQRT求VD712的平方根得到VD716=7.0
-
变量状态:
- VW502未设置,默认为0
- VW600=36
- VD716=7.0
Flag格式
flag{0_36_7.0}
恶意程序分析 - 勒索病毒
分析步骤
-
静态分析:
- 使用IDA Pro分析exe文件
- 发现对flag.txt文件的操作
-
加密文件分析:
- 使用010editor打开加密的flag文件
- 提取十六进制数据:
0B B0 B5 4E 89 4E 9D 03 93 1D 5B E5 10 E2 EA 13 10 BE 60 09 D8 16 4A F0 4B F8 CB C6 49 39 88 10 72 00 28 B6 0D 5A CB 49 FB 3D
-
解密准备:
- 从参考链接获取key和nonce
- key(32字节):
75 2b cb 44 8b d1 70 53 e6 b5 5c c4 e6 ba 1b e8 75 6d 2d bb 03 89 9e b6 5e f5 a7 ef f6 de 5e e7 - nonce(12字节):
4b f6 5b 44 e2 79 81 1c 36 7f 94 cc
-
解密脚本:
from Crypto.Cipher import ChaCha20 from Crypto.Protocol.KDF import scrypt # 定义加密数据 data = bytes([0x0B, 0xB0, 0xB5, 0x4E, 0x89, 0x4E, 0x9D, 0x03, 0x93, 0x1D, 0x5B, 0xE5, 0x10, 0xE2, 0xEA, 0x13, 0x10, 0xBE, 0x60, 0x09, 0xD8, 0x16, 0x4A, 0xF0, 0x4B, 0xF8, 0xCB, 0xC6, 0x49, 0x39, 0x88, 0x10, 0x72, 0x00, 0x28, 0xB6, 0x0D, 0x5A, 0xCB, 0x49, 0xFB, 0x3D]) # 定义密钥和随机数(nonce) key = bytes([0x75, 0x2b, 0xcb, 0x44, 0x8b, 0xd1, 0x70, 0x53, 0xe6, 0xb5, 0x5c, 0xc4, 0xe6, 0xba, 0x1b, 0xe8, 0x75, 0x6d, 0x2d, 0xbb, 0x03, 0x89, 0x9e, 0xb6, 0x5e, 0xf5, 0xa7, 0xef, 0xf6, 0xde, 0x5e, 0xe7]) nonce = bytes([0x4b, 0xf6, 0x5b, 0x44, 0xe2, 0x79, 0x81, 0x1c, 0x36, 0x7f, 0x94, 0xcc]) # 初始化ChaCha20算法 cipher = ChaCha20.new(key=key, nonce=nonce) # 手动设置计数器为1(跳过第一个64字节块) cipher.seek(64) try: # 解密数据 decrypted_data = cipher.decrypt(data) print(decrypted_data) except Exception as e: print(f"An error occurred: {e}") -
执行结果:
- 运行脚本后输出解密后的flag内容
应急处置 - 工程被加密
恢复步骤
-
工程打开:
- 使用组态王7.5SP1软件打开被加密的工程
- 会弹出密码输入窗口
-
密码绕过:
- 直接关闭密码输入窗口
- 点击软件菜单中的"工具"→"加密"
- 在弹出的加密设置窗口中点击"确定",这将取消密码保护
-
信息获取:
- 重新打开工程
- 查看操作记录图片,其中包含flag信息
固件分析 - 固件后门
分析步骤
-
文件解压:
- 解压提供的bin固件文件
- 查找可疑文件,特别是.pyc文件(Python编译文件)
-
反编译:
- 使用Python反编译工具对.pyc文件进行反编译
- 分析反编译得到的源代码
-
后门特征:
- 在代码中发现硬编码的域名和端口
- 域名格式:
www.1sdfa4sdfdsgbnm098d8342kflgb.com - 端口号:38209
Flag格式
flag{www.1sdfa4sdfdsgbnm098d8342kflgb.com:38209}
总结
本文档详细记录了2024江西工控"振兴杯"初赛各题目的解题过程和技术要点,涵盖协议分析、组态编程、恶意软件分析、应急处置和固件分析等多个工控安全领域。每个题目都提供了详细的分析步骤和关键点,可作为工控安全学习的参考资料。