2207 字
11 分钟
NewStarCTF 2024 Misc 全题型解题思路与操作指南

NewStarCTF 2024 Misc 全题型解题思路与操作指南#

做题时最重要的不是”背答案”,而是建立一套按题型走的操作流水线:先识别题型 → 再按对应方法逐项排查。本文用 NewStarCTF 2024 Misc 全套 18 题的实战解法,总结每类题的思路(为什么这么想)和操作方式(具体工具/命令)。

官方 WriteUp 总站(参考):https://newstar.wiki/wp/2024/


0. 通用方法论#

思路#

  • 先看题面提示:题目描述里几乎总是藏了方向(“正反都好听”=倒放、“眼力”=看帧差异、“拨号音”=DTMF、“FENCE”=栅栏密码)。
  • 看附件特征file 看真实类型(扩展名全是障眼法:.zip/.gz/.rar/.z 可能是 PNG,.docx 可能是 OLE2)。
  • 先跑一遍 strings / binwalk / 尾部数据,成本最低,经常直接出线索。

操作方式#

Terminal window
file 附件
strings -a 附件 | grep -iE "flag|key|pass|hint"
binwalk 附件 # 看有没有嵌套文件
xxd 附件 | tail # 看尾部追加数据

1. 流量分析(pcap)#

1.1 通用思路#

先数一下协议分布(HTTP / USB / SSH),优先导出对象,再跟 TCP 流看请求内容。很多题的 flag 就在 HTTP 响应体或上传的文件里。

1.2 操作方式#

Terminal window
# 看协议统计
tshark -r x.pcapng -q -z io,phs
# 导出 HTTP 对象(文件、上传的 webshell、图片)
tshark -r x.pcapng --export-objects http,./out
# 跟流
tshark -r x.pcapng -z follow,tcp,http

实战样例#

  • Herta’s Study:HTTP 上传了加密 webshell upload.php,命令输出被”base64 后奇数位 ROT13”混淆。导出对象拿到响应串,写脚本解码即可:奇数位字符 str_rot13 → base64 解码。
  • wireshark_checkin / wireshark_secret:SSH 只是背景板,真正的 HTTP 请求里下载了 flag 文件/PNG。导出后直接读;PNG 用 OCR/看图得 flag{you_are_gooddddd}

USB 键盘流量(Alt 题)#

思路:USB HID 报表 8 字节,首字节=修饰键(0x04=Alt),第三字节=键码;0000… 表示松开。Alt+小键盘数字 = Unicode 十进制码值输入,这是 Windows 输入任意字符的方式。 操作

Terminal window
tshark -r keyboard.pcapng -T fields -e usbhid.data > usb.txt
# 按住 Alt 期间的数字串分组 → int → chr()
# 键码: 0x59=1 0x5a=2 0x5b=3 0x5c=4 0x5d=5 0x5e=6 0x5f=7 0x60=8 0x61=9 0x62=0

得到 flag{键盘流量_with_alt_和窗户_15_5o0OO0o_酷}(中文用 Alt 码输入)。


2. 图片隐写#

2.1 通用思路#

按”从易到难”排查:CRC/尺寸 → LSB 位平面 → 帧差异 → 二维码/特殊字体

2.2 PNG 尺寸被改 + CRC 修复(扫码领取flag 题)#

思路:PNG 的 IHDR 里 width/height 被改后 CRC 会不匹配。若存储的 CRC 是”正确值”,就能爆破宽高使 CRC 与存储值相等,还原原始尺寸。 操作

import zlib, struct
data = open(f,'rb').read()
target = struct.unpack('>I', data[29:33])[0]
for w in range(1,1024):
for h in range(1,1280):
if zlib.crc32(data[12:16]+struct.pack('>II',w,h)+data[24:29]) == target:
print(w, h) # 本题全部是 250x250

改回尺寸后,4 张 250×250 是同一二维码的 4 个象限,按顺序拼成 500×500,用 zxing-cpp 扫码:

import zxingcpp
zxingcpp.read_barcode(np_array) # → flag{Then_d0_you_kn0w_w6at_Hanx1n_cod3_1s?}

2.3 LSB 隐写(Labyrinth 题)#

思路:题目直接提示 LSB。把任一颜色通道的最低位提取出来当作一张二值图,往往就是二维码/文字。 操作

a = np.array(Image.open('yugamu.png'))
plane = (a[:,:,0] & 1) * 255 # RGB 三通道 LSB 相同
zxingcpp.read_barcode(plane) # → flag{e33bb7a1-...}

2.4 GIF 帧差异(你也玩原神吗 题)#

思路:“眼力”暗示某帧一闪而过。逐帧比对,找到与众不同的帧;帧里的特殊字体(提瓦特文字)用对照表转成英文。 操作

for i in range(gif.n_frames):
gif.seek(i); gif.save(f'f{i:03d}.png')
# 相邻帧 XOR,差异大的就是要找的帧(本题 f036/f037)

对照表解出:左下角 doyouknowfence(提示栅栏),右下角密文 MESIOAABGNHNSGOGMYEIADE → 3 轨栅栏密码 → MAYBEGENSHINISAGOODGAME


3. 音频隐写#

3.1 通用思路#

  • 先看声道差异(左右声道各听/各分析一遍);
  • 再看尾部(ID3/WAV 尾追加数据);
  • 最后倒放/变速/频谱图

3.2 倒放 + 摩斯(pleasingMusic 题)#

思路:题面”正反都好听”=后半段是倒放的。把整段音频倒放后,会出现两种时长的音调:短=.(点),长=-(划)。 操作(无 ffmpeg 时用 miniaudio 解码):

import miniaudio, numpy as np
dec = miniaudio.decode_file('a.mp3', output_format=miniaudio.SampleFormat.SIGNED16)
data = np.frombuffer(dec.samples, dtype=np.int16).reshape(-1,2).mean(axis=1)
rev = data[::-1]
# 20ms 滑窗能量,阈值取峰值 35% 得到干净的音段
# 时长 120-140ms → '.', 360-380ms → '-'; 短间隔连符号, 长间隔分字符
# → EZ_MORSE_CODE → flag{EZ_MORSE_CODE}

3.3 右声道 DTMF(BGM坏了吗 题)#

思路:立体声里左声道是噪音、右声道藏”拨号音”(DTMF 双音)。用右声道减左声道或只取右声道,对每个音段做频谱峰值识别:低频组 697/770/852/941 × 高频组 1209/1336/1477/1633 的交叉 = 数字。 操作

# 对 100ms 窗口做 Goertzel 或 FFT,找两个峰值频率 → 查 DTMF 表
# 注意别增强音量、可用 22050 采样率导出,解码更稳
# → 2024093020241103 → flag{2024093020241103}

4. 压缩包与密码#

4.1 通用思路#

套娃 zip 链:逐层解,注意每层的注释/文件名/提示文件;加密 zip 优先看有没有 3 字节小文件(CRC 爆破)或已知明文(ZipCrypto → bkcrack)。

4.2 CRC 爆破 3 字节文件(zipmaster 题)#

思路:压缩包里有 4 个 3 字节小文件且给了 CRC,爆破 3 字符使其 CRC32 匹配即可还原内容(常用于拼密码)。 操作

import binascii, itertools, string
for crc in [0x35f321cd, 0xa0bb977c, 0x4eb5f650, 0x03c90238]:
for c in itertools.product(string.printable, repeat=3):
if binascii.crc32(''.join(c).encode()) & 0xffffffff == crc:
print(c) # thi / s_i / s_k / ey! → this_is_key!

得到密码 this_is_key! 解 3077.zip → 下一层。

4.3 ZipCrypto 明文攻击(bkcrack)#

思路:加密 zip 里若有一个已知内容的文件(如 hint.txt),ZipCrypto 可用已知明文恢复密钥。注意 -p 要给deflate 压缩后的字节zlib.compressobj(6, DEFLATED, -15))。 操作

Terminal window
bkcrack -C 0721.zip -c 0721/hint.txt -p hint_deflated.bin
# → keys: d45ea73f 29dacfdc f97ea188
bkcrack -C 0721.zip -k <keys> -c 0721/flag.zip -d flag_stream.bin
# 解出的 deflate 流再 zlib.decompress(-15) 还原

注意最后可能遇到压缩包炸弹(2333 个 118MB 重叠条目),别傻乎乎全解压,直接分析文件结构/看 WP。


5. 办公文档取证#

5.1 字里行间的秘密#

思路:key.txt 里藏零宽字符(U+200C/U+200D/U+FEFF/U+202C),解码出密码;flag.docx 真实魔数 d0cf11e0 是 OLE2 加密容器(含 EncryptedPackage/EncryptionInfo 流),要用 msoffcrypto 类工具按密码解密,解密后才是真 docx。 操作

import msoffcrypto, io, zipfile
of = msoffcrypto.OfficeFile(open('flag.docx','rb'))
of.load_key(password='it_is_k3y')
out = io.BytesIO(); of.decrypt(out) # 得到合法 zip(docx)
# 提取 word/document.xml 的 <w:t> 文本 → flag{you_h4ve_4nyth1n9}

6. OSINT(照片溯源)#

OSINT-MASTER#

思路:照片 EXIF 含拍摄时间 + 机翼上的飞机注册号(B-2419)→ 查该机历史航班 → 按时间锁定航班号 → 再按轨迹找拍摄时经过的地级市。 操作:exiftool 读 GPS/时间 → FlightAware 搜注册号 → 航班管家看轨迹 → flag{MU5156_济宁市}


7. 逆向 / 固件#

7.1 APK(AmazingGame)#

思路:别先跑模拟器。解包直接搜字符串,flag 往往以 base64 存在 dex 里操作

Terminal window
unzip a.apk -d apk
grep -rl "ZmxhZ3tVX1cxbiEhXzdoZV9nQG00fQ==" apk # = flag{U_W1n!!_7he_g@m4}

7.2 ARM 固件 + 采样数据(PlzLoveMe)#

思路.raw 是 PCM 音频(播放听歌识曲确定歌曲);.axf 是带符号的 ARM ELF,用 IDA/Ghidra 搜 UART 回调,看数据处理逻辑(本题是 Rx ^ 1);LCD 上的特殊字体(LVDC-Secret-Passage)对应歌词,最后几行就是密文。 操作Rx ^ 0x1fhwdLd mnwdOnV mnwdOnVgiveMe loveNoW loveNoWflag{giveMeloveNoWloveNoW}


8. 沙箱逃逸#

8.1 C++ 代码沙箱(ez_jail)#

思路:过滤了 { },但 C++ digraph <% %> 就是花括号;或者 # 后加空格绕过 #define 检测。 操作

void user_code()<%write(1, "Hello, World!\n", 14);%> // 本地 g++ 验证通过

8.2 Rust 代码沙箱(I wanna be a Rust Master)#

思路:syn 解析不会展开宏内部,所以 include_str!/concat! 可用;concat!("/fl","ag") 拼路径绕过 “flag” 明文检测;输出用 panic 报错带出(panic 信息进 stderr,而本题只回显 stderr)。 操作

fn main() { Option::<()>::None.expect(include_str!(concat!("/fl", "ag"))); }

9. 内存/磁盘取证(百度网盘题,简述)#

  • 擅长音游:E01 磁盘镜像仿真启动 Win7,桌面图标按提示分辨率(1200×800)排列成 flag → flag{wowgoodfzforensics}
  • 擅长加密:BitLocker 解密靠内存镜像残留密钥(Elcomsoft FDDE),画图进程 mspaint 内存 dump 用 GIMP 调宽高还原密码 → 7z 解压得 flag。
  • 热心助人:volatility imageinfo 选 profile → lsadump 拿系统密码(去掉开头标志)→ base64 解码。

10. 小结:做题时最值得先试的 10 件事#

  1. file 看真实类型,别信扩展名
  2. strings + binwalk + 尾部字节
  3. pcap 先 --export-objects http
  4. 图片先查 EXIF/GPS、再试 LSB 位平面、CRC 爆破宽高
  5. GIF/视频逐帧差异
  6. 音频先分声道、看尾部、再倒放/频谱
  7. zip 先看注释、3 字节小文件(CRC 爆破)、已知明文(bkcrack)
  8. 加密文档用 msoffcrypto / office2john
  9. 二进制先搜字符串/flag 的 base64,IDA 搜关键回调
  10. 沙箱题先想”解析器看不懂哪里”(宏内部、digraph、编译期宏)

参考链接#

  • NewStarCTF 2024 官方 WriteUp 总站:https://newstar.wiki/wp/2024/
  • NewStarCTF 2024 Misc 全套题目与附件(本文实战来源):本机训练库(Newstar/ns24/misc)

做题过程中多对照官方 WP 校准思路;很多”卡住”的点(如 zip 炸弹结构、沙箱绕过)官方 WP 一句话就能点破。