Timmy's Blog

软件系统安全赛华东赛区 WriteUp

0.7千字 预计阅读 3 分钟 - 次浏览

菜鸡求带(

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 files

ZIP文件包含:

  • 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}

评论

评论加载中…