DASCTF 2022 三月赛 WriteUp 精析5类隐写术与3种流量取证实战技巧1. 隐写术技术全景解析在CTF竞赛中隐写术Steganography作为Misc类题目的核心考点要求选手从看似普通的载体中提取隐藏信息。2022年DASCTF三月赛中的隐写题目集中展现了五种典型技术变体1.1 鼠标轨迹绘图隐写技术原理通过记录鼠标移动轨迹还原绘图信息。本题使用.mrf格式的宏记录文件存储坐标数据。实战步骤使用macro recorder工具打开轨迹记录文件播放宏记录观察绘制的图形从生成的图形中识别出flag字符# 模拟轨迹数据解析示例 import matplotlib.pyplot as plt trajectory [(12,34), (15,36), ..., (120,80)] # 实际坐标需从文件提取 x, y zip(*trajectory) plt.plot(x, y, b-) plt.show()提示某些题目会故意打乱坐标顺序需按时间戳排序后绘制1.2 VHD虚拟磁盘文件隐藏技术特征利用虚拟硬盘文件的未分配空间存储数据常见于取证题目。破解方法使用7-zip直接解压VHD文件发现多个隐藏文件flag1-4各文件采用不同保护方式flag1Malbolge语言特征flag3ZIP伪加密修改压缩方法字节flag4尾部附加PNG十六进制倒序存储# 010 Editor脚本处理flag4 f open(flag4,rb).read() f1 open(flag.png,wb) f1.write(f[::-1]) # 倒序处理1.3 WAV音频LSB隐写技术参数采样深度16bit隐写位最低有效位(LSB)典型工具Steghide、SilentEye破解脚本from scipy.io import wavfile import numpy as np rate, data wavfile.read(secret.wav) binary .join([str(x 1) for x in data]) message .join([chr(int(binary[i:i8],2)) for i in range(0,len(binary),8)]) print(message.split(\x00)[0]) # 提取有效字符串1.4 PNG图像隐写双解法方法对比表技术类型工具关键参数适用场景LSB隐写StegSolveBit Plane 0简单替换型隐写通道分离Python PIL库alpha通道透明图层隐藏附加数据binwalk文件尾追加ZIP/Base64附加数据实战案例from PIL import Image img Image.open(flag.png) width, height img.size for y in range(height): for x in range(width): if img.getpixel((x,y))[-1] ! 255: # 检查alpha通道 print(f发现异常像素点({x},{y}))1.5 复合型压缩包隐写解题路线图文件头修复CRC校验错误伪加密识别加密标志位修改爆破字典生成已知部分明文时嵌套压缩包处理批量解压脚本import pyzipper with pyzipper.AESZipFile(secret.zip) as zf: for password in [123456, admin, flag]: try: zf.extractall(pwdpassword.encode()) print(f成功密码: {password}) break except RuntimeError: continue2. 网络流量分析技术矩阵2.1 ICMP隧道检测特征指标异常数据包大小常规ICMP≤64字节固定序列号模式高频周期性请求Wireshark过滤技巧icmp icmp.type8 # 仅显示请求包 icmp.seq 10 # 过滤特定序列号 frame.len 100 # 筛选大尺寸包数据提取脚本import dpkt with open(traffic.pcap,rb) as f: pcap dpkt.pcap.Reader(f) for ts, buf in pcap: eth dpkt.ethernet.Ethernet(buf) if isinstance(eth.data, dpkt.ip.IP): ip eth.data if isinstance(ip.data, dpkt.icmp.ICMP): icmp ip.data if icmp.type 8: # Echo Request print(icmp.data.hex()) # 提取载荷数据2.2 UART协议解码硬件分析要点识别起始位低电平计算波特率115200常见数据位配置通常8位停止位1-2位Sigrok配置示例[UART] baudrate 115200 data_bits 8 parity none stop_bits 1数据重组算法def decode_uart(bits): start_bit bits[0] if start_bit ! 0: return None # 无效起始位 data bits[1:9] parity bits[9] stop_bit bits[10] byte int(.join(map(str, data[::-1])), 2) return chr(byte)2.3 协议逆向工程关键步骤统计特征字节Magic Number分析会话模式挑战-响应识别加密算法XOR/RC4常见重构协议状态机流量特征对比表协议类型端口特征字节加密方式自定义随机0xA5A5XOR滚动Modbus502事务ID明文DNP3200000x0564AES-CBC3. 实战工具链配置3.1 隐写分析工具箱推荐工具集StegSolve图像层分析Binwalk文件分离Audacity音频频谱分析VeraCrypt磁盘加密容器处理Hex Workshop十六进制编辑Python依赖库pillow9.0.1 numpy1.22.3 scipy1.8.0 pydub0.25.1 pyzipper0.3.53.2 流量分析环境Kali Linux配置# 安装基础工具 sudo apt install tshark wireshark sigrok # 常用插件 git clone https://github.com/SecureAuthCorp/impacket cd impacket pip install .Wireshark着色规则icmp.type 8 - 黄色背景 tcp.flags.syn 1 - 红色文本 frame contains flag - 绿色高亮4. 高级技巧与异常处理4.1 反调试对抗常见防护手段时间差检测调试器进程检查代码校验和验证绕过方案# 使用LD_PRELOAD hook时间函数 from ctypes import * libc CDLL(libc.so.6) libc.gettimeofday.restype c_int fake_time timeval(0,0) libc.gettimeofday.argtypes [POINTER(timeval), c_void_p] libc.gettimeofday(fake_time, None) # 返回固定时间4.2 混淆数据处理典型场景字节序反转Little/Big Endian非标准编码Base85/Ascii85多层压缩嵌套通用处理框架def decode_layer(data): for transform in [bytes.reverse, base64.b85decode, zlib.decompress]: try: data transform(data) except: continue return data5. 竞赛策略与时间管理5.1 解题优先级评估评分维度已知技术熟悉度权重40%题目提示明确性权重30%队伍技能匹配度权重20%历史出现频率权重10%决策矩阵示例题目类型技能匹配提示明确建议优先级音频隐写高中等★★★★☆协议逆向低模糊★★☆☆☆内存取证中等明确★★★★☆5.2 协作流程优化Git协作规范├── writeups │ ├── crypto │ ├── pwn │ └── misc ├── tools │ ├── stegsolve.jar │ └── packet_analyzer.py └── artifacts ├── sample1.pcapng └── hidden_image.pngIDA远程调试配置# 启动调试服务器 idaw -Sdebugger_server.py -P1234 challenge.exe # 本地连接 python -m ida_remote 127.0.0.1:1234在实战中遇到过最棘手的案例是一个多层嵌套的PDF隐写题表面看是普通文档实际包含第一层文件尾追加ZIP第二层PDF对象流加密第三层字体文件隐写 最终通过组合使用pdf-parser和ttxt工具链才成功提取flag