软件系统安全赛华东赛区 WriteUp
菜鸡求带(
misc
steganography
Shell
➜ xxd steganography_challenge | head -20
00000000: ffff ffff 271c 0004 c2f4 ea48 b5b1 0500 ....'......H....
00000010: 0000 0000 6200 0000 0000 0000 d680 9f3b ....b..........;
00000020: 01bd fc89 504e 470d 0a1a 0a00 0000 0d49 ....PNG........I
00000030: 4844 5200 0004 0000 0004 0008 0200 0000 HDR.............
00000040: f07f bcd4 0001 0000 4944 4154 789c d4fd ........IDATx...使用010打开文件发现
- PNG头(
89 50 4E 47 0D 0A 1A 0A)从偏移量0x23(35)开始 - 文件前35字节是垃圾数据(0xffffffff…)
删去垃圾数据提取原始图片
Bash
# 提取从偏移量35开始的完整PNG
$ dd if=steganography_challenge of=original.png bs=1 skip=35
$ file original.png
original.png: PNG image data, 1024 x 1024, 8-bit RGB再用010和随波逐流打开发现


- 图片包含6个IDAT块
- 所有IDAT块的CRC校验失败 → 表明数据被修改(隐写术)
- IEND之后有99字节数据,包含”layer2.png”字符串
扫一下lsb隐写
Bash
$ zsteg original.png
meta 1b, rgb, lsb, xy .. text: "^E^B^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D^D..."
b1,r, lsb, xy .. file: Zip archive data, at least v2.0 to extract
b1,rgb, lsb, xy .. file: Zip archive data, at least v2.0 to extract在b1,rgb,lsb,xy模式检测到ZIP文件
提取隐藏的ZIP文件
Bash
$ zsteg original.png -b1,rgb,lsb,xy -o extracted_data.bin
$ file extracted_data.bin
extracted_data.bin: Zip archive data, at least v2.0 to extract
$ unzip -l extracted_data.bin
Archive: extracted_data.bin
Length Name
------ ----
102 flag.zip
99 pass1.zip
99 pass2.zip
99 pass3.zip
99 pass4.zip
99 pass5.zip
99 pass6.zip
------ -------
795 7 filesZIP文件包含:
flag.zip- 密码保护的flag文件pass1.zip ~ pass6.zip- 6个密码提示文件
观察到所有pass*.zip文件都包含4字节的文本文件,可以使用CRC32碰撞攻击:
Bash
# 使用ZipCracker工具
$ python ZipCracker.py pass1.zip
[*]恭喜您,破解成功!
[*]data1.txt 文件的内容为:pass
$ python ZipCracker.py pass2.zip
[*]data2.txt 文件的内容为: is
$ python ZipCracker.py pass3.zip
[*]data3.txt 文件的内容为:c1!x
$ python ZipCracker.py pass4.zip
[*]data4.txt 文件的内容为:xtLf
$ python ZipCracker.py pass5.zip
[*]data5.txt 文件的内容为:%fXY
$ python ZipCracker.py pass6.zip
[*]data6.txt 文件的内容为:PkaA得到pass is c1!xxtLf%fXYPkaA
使用密码c1!xxtLf%fXYPkaA解密flag.zip
Bash
$ unzip -P "c1!xxtLf%fXYPkaA" flag.zip
Archive: flag.zip
inflating: flag.txt
$ cat flag.txt
flag is here使用vim打开文件发现文件包含零宽字符
Python
with open('flag.txt', 'rb') as f:
content = f.read()
# 零宽字符转二进制
binary_str = ''
i = 0
while i < len(content):
if content[i] == 0xE2 and i+2 < len(content):
if content[i+1] == 0x80:
if content[i+2] == 0x8B: # Zero Width Space (U+200B)
binary_str += '0'
elif content[i+2] == 0x8C: # Zero Width Non-Joiner (U+200C)
binary_str += '1'
i += 3
else:
i += 1
else:
i += 1
# 二进制转ASCII
flag = ''
for i in range(0, len(binary_str), 8):
byte = binary_str[i:i+8]
flag += chr(int(byte, 2))
print(f"Flag: {flag}")得到
Text
Flag: dart{bf4100d9-cc8d-48f6-a095-54cbfad189e1}