【ctfshow】吃鸡杯-misc-wp

Fortune Cookie

动态的misc题目,第一次见,挺有新意的
图片下载后发现是png图片,那么就用tweakpng先查看crc
报错了,但是图片能打开,所以是图片的宽高被改变了

用脚本爆破图片的宽高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import struct
import binascii
import os

m = open("flag.png","rb").read()
k=0
for i in range(5000):
if k==1:
break
for j in range(5000):
c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j)+m[24:29]
crc = binascii.crc32(c) & 0xffffffff
if crc == 0x91918666: //crc
k = 1
print(hex(i),hex(j))
break

将图片的宽高修改为爆破出来的值

修改后再次用tweakpng查看图片的idat块
发现第一个idat块很小,将这个块删除

得到原始图片(放个小图,嘿嘿嘿,完整的大家自己做试试吧)

用stegsolve查看,会发现3个颜色通道的0通道有”异常”,保存下来
仔细观察,会发现左上角存在有规律的偏移

用stegsolve的stereogram solver功能进行偏移
当偏移到20的时候出现了文字信息,提示已经很明显了,我们换个方向再次进行偏移

我在偏移量为187的时候得到了flag

zipper, clipper, not need john the ripper

发现在windows下和linux下解压的内容不一样
因为windows下的文件夹名是不区分大小写的,解压后会合并

解压后共有58个,猜测是base58
用脚本解,注意有几个字母是没有的

1
2
3
4
5
6
7
8
9
10
11
12
import os,base58

text = [''] * 1000
dic = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

for i in dic:
numlist = os.listdir(f'./file/{i}')
for j in numlist:
text[int(j)] = i

t = base58.b58decode(''.join(text).encode()).decode()
print('ctfshow{' + t.split('{')[1].split('}')[0] + '}')

这个flag也是动态的

mumuzi的照片

根据hint.png,首先爆破base64编码表
脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import base64
import string
from itertools import permutations

with open('im_not_tao_god.txt.encode','r')as f:
a=f.read()

with open('im_not_tao_god.txt','rb')as b:
b=base64.b64encode(b.read()).decode()

with open('mumuzi.rar.encode','r')as f:
timu=f.read()

l=''
k=''
for i in range(len(a)):
if a[i] not in l:
l=l+a[i]
k=k+b[i]

d={}
x=string.ascii_uppercase+string.ascii_lowercase+string.digits+"+/="

for i in range(len(k)):
d[l[i]]=k[i]
yuanwen=''

for i in x:
if i not in l:
yuanwen=yuanwen+i


miwen=''
for i in x:
if i not in k:
miwen=miwen+i
print(yuanwen,miwen)

for order in list(permutations(miwen,4)):
for i in range(len(yuanwen)):
d[yuanwen[i]]=order[i]
s=''
for j in timu:
s=s+d[j]
bs=base64.b64decode(s)
with open('output\\'+''.join(order)+'.rar','wb')as f:
f.write(bs)

爆破后得到一个真的压缩包,其他的压缩包是坏的

解压后得到一个helloworld.txt和flag.rar
在hint.png中可以得到flag.rar 的密码范围是0-1234

用shell脚本爆破
先生成密码字典,可以用crunch命令

1
crunch 1 4 0123456789  >> passwd.txt
1
2
3
4
5
6
7
8
while [ -f "rars/flag.rar" ]
do
mv ./rars/flag.rar ./rars/flag_.rar
rar2john ./rars/flag_.rar >hash.txt
john hash.txt --wordlist=passwd.txt
password=`john hash.txt --show|head -n1|cut -d":" -f 2`
unrar e -o+ ./rars/flag_.rar ./rars/ -p${password}
done

爆破了大概一个小时。。。结果还是假的
最后得到的txt文件里写着:flag不在这里,你得往回走。

观察最后的flag.rar得知rar文件是有注释的将所有注释提取出来

根据txt的提示,flag得往回走,观察最后一段注释,发现是png文件头反过来,将所有注释连在一起然后reverse,得到png文件

用010打开图片,CRC报错说明宽高被改过了,爆破出正确的宽度然后binwalk可以发现提示:我就知道你们只喜欢loli不喜欢我,我都穿成这样了你还不知道该对我(png,绝对不是mumuzi)做什么么?

说明是brainfuck的brainloller模式,直接bftools一下这个图片就出来了bftools.exe decode brainloller mumuzi.png得到flag

火烤大牛1.0

补上PLTE和修改宽高即可

信守着承诺

根据提示找到一个信息

信守着承诺

在文件中发现zip结构,用foremost分离后发现一个带密码的压缩包
用歌词成功解压
结尾处有一串base64加密的字符串
解密后就是flag

在?看看密码

非预期解
直接可以找到flag

预期解
利用volatility
先imageinfo和pslist分析

然后就是找密码了
因为firefox的密码管理器db和json文件存放在Roaming\Mozilla\Firefox\profiles\xxxxxxx.default\key4.db和logins.json。所以直接找这两个,然后用github的firefox密码查看器脚本或者用软件即可

先查看在下载
volatility -f looklookpassword.vmem –profile=Win7SP1x64 filescan |grep ‘key4.db’
volatility -f looklookpassword.vmem –profile=Win7SP1x64 filescan |grep ‘logins.json’
volatility -f looklookpassword.vmem –profile=Win7SP1x64 dumpfiles -Q 0x000000003d6ab4b0 -D ./
volatility -f looklookpassword.vmem –profile=Win7SP1x64 dumpfiles -Q 0x000000003ec70d00 -D ./


拿到flag

qcode

解压得到很多个二维码图片
使用脚本批量扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pyzbar.pyzbar as pyzbar
from PIL import Image
import os
from tqdm import tqdm
path = 'C:\\Users\\username\\Desktop\\qcode'
texts = ['']*9424
list = ['']*9424
i = 0
for filename in os.listdir(path):
list[i] = filename
i += 1
print('目录文件获取完毕')

for i in tqdm(range(len(list))):
img = Image.open(path +'\\'+ list[i])
texts[i] = pyzbar.decode(img)
print('图像信息获取完毕')
i = 0
for j in range(len(texts)):
for text in texts[j]:
tmp = text.data.decode("utf-8")
if('ctfshow{' in tmp):
print('二维码 ' + list[j] + ' 解码出ctfshow:' + tmp)
if('flag{' in tmp):
print('二维码 ' + list[j] + ' 解码出flag:' + tmp)

得到一个假的flag

发现这张图片中还带有zip
用binwalk或foremost分离出来
解压后有flaag.txt和glb两个文件
打开glb文件的百度经验
改名为1.glb打开

得到两串字符

The key:12

First kaisa second fence key

打开flaag.txt
开头是一个假的flag
后面是大量的255,用脚本进行画图

1
2
3
4
5
6
7
8
9
10
11
12
13
from PIL import Image
pic = Image.new("RGB",(1000,1000))
f = open("flaag.txt",'r').readlines()
for i in range(len(f)):
s = f[i].split(',')
for j in range(len(s)):
if(s[j] == '255'):
pic.putpixel((j,i),(255,255,255))
elif s[j].find('\n')>0:
pic.putpixel((j,i),(255,255,255))
else:
pic.putpixel((j,i),(0,0,0))
pic.save("qcode.png")

得到这样一张图片

然后根据key
凯撒12,再栅栏12即可得到flag

od0dfmz_rf_Begfdtxtaam1nifex{u_qOaIy0zm}zefs_q
cr0rtan_ft_Psutrhlhooa1bwtsl{i_eCoWm0na}nstg_e 凯撒12
ctfshow{C0ngratulations_0n_th1s_Water_Problem} 栅栏12


【ctfshow】吃鸡杯-misc-wp
https://www.dr0n.top/posts/81e3f8e/
作者
dr0n
发布于
2021年7月16日
更新于
2024年3月21日
许可协议