【CTF-MISC】BUUCTF有趣的题

Author Avatar
白菀枯
发表:2024-07-29 22:29:46
修改:2024-07-29 22:29:46

比较可惜的是前七十题中有意思的没记录一下

喵喵喵

第一道这么套娃过的题:

  1. 先是正常的图片隐写,不过发现需要BGR才可以的情况。

  2. 又注意到保存的图片无法查看,才注意到十六进制的开头多了一段不正常的东西,删掉后的89 50 4e 47 正常png头。

  3. 然而此时的图片仍不正常,仅有一般,也发现是crc篡改,更改高度成正方形出现二维码。

  4. 本以为大功告成的扫码后,得到的是不正常的网盘链接,下载后得到一个压缩包

  5. flag.txt的朴实的txt里没有flag却被压缩包压缩,尝试一圈最后才想到是NTFS隐写,重新用winRAR解压,用alternatestreamview工具得到新的文件pyc,可惜还不是flag

  6. 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']
  1. 最后一步终于是“逆向”出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的解题脚本来呢

评论