前言
Catf1agCTF 是一个面向所有CTF(Capture The Flag)爱好者的综合训练平台,尤其适合新手学习和提升技能 。该平台由catf1ag团队打造,拥有超过200个原创题目,题目设计注重知识点的掌握,旨在帮助新手掌握CTF相关的各种技能 。除了新手题目,平台也包含难度不一的题目,适合不同水平的CTF参与者 。
平台上的题目类型多样,包括WEB、MISC、CRYPTO、LINUX、PWN/ATTACK、REVERSE等,题目分数制度从60分到100分不等,难度从1星到5星 。题目提交时需要包含完整的题目环境、flag以及writeup,以确保题目的完整性和可解性 。
此外,Catf1agCTF平台还提供了一些辅助工具和资源,如在线工具箱、SRC资料和HW资料等,以帮助用户更好地进行学习和实战演练 。平台的网址为 https://catf1ag.cn/,有意向的用户可以通过官方邮箱[email protected]进行联系 。对于想要加入交流的用户,平台还提供了官方QQ群和频道,方便用户之间的互动和交流 。
需要注意的是,平台上的部分题目可能需要特定的环境配置,例如WEB题目会包含dockerfile,而PWN/ATTACK题目则必须包含dockerfile以确保题目环境的完整性 。对于题目的flag格式,平台有统一的要求,即flag需要以"catf1ag{}"的格式呈现 。
总的来说,Catf1agCTF是一个资源丰富、适合各个水平CTF爱好者的训练平台,无论是新手还是有经验的参与者,都能在这里找到适合自己的学习和提升机会。
一、审查元素
打开靶场
zygsctf{flagisgood}
二、这是谁?
打开靶场
下载文件后补上后缀名打开
识图发现是著名的数学家
使用 steghide info 检测文件是否存在隐写,发现有隐写文件,根据题目猜测密钥是斐波那契的英文名Fibonacci
打开压缩包发现一直是套的
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
我们解压出的压缩包正好是21整,接下来对照斐波那契数列排列。
import zipfile
import os
file_path = input('path : ')#压缩包路径
path = file_path[0:len(file_path)-len(file_path.split('\\')[-1])]
n = 0
s2 = ""
#"C:\Users\63606\Desktop\CTF\CTF\VFree\MISC\secret\272B3B7971F18FBA72391D3AF4DB5011C1FBBCF277FDC6F71E83D7DC8AB9A7A19AEA20444F8C9C5DBF9710E3A83B9791D3AF236D4CB603FFD9.zip"
def extract():
i = file_path.split('\\')[-1]#递归解压压缩包名称
data = ""
base64_secret = ''
str1 = ''
for x in range(22):
ss = i[:i.find(".")]
passwd = ss
zpf = zipfile.ZipFile(path + ss + ".zip")
list = zpf.namelist()
#print(list)
data+= str(ss[::-1])
print(x + 1)
for f in list:
#print(f)
zpf.extract(f, path, bytes(passwd.encode('utf-8')))
print(i)
if x+1 in [1,2,3,5,8,13,21]:
base64_secret += ss
if 'zip' in f:
print(path, passwd)
#os.remove(ss+'.zip')
i = str(f)
print(base64_secret)
extract()
[a2V5e3RoaXNfaXNfc2VjcmV0X2tleV8hISEhISF9]
解码
U2F 开头的密文不是 AES 就是 DES 系列,最终 AES 解密成功
三、0 和 1
打开靶场
打开是一段二进制
编写脚本绘制图像
from PIL import Image
f = open('1.txt', 'r').readlines()
pic = Image.new('RGB', (len(f), len(f)), (255, 255, 255))
for i in range(len(f)):
for j in range(len(f)):
if f[i][j] == '1':
pic.putpixel((j, i), (0, 0, 0))
pic = pic.resize((len(f)*10, len(f)*10))
pic.save('flag.png')
补上定位符即可
四、height
打开靶场
打开图片
使用 Python 脚本爆破 CRC
import binascii
import struct
# 打开图片
crcbp = open("../height.png", "rb").read()
# 读取图片中的CRC校验值
crc32frombp = int(crcbp[29:33].hex(), 16)
print(crc32frombp)
# 宽度1-4000进行枚举
for i in range(4000):
# 高度1-4000进行枚举
for j in range(4000):
data = crcbp[12:16] + \
struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == crc32frombp: # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
print(i, j)
print('hex:', hex(i), hex(j))
exit(0)
在 WinHex 中打开图片修改
拿到 flag