前言
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/,有意向的用户可以通过官方邮箱catf1ag@163.com进行联系 。对于想要加入交流的用户,平台还提供了官方QQ群和频道,方便用户之间的互动和交流 。
需要注意的是,平台上的部分题目可能需要特定的环境配置,例如WEB题目会包含dockerfile,而PWN/ATTACK题目则必须包含dockerfile以确保题目环境的完整性 。对于题目的flag格式,平台有统一的要求,即flag需要以"catf1ag{}"的格式呈现 。
总的来说,Catf1agCTF是一个资源丰富、适合各个水平CTF爱好者的训练平台,无论是新手还是有经验的参与者,都能在这里找到适合自己的学习和提升机会
一、RSA-3
打开靶场
n1= 183469842288888698417653802680141427113
c1= 164902072322430301806156830767158214618
n2= 132129814650346877352056990357711290601
c2= 72639976324405495408757557698962328431
n3= 231012220957834183374915196020656181347
c3= 43776935818299645885303359439033653256
import gmpy2
import libnum
n1 = 183469842288888698417653802680141427113
c1 = 164902072322430301806156830767158214618
n2 = 132129814650346877352056990357711290601
c2 = 72639976324405495408757557698962328431
n3 = 231012220957834183374915196020656181347
c3 = 43776935818299645885303359439033653256
def GCRT(mi, ai):
# 当前的模数,初始化为第一个模数 mi[0]
# 当前的余数,初始化为第一个密文 ai[0]
curm, cura = mi[0], ai[0]
# 遍历后续的模数 m 和对应的密文 a
for (m, a) in zip(mi[1:], ai[1:]):
# 计算当前模数和新模数的最大公约数 d
d = gmpy2.gcd(curm, m)
# 计算余数的差 c
c = a - cura
# 通过乘以逆元计算出新余数的比例 K
K = c // d * gmpy2.invert(curm // d, m // d)
# 更新当前的余数 cura,并根据广义中国剩余定理重新计算新的 curm
cura += curm * K
curm = curm * m // d
cura %= curm
return cura % curm, curm
C, N = GCRT([n1, n2, n3], [c1, c2, c3])
print(libnum.n2s(int(C)))
二、神秘的坐标
打开靶场
得到一堆数字
一组数字代表一个键盘上字母,例如28,表示键盘第二行第八个即 K
catf1ag{keyboradcoordinates}
三、倪九岚
打开靶场
根据题目的谐音”逆九栏“尝试先将字符串逆序,再栅栏解密
catf1ag{RailfenceCipher}
四、偶变异了
打开靶场
打开文件如下
bcwb4g`s;hj>;j:t<%"$q;&)|y6%x-
AG@ELINP
推测经过了异或规则
a = '''bcwb4g`s;hj>;j:t<%"$q;&)|y6%x-
AG@ELINP'''
f = 1
for i in a:
# ord(i): 将字符 i 转换为其对应的ASCII值(整数)
# ord(i) ^ f: 将这个ASCII值与当前的 f 进行XOR操作
# XOR(异或)操作的特性是相同的二进制位会被置0,不同的会被置1。这意味着可以使用XOR操作来加密和解密字符,只要使用相同的关键值
# chr(...):将XOR后的值转换回字符
# end=''确保所有字符在同一行输出,不加任何额外的换行符
print(chr(ord(i) ^ f), end='')
f += 1
提交时将 * 改为 -
五、XOR
打开靶场
用‘flag{’和密文前5个字符异或,推出字符‘GAMEG’,推测是GAME循环异或
s='!-,"<#}|!#}q#lt#w#`qpw.h~wyvjru#"x.p$s/v%<'
x='GAME'
result=''
for i in range(len(s)):
result += chr(ord(s[i]) ^ ord(x[i % 4]))
print(result)
六、[原九小时AK赛] 疑惑
打开靶场
题目
简单的异或运算
keys1 = 'welcome_to_nine-ak_match_is_so_easy_!@!'
keys2 = '20 4 24 5 94 12 2 36 26 6 49 11 68 15 14 114 12 10 43 14 9 43 10 27 31 31 22 45 10 48 58 4 18 10 38 31 14 97 92'
keys2 = keys2.split()
flag = ''
for i in range(len(keys1)):
flag += chr(ord(keys1[i]) ^ int(keys2[i]))
print(flag)