【CTF-MISC】BUUCTF有趣的题
比较可惜的是前七十题中有意思的没记录一下
喵喵喵
第一道这么套娃过的题:
先是正常的图片隐写,不过发现需要BGR才可以的情况。
又注意到保存的图片无法查看,才注意到十六进制的开头多了一段不正常的东西,删掉后的
89 50 4e 47
正常png头。然而此时的图片仍不正常,仅有一般,也发现是crc篡改,更改高度成正方形出现二维码。
本以为大功告成的扫码后,得到的是不正常的网盘链接,下载后得到一个压缩包
flag.txt的朴实的txt里没有flag却被压缩包压缩,尝试一圈最后才想到是NTFS隐写,重新用winRAR解压,用alternatestreamview工具得到新的文件pyc,可惜还不是flag
pyc是python代码编译后文件,反编译后得到如下代码
import base64
def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)): # 遍历的是从0到flag长度的每个数字
s = chr(i ^ ord(flag[i])) # 对flag的第i位取asicc码值,后与它的下标i做异或运算,再转回char字符,得到当前的s
if i % 2 == 0: # 如果下标被2整除(为偶数)
s = ord(s) + 10 # s这个字符取回asicc码再+10,得到数字s (所以上一步的chr并没效果)
else: # 否则的话,s的ascii-10
s = ord(s) - 10
ciphertext.append(str(s)) # 把得到的数字转换为字符串形式追加到已有列表上
return ciphertext[::-1] # 返回的还是倒转后的结果
ciphertext = [ # 结果如下
'96',
'65',
'93',
'123',
'91',
'97',
'22',
'93',
'70',
'102',
'94',
'132',
'46',
'112',
'64',
'97',
'88',
'80',
'82',
'137',
'90',
'109',
'99',
'112']
最后一步终于是“逆向”出flag了:
ciphertext = [
'96',
'65',
'93',
'123',
'91',
'97',
'22',
'93',
'70',
'102',
'94',
'132',
'46',
'112',
'64',
'97',
'88',
'80',
'82',
'137',
'90',
'109',
'99',
'112']
ciphertext = ciphertext[::-1] # 再逆转回来
flag = ''
for i in range(len(ciphertext)): # 同样是遍历每个下标
s = 0 # 仅仅是定义一个数字
if i % 2 == 0:
s = int(ciphertext[i])-10 # 列表里的每个元素还是字符串,先取int,再-10,得到的就是源代码里s = ord(s) + 10前的结果
else:
s = int(ciphertext[i])+10 # 同样
flag += chr(s ^ i) # 先把数字s与i异或,再转换成char追加到flag
# 源码中的 s=chr(i ^ ord(flag[i]))chr中的内容就是上述得到的s,有s=i ^ ord(flag[i]),根据性质就有ord(flag[i])=s^i,故上式
print(flag)
得到flag{Y@e_Cl3veR_C1Ever!}
这还是我第一次能独立写出python的解题脚本来呢