.wav异或提取png 提取blue通道数值并转换写成zip文件(2022DASCTF x SU 三月春季挑战赛 书鱼的秘密)
2022DASCTF x SU 三月春季挑战赛 书鱼的秘密
题目wp参考来源:
2022DASCTF x SU 三月春季挑战赛wp–WHT战队
一、.wav异或提取png
从data之后的第二个 k 之后开始,每隔10个字节,有一个字节的数据,其余的都是填充,混淆之类的数据。
把前几个字节提取出来与 233 异或。发现最终结果是png字节流文件尾的逆序。
编写脚本,将这些数据提取出来,异或,然后逆序重新写入成png
from binascii import *
data = ''
with open('书鱼的多重文件.wav', 'rb') as f:
with open('flag.png', 'wb') as f1:
for idx in range(0x9e, len(f.read()), 10):
f.seek(idx)
data += '{:02x}'.format(ord(f.read(1)) ^ 233)
data = data[::-1]
for i in range(0, len(data), 2):
hex_data = data[i:i+2][::-1]
f1.write(unhexlify(hex_data))
得到的png图片无法正常显示,binwalk分析发现,文件前部分都是无效数据,png图片被附加在了这些无效数据之后,foremost分离即可
二、提取blue通道数值并转换写成zip文件
Stegsolve的Data Extract查看并不像隐写了文件数据,猜测应该是对颜色动了手脚,使用 PS 打开,发现图片的前两行像素确实颜色一场,查看blue通道的数值,发现是 50 的十进制。继续提取前几个像素的blue数值,发现是 50 4B 03 04 的zip文件头。
编写脚本提取blue通道数值并转换写成zip文件
from PIL import Image
from binascii import *
img = Image.open('flag.png')
width, height = img.size
with open('flag.zip', 'wb') as f:
for h in range(2):
for w in range(width):
blue = '{:02x}'.format(img.getpixel((w, h))[2])
f.write(unhexlify(blue)
三、输入法九键+国际区号解密码
输入法九键226232是 Canada ,加拿大
国际手机号码开头,区号:
https://cwlwxr.github.io/s3n62u57_/
发现这些国家的区号代码,都有一至三四位数字,对应右边的数字,猜测右边的数字就是这些国家地区的区号代码下标,即得到:
226232 1 => 1
Canada
23442647826 1 => 9
Afghanistan
528842 3 => 1
Latvia
5893626874 3 => 2
Luxembourg
46342 2 => 1
India
6443742 1 => 2
Nigeria
473323 2 => 0
Greece
24462 1-2 => 86
China
6626 2 => 6
Oman
35426884 3 => 3
Djibouti
3782867425 484632 2 => 4
Equatorial Guinea
2654842 3 => 1
Bolivia
2376832 0-3 => -440
Bermuda
52726 1 => 8
Japan
1912120866341-440
>>> import hashlib
>>> hashlib.md5('1912120866341-4408'.encode()).hexdigest()
'4d1a3568b2a81c7d958892bf100b3f15
DASCTF{4d1a3568b2a81c7d958892bf100b3f15}
https://blog.csdn.net/Hardworking666
本人主要使用CSDN,地址献上,请多多指教。