BugkuCTF 部分题解(随缘更新)

Posted z.volcano

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BugkuCTF 部分题解(随缘更新)相关的知识,希望对你有一定的参考价值。

之前做的题在BugkuCTF 部分题解(一)

佛系更新

11月9日更新了奇怪的压缩包
11月7日更新了这个flag,就是逊啦、不可以破译的密码
10月26日更新了真正的爱情

bugku

MISC

奇怪的压缩包

给了三张图,首先是shumu.bmp,bmp的话优先考虑lsb隐写silencenteye隐写,是后者,解出第一组数据

然后是xiaoshumu.png,B0通道发现一个二维码,扫码得到一些十六进制数据

还有一个jpg,是jphs隐写,密码在exif信息中

解出第三组数据,拼接在一起得到一个加密的压缩包

flag3直接crc32爆破得到CTF-,爆破得到flag2.txt的密码是456789,内容为an-excellent-。猜想一下flag1.txt的密码也许是123456?猜对了,内容是flagBugku-is-

猜想之后是要明文攻击,用bkcrack应该也可以跑,具体可以参考我另一篇wp

因为上次打完比赛重装系统了,再次安装bkcrack出现了问题,所以这里就用ARCHPR进行攻击了,首先对于明文攻击,要明确:

1.AES256加密方式不适用
2.ZipCrypto Deflate和ZipCrypto Store可以使用

可见flag1.txt和flag2.txt是AES-256,也导致了如果用ARCHPR直接打开这个压缩包,会显示:明文攻击不适合这个文件。

解决办法是,用010editor打开压缩包,删去flag1.txt和flag2.txt对应部分的数据(这部分自行探索,全教了就没意思了),然后再用winrar对得到的压缩包进行修复。效果如下

测试一下可以得知flag4.txt的内容就是前面得到的三段伪flag拼凑起来:flagBugku-is-an-excellent-CTF-

然后正常明文攻击就行,记得搜索完口令到如下界面时,直接停止即可得到解密后的文件。

flag就在flag.txt中,不过前面得到的flagBugku-is-an-excellent-CTF-是段伪flag,最后一个单词很好猜,但是真正的flag对前面的字符都进行了混淆替换,别想着猜flag了。

这个flag,就是逊啦

提示:第一层有两个hint;数字→文字→数字
第二层:0→1,1→0

不可以破译的密码

第一层类似维吉尼亚

lt = [['P', 'Q', 'L', 'N', 'E', 'Y', 'O', 'D', 'H', 'R', 'J', 'M', 'B', 'K', 'C', 'T', 'F', 'U', 'A', 'Z', 'S', 'X', 'I', 'W', 'V', 'G'],
['H', 'R', 'V', 'K', 'E', 'I', 'Y', 'B', 'J', 'G', 'M', 'Q', 'P', 'C', 'X', 'D', 'F', 'N', 'Z', 'T', 'U', 'O', 'L', 'A', 'W', 'S'],
['S', 'N', 'U', 'K', 'R', 'T', 'P', 'B', 'O', 'E', 'X', 'G', 'A', 'V', 'Z', 'Q', 'D', 'J', 'H', 'W', 'C', 'Y', 'I', 'M', 'L', 'F'],
['J', 'T', 'K', 'Q', 'V', 'F', 'L', 'X', 'D', 'Z', 'W', 'U', 'O', 'A', 'M', 'I', 'E', 'B', 'Y', 'G', 'P', 'R', 'S', 'H', 'C', 'N'],
['J', 'Z', 'B', 'L', 'E', 'P', 'K', 'G', 'N', 'O', 'A', 'C', 'R', 'U', 'I', 'S', 'D', 'M', 'F', 'V', 'X', 'H', 'Q', 'T', 'W', 'Y']]

d = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

x = 0

f = open('cipher_text.txt','r')
f1 = open('out.txt','w')
for i in f.read():
    if i.isalpha():
        ls = lt[x]
        ind = ls.index(i)
        flag = d[ind]
        f1.write(flag)
        x = (x + 1) % 5
    else:
        f1.write(i)
f.close()
f1.close()

得到的结果hex解一下就是zip文件了

一眼crc32碰撞,不过解出来的没有可读的,需要生成字典爆破一下

跑完自己爆破一下。

a = ['2miMR_', '5tnsxt', 'EiAfA8', 'U4YYYg', 'Uytd4o', 'VE0Kvk', 'WEqzmr', 'Yk0Z80', 'ZWtuz4', 'fZ6p89', 'it6avb', 'jHrN4f', 'kimoF3', 'ompnGP', 'wJBCVw', 'z44aEu', 'zXGLA1']
b = ['Bu2vU1', 'GqnFOK', 'JB5Y1A', 'NgvHYn', 'Og7yBw', 'PEM6xo', 'YSU8nJ', 'nhEqbk', 'qVpbYg', 'us3s1H', 'wO6mhU', 'wSy1iA']
c = ['1OFImu', '3sCW4h', 'CO2Rdh', 'DJz0OW', 'DV5lNC', 'Iens0I', 'KYkmiT', 'N1Dpwj', 'XTDP7K', 'ZhANnV', 'eYGdn_', 'geBz7B', 'kVXTRQ', 'lO_jxz', 'oREUS2', 'sqjyCv', 'zgrwUS']
d = ['9pJQTY', 'CG9e94', 'CfguPx', 'G_k89C', 'Li9two', 'MixElv', 'RWMVWz', 'dpSrAV', 'qEdPG7', 'rD13mk', 'uAyQFT', 'w0QrrA']
e = ['33r8sz', '7GSHwI', '9HLxKG', 'BBo1Uk', 'DGfbeM', 'F6NAQX', 'H9QqmV', 'JHyRYC', 'KH8cBZ', 'UvLAbO', 'cQRetc', 'h6bHVS', 'jGJkbF', 'u4RE4B']

f = open('password.txt','w')
for i in a:
    for j in b:
        for l in c:
            for m in d:
                for n in e:
                    s = i+j+l+m+n
                    f.write(s)
                    f.write('\\n')
f.close()

套娃解密,最后的密文再解一下栅栏,flag小写

import base64


f = open('flag.txt','r')

s = f.read()

while 1:
    try:
        s = base64.b32decode(s)
    except:
        try:
            s = base64.b16decode(s)
        except:
            try:
                s = base64.b64decode(s)
            except:
                print(s)
                break
f.close()

真正的爱情

聊天记录,很明显是摩斯密码,把字替换成-进行解密得到wandwbxdwn(我爱你但我不想耽误你)

另一张图片尾部有压缩文件的数据,提取保存并用得到的密码解压。

熟悉的声音.mp3听起来明显是拨号音,有能力的师傅直接就听出结果了,听不出来的师傅可以参考我另一篇博客的做法,再或者使用dtmf2.exe工具也行。

密码:19865153975,解压缩包,进入下一层。

ppt文件里给了很多图片,真正有用的被藏起来了,众所周知pptx的本质是压缩包,改后缀为zip解压可以翻到两个图片,下图应该是某种替换密码。

google一下就可以找到密码表,则密码为:wdxcyyyzyq(晚冬夏初要永远在一起)

最后这个视频是有点搞的,试了一些隐写都不对,根据视频里文字内容猜想flag可能是前面的密码

以上尝试均寄,直到我暂停完回来发现底部隐约有东西(这个位置一般是被进度条挡住的)

stegsolve处理一下可以得到一部分flag,多试几次就可以得到完整flag

ez_misc

修复abc.rar的文件头,解压出a.zip、b.zip、c.txt

c.txt是jpg图片,修改后缀,修改图片高度得到yQsad6E1,用于解压b.zip,得到一个二维码,扫描得到提示GIF89a。再看flag.docx,下面那行应该是隐藏文字,我默认是可见的,如果看不到自己改一下设置

用得到的密码解压a.zip,得到call.png,结合前面的提示,修改文件头,stegsolve打开得到flag

Happy ZQ

1.txt和2.txt长度都是6,很明显是crc32碰撞,得到_pass__word_,合起来之后作为密码解压p.zip

得到Happy_zhong_qiu,用于解压can you find it.zip

passwd.txt是snow隐写,解出Mid-Autumn_Festival,然后解压拿flag…

粉色的猫

压缩包注释TCAACTTAGCTGTGATGATGTTCAGATTAGCTAATCG四个字符组成,很容易联想到腺嘌呤A,胸腺嘧啶T,胞嘧啶C,鸟嘌呤G这四个碱基,而这四个碱基是组成DNA的基本单元。

于是猜想这可能是DNA相关的一种加密,查到一篇文档:https://arxiv.org/pdf/0903.2693.pdf

可以发现解密过程,除了已知的密文序列外,还需要知道对应的密码本。但是本体中只给了一串密文,猜想不是这一种加密。

然后又找见一个DNA翻译的脚本

s = 'TCAACTTAGCTGTGATGATGTTCAGATTAGCTA'

table = 
    'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M',
    'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T',
    'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K',
    'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R',
    'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L',
    'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P',
    'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q',
    'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R',
    'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V',
    'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A',
    'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E',
    'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G',
    'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S',
    'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L',
    'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_',
    'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W'
    
for i in range(len(s)//3):
    x = s[3*i:3*(i+1)]
    print(table[x],end="")

跑出的结果是ST_L__CSD_L,不是压缩包密码,猜想掩码爆破,也没得到密码


之前就卡到这个位置不做了,今天有空刷刷文章,偶然看到树木师傅的wp,发现最开始的思路是对的,解密确实需要用到密钥,所以只能使用出题人用的那个在线网站……其他的工具会因为密钥不同无法解出

解得密码:CATISSOCUTE

解得的key.txt的内容看特征应该是PDU编码了,用在线网站逐行解码,最后拼接在一块再转为png文件

图片看起来挺怪的,这个是npiet,可以看看1998师傅的文章

可以用在线网站解,记得科学上网,不然会报Please check the the captcha form.。也可以用工具解。
测试发现:需要将这个图片反色处理之后才能成功解出隐藏的信息。

解得的a=13b=14暂时不知道什么意思,用010打开之前的无后缀文件1,发现是bpg文件。bpg图片不能在windows系统下直接显示,查看方式可以参考misc入门的misc3

使用工具查看,发现图片无法正常显示。

在前面查询npiet相关资料时,发现这个题考察的知识点和HGAME2022 谁不喜欢猫猫呢差不多,最后一步考察的是Arnold变换(猫脸变换)

这里的图片需要用工具转为png格式后才能正常使用脚本,Image.opencv2.imread好像都不支持bpg格式的读取。

变换完再查看可以得到flag。

from PIL import Image

img = Image.open('out.png')
if img.mode == "P":
    img = img.convert("RGB")
assert img.size[0] == img.size[1]
dim = width, height = img.size

st = 33
a = 13
b = 14
for _ in range(st):
    with Image.new(img.mode, dim) as canvas:
        for nx in range(img.size[0]):
            for ny in range(img.size[0]):
                y = (ny - nx * a) % width
                x = (nx - y * b) % height
                canvas.putpixel((y, x), img.getpixel((ny, nx)))
canvas.show()
canvas.save('result.png')

请叫我艺术家

word里有个像素画,和一串符号

前者用工具解出半个flag

文档末尾的todpole提示了这串符号是蝌蚪文,在线网站解密得到后半段flag

simple MQTT

解题过程还是简单的,关键是学习了解一下mqtt协议

wireshark打开后,分析追踪流TCP流

上面那部分显然是rar文件数据,下半部分则提示了密码为:th1s_1s_rar_p@ssw0rd,解压拿flag

Where is flag Plus

压缩包中共有1936个txt文件,对应序号0-1935,每一个txt的大小都是12,内容像是base64编码,但是解码得到的是乱码,换了几种组合方式后解得的依旧是乱码

转换思路,看看文件的crc32校验值,没有找到规律;但是发现文件的修改时间比较奇怪,而且只有秒数不一样

于是把所有文件解压到一个文件夹下,写个简单脚本分析可知,秒数分布为30-50,再结合文件个数为1936,正好能被8整除

import os
import time

out =[]
flag = ""

for i in range(1936):
    path = r'dir\\.txt'.format(str(i))
    # 获取修改时间
    file_time = os.path.getmtime(path)
    s = time.ctime(file_time)
    out.append(int(s[17:19]))
print(max(out)) #50
print(min(out)) #30

于是遍历文件的修改时间,如果秒数大于40则记为1,否则即为0,再将得到的二进制转hex

import os
import time

flag = ''
out=''

for i in range(1936):
    path = r'dir\\.txt'.format(str(i))
    file_time = os.path.getmtime(path)
    s = time.ctime(file_time)
    if int(s[17:19]) >= 40:
        flag += '1'
    else:
        flag += '0'
    if len(flag) == 8:
        out += hex(int('0b'+flag,2))[2:].zfill(2)
        flag = ''
print(out)

保存为7z文件,得到snow.txt,看特征明显是snow加密
这里需要密码,得爆破,随便上网找个弱口令字典,运行完了ctrl+f查找有无flag输出就行

import os

f = open('wordlist.dic','r')
for line in f.read().splitlines():
    out = str(os.system('SNOW.EXE -p  -C snow.txt'.format(line))

以上是关于BugkuCTF 部分题解(随缘更新)的主要内容,如果未能解决你的问题,请参考以下文章

BugkuCTF 部分题解(持续更新)

BugkuCTF WEB解题记录 16-20

BugkuCTF WEB解题记录 21-25

BugkuCTF 计算器

BugkuCTF web2

BugkuCTF sql注入