ctfshow 愚人杯 2023
MISC
一、奇怪的压缩包
1.zip包伪加密,两个头都需要改
2.打开得到png,看图片底部,猜测高度错误,改150到300,得到字串,同时在图片的末尾有zip包,zip为真加密,文件末尾密码
3.打开后,改宽高,得到flag
二、哇库哇库2
1.zip包是加密的,注释中有密码提示,在网上找了一下没有找到相关的答案,直接问问new bing,得知答案是
2.71828182846
2.HINT.png,改一下文件头为89 50 4E 47,然后显示CRC错误,看一下宽高,都是1
3.使用脚本爆破宽高,脚本来自之前的网上收集
点击查看代码
import zlib
import struct
filename = 'HINT.png'
with open(filename, 'rb') as f:
all_b = f.read()
crc32key = int(all_b[29:33].hex(), 16)
data = bytearray(all_b[12:29])
n = 4095 # 理论上0xffffffff,但考虑到屏幕实际/cpu,0x0fff就差不多了
for w in range(n): # 高和宽一起爆破
width = bytearray(struct.pack('>i', w)) # q为8字节,i为4字节,h为2字节
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x + 4] = width[x]
data[x + 8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
# 2021.7.20,有时候显示的宽高依然看不出具体的值,干脆输出data部分
print(data.hex())
print("宽为:", end="")
print(width)
print("高为:", end="")
print(height)
exit(0)
4.改宽高,得到正常的png文件,上面是GB2312
5.查了一下 GB2312是一种字符编码,没什么用,正解是把每行的最后的标点提取出来,转为英文模式,写个脚本
点击查看代码
f1 = open("./2.txt", "r", encoding='utf-8')
f2 = open("./3.txt", 'w', encoding='utf-8')
text = f1.readlines()
text = list(text)
ls = []
for i in text:
f2.write(i[-2])
f1.close()
f2.close()
6.需要手动将。替换为. ?替换为? !替换为!,直接在线解码 Ook! to text,得到flag
https://www.splitbrain.org/services/ook
..................!?!!.?..................?.?!.?....................................!.?.........!?!!.?........?.?!.?..!.?.......!?!!.?!!!!!!?.?!.?!!!!!!!!!!!.?.......!?!!.?......?.?!.?........!.?.......!?!!.?!!!!!!?.?!.?!!!!!...............!.................!.........!.?.................!?!!.?!!!!!!!!!!!!!!!!?.?!.?!!!!!!!!!!!!!!!.?...............!?!!.?..............?.?!.?..................!.!!!!!!!!!!!.?.........!?!!.?........?.?!.?!.?.........!?!!.?!!!!!!!!?.?!.?!!!!!!!!!!!!!!!!!.!!!!!.?.........!?!!.?!!!!!!!!?.?!.?!!!!!!!!!.?.........!?!!.?........?.?!.?............!.?.......!?!!.?!!!!!!?.?!.?!!!.?.......!?!!.?......?.?!.?..!.?.............!?!!.?!!!!!!!!!!!!?.?!.?!!!!!!!!!!!!!!!!!!!!!!!!!.?...............!?!!.?..............?.?!.?..............!.?.................!?!!.?!!!!!!!!!!!!!!!!?.?!.?!!!!!!!!!!!!!!!!!.?...................!?!!.?..................?.?!.?......................!.?.
三、琴柳感
1.很多句重复的话,除去开头和结尾两句话,一共四种类型,猜测跟四进制有关,写个脚本进行计算(这里贴一个大佬的脚本,自己的脚本有点问题)
点击查看代码
import itertools
from Crypto.Util.number import *
x = "我必须站在这里。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有听见孩子们的悲鸣?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你是否想过......朋友不再是朋友,家园不再是家园。你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你不曾注意阴谋得逞者在狞笑。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你有没有感受到城市在分崩离析?你有没有感受到城市在分崩离析?你是否想过......朋友不再是朋友,家园不再是家园。你是否想过......朋友不再是朋友,家园不再是家园。你有没有感受到城市在分崩离析?您让我看到了废墟中挣扎着抬起头的青草。谢谢您。"
x = x.split('。')
x = [i.split('?') for i in x]
s = []
for i in x:
for j in i:
s.append(j)
s.remove('')
t = ['你有没有听见孩子们的悲鸣', '你是否想过......朋友不再是朋友,家园不再是家园', '你有没有感受到城市在分崩离析',
'你不曾注意阴谋得逞者在狞笑']
for k in itertools.permutations('0123'):
m = ''
for i in s:
if i == t[0]:
m += k[0]
elif i == t[1]:
m += k[1]
elif i == t[2]:
m += k[2]
elif i == t[3]:
m += k[3]
m = long_to_bytes(int(m, 4))
if b'ctfshow' in m:
print(m)
# b'ctfshow{xingbucengxing_yibuzaiyi_zaikelianyilianba}'
四、低端的base64
1.得到很多像是base64的字串,根据题目名字,猜测是将大写字母转化为了小写字母,但具体是哪些不清楚,写个脚本爆破,脚本思路:首先将所有字串分为四个为一组,然后遍历每一组,如果是字母的话就将它增加一种大写的可能,然后每组遍历进行base64decode,找到可能值。(每组遍历完建议加一个换行,好看一些)
点击查看代码
import base64
f = open("./flag.txt","r")
f1 = open("./2.txt","w",encoding='UTF-8')
a = f.readlines()
x = ''
for i in a:
x += i
x = [x[i:i + 4] for i in range(0, len(x), 4)]
# 四个为一组分隔开
y = []
for i in x:
s = []
for j in i:
# 逐个遍历字符,判断是否为数字,为字母的话添加一种大写的可能
if j.isdigit():
s.append(j)
else:
s.append([j, j.upper()])
y.append(s)
for i in y:
res = ''
f1.write("\n")
for a in i[0]:
for b in i[1]:
for c in i[2]:
for d in i[3]:
try:
f1.write(base64.b64decode((a + b + c + d).encode()).decode())
f1.write(',')
# 四个为一组解密
except:
pass
f.close()
f1.close()
2.第二步就是纯靠猜,找一下{,发现只有一个区域有可能,拼拼凑凑,需要注意连续的每行都有,不要少了
ctfshow{base64_1s太难了!!I服了U!}
RE
一、easy_pyc
1.得到pyc文件,在线反编译一下,得到python2.7的代码,code列表中就是将flag逐个进行加密后的值,根据源代码写个脚本逆回去
点击查看代码
code = [b'\x16', b'\x1d', b'\x1e', b'\x1a', b'\x18', b'\t', b'\xff', b'\xd0', ',', b'\x03', b'\x02', b'\x14', '8', 'm', b'\x01', 'C', 'D', b'\xbd', b'\xf7', '*', b'\r', b'\xda', b'\xf9', b'\x1c', '&', '5', "'", b'\xda', b'\xd4', b'\xd1', b'\x0b', b'\xc7', b'\xc7', b'\x1a', b'\x90', 'D', b'\xa1']
l = len(code)
# for i in code:
# num_chr = ord(i)
# i = num_chr
code = map(ord, code)
code = list(code)
for i in range(l - 3, 0, -1):
# 倒序
code[i-1] = code[i-1] ^ code[i]
flag = ''
for i in range(l):
num = ((code[i] - i)% 114514 + 114514) % 114514
flag += chr(num)
print(flag)
ctfshow{Just_F00l's_D@y_R3_Ch3ck-in!}