一道进阶类型的misc, 配合密码学和标记标识符
strings拿到假的flag
CTFlearn{TheKeymakerIsK00l}
之后binwalk, stegsolve没有收获, winhex打开看看16进制数据
发现有base64数据, 如果直接复制换行会有问题, 所以还是用strings
strings -n 8 The-Keymaker.jpg
b3BlbnNzbCBlbmMgLWQgLWFlcy0yNTYtY2JjIC1pdiBTT0YwIC1LIFNPUyAtaW4gZmxhZy5lbmMg
LW91dCBmbGFnIC1iYXNlNjQKCml2IGRvZXMgbm90IGluY2x1ZGUgdGhlIG1hcmtlciBvciBsZW5n
dGggb2YgU09GMAoKa2V5IGRvZXMgbm90IGluY2x1ZGUgdGhlIFMwUyBtYXJrZXIKCg==
解码得到三句话
openssl enc -d -aes-256-cbc -iv SOF0 -K SOS -in flag.enc -out flag -base64
iv does not include the marker or length of SOF0
key does not include the S0S marker
flag用AES-256-CBC加密了, 所以需要找到 IV, key, 和加密的flag
需要标记标识符的知识
http://vip.sugovica.hu/Sardi/kepnezo/JPEG%20File%20Layout%20and%20Format.htm
根据SOF0找到IV, 通过SOS找到key
找到SOF0, 长度是0x11, 之后接IV, 找到SOS, 之后接key
IV: 0800BE00C803011100021101031101FF
key: 000C03010002110311003F00F9766BFC44BEDA8F3F5C031B92CB0E92D6BDC952
flag: CmmtaSHhAsK9pLMepyFDl37UTXQT0CMltZk7+4Kaa1svo5vqb6JuczUqQGFJYiycY
解开密码, 拿到flag
strings和binwalk都无用, 意料之中, 这是个修复文件的问题
所以直接找修复方法, 题目也给了一个文件标识wiki网站
https://en.wikipedia.org/wiki/List_of_file_signatures
winhex打开, 发现文件头是错误的, 修改一下, 但是依然不能打开, 继续观察16进制文件, 发现修改的不仅仅是文件头, 整个文件的数据按4字节反转过来, 所以这就是题目"Programming might be useful"的意思吧
真就万物皆可逆向呗
with open("fl4g.jpeg", "rb") as fin:
OFFSET = 4
data_rev = b""
data_read = bytearray(fin.read(OFFSET))
while data_read:
data_rev += data_read[::-1]
data_read = fin.read(OFFSET)
with open("Flag.jpeg", "wb") as newfile:
newfile.write(data_rev)
4字节以此读进来, 反转后存入data_rev, 最后写入文件
得到flag
Flag{byt3_sw4p}
难得有道音频隐写题
丢进kali, file一下, 发现是ogg文件, 修改后缀用Audacity打开
切换到频谱图
调一下得到完整二维码
扫一扫拿到flag
the_flag_is{A_sP3c7r0grAm?!}
一张jpg图片, 尝试了stegsolve, strings, binwalk没有新发现
看了wp才知道是用stereogram solver在offset = 102处时能看到隐藏信息
这个题有点恶心啊, 藏得那么深就算了(offset 102), 显出来还那么模糊
flag{d0nt_m3s5_w1th_th3_KGB}
(试了很多次才拼对, 果断给差评
500张png图片, 应该是要自己拼凑起来得到flag
按高方向拼凑, 500*1 * 500 = 500 * 500
from PIL import Image
limgs = []
for i in range(500):
limgs.append(Image.open(str(i) + ".png"))
concrete = Image.new("RGB", (500, 500))
height = 0
for i in limgs:
concrete.paste(i, (0, height))
height += 1
concrete.save("complete.png")
concrete.show()
一串16进制字符串
666c61677b7468335f4b47425f6c307633735f4354467d
转ascii得到flag
flag{th3_KGB_l0v3s_CTF}
strings出了一个url
https://mega.nz/file/wZw2nAhS#i3Q0r-R8psiB8zwUrqHTr661d8FiAS1Ott8badDnZkoH
下载另一张图片
binwalk得到rar压缩包, 解压得到最后一张图片
strings拿到flag的加密形式
CTF{VmtaU1IxUXhUbFZSYXpsV1RWUnNRMVpYZEZkYWJFWTJVVmhrVlZGVU1Eaz0=)
base64解码4次得到
CTF{M1NI0NS_ARE_C00L}
小结: 这个隐写题算是把常规隐写的套路组合到了一起, 算是个比较完整的缝合怪, 不过只要按照strings, binwalk, stegsolve, winhex的解题流程公式基本的隐写问题都不是问题
一道非常规隐写(strings, binwalk, stegsolve无解), 没办法, 回到16进制文件的分析----作为隐写问题的最后手段, 题目说了注意0xffd9, 用winhex打开查找ffd9
几乎在文件最后找到一个ffd9标志, 没看出有啥线索
不过突然灵光一闪! 全文件只有俩个ffd9, 题目也说了是作为标志的, 那么俩个ffd9可以看做数据流的起始和结束, 所以包裹的数据就是flag!(大胆猜测)
然后根据xor is your friend这条提示, (之前也做了很多xor is friend的题目), 基本上可以想到是xor爆破
上cyber chef解密
给一个类似flag{***}的正则表达式给magic接口, 然后自动解密
用bruteforce也行, 要自己给已知字符串
CTFlearn{Ubuntu_r0ck5}
binwalk发现里含zip文件
foremost分离出来得到一个zip, 需要爆破解密
首先尝试了几个密码, 解压了非加密部分, grep -iR flag(筛选掉除flag之外的匹配项)
得到密码提示
就是5位数的爆破, 直接干就完了
from zipfile import ZipFile
from string import digits
import itertools
brute = itertools.product(digits, repeat=5)
with ZipFile("00000012.zip") as zf:
for i in brute:
psd = "ctflag" + "".join(i)
try:
zf.extractall(pwd = bytes(psd, 'utf-8'))
print("[+] password is " + psd)
except:
pass
运行脚本, 得到密码ctflag48625, 游戏结束
解压之后是base64
RkxBR3ttYXlfdGhlX2JydXRlX2ZvcmNlX2JlX3dpdGhfeW91fQ==
解码得到flag
FLAG{may_the_brute_force_be_with_you}
爆破原力与你同在