ISCC2025 WriteUp 提交模板
WEB-ShallowSeek
泰拉芝士+罗文健+3217617004@qq.com
解题思路
打开题目

输入flag 之后
我们点击浅度思考(1R)
出现回显

我们输入f1@g.txt点击联网搜索再点击浅度思考(1R)出现回显

这时我们想到一个办法就是
输入

给了我们一半的flag
先保存下来
继续找找前半部分flag
点击左边的室友带饭问题

F12打开开发者选项,之后我们在evil-buttons.js中找到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| if (!bLocked) { fetch('api/hint.php') .then(r => r.text()) .then(txt => alert(txt)); } else { alert('给你讲个笑话:家人告诉程序员:去买两个桔子,如果有西瓜,就买一个,于是他最后买回来一个桔子。'); } }); }); if (!aLocked) { alert('为什么不试试选B?'); } else { fetch('api/get_frag.php') .then(res => res.text()) .then(data => alert(data)) .catch(() => alert("读取失败")); } }); if (btoa(k + String.fromCharCode(0x38) + v) === 'NDM4Mg==') { aLocked = true; btnA.classList.add('locked'); resetPosition(btnA, '60%', '100px'); console.log("A按钮已锁定!"); fetch('api/mark_frag_ok.php'); } };
|
找到三个路由
我们访问api/hint.php看看
先点了A选项,然后又叫我们点B选项出现回显(也就是访问api/hint.php这个路由一样)

我们问了ai得到ajax http头就是
1
| X-Requested-With:XMLHttpRequest
|
hackbar中
访问api/get_frag.php这个路由后得到

这个cookie很可以后面可能用得到
1
| PHPSESSID:d0efb5c132fc4ab06f3fe1acba43e567
|
然后我们就去访问api/mark_frag_ok.php中并构造cookie和X-Requested-With
之后我们访问api/get_frag.php加上我们要的cookie和X-Requested-With

前半部分flag就出来
我们把这些合在一起得到完整flag
1
| ISCC{0p3n01_cu_5_3r35_th3b5t!}
|
然后拼上后半段flag提交,发现错误,我还以为题目出问题了,哈哈哈,然后我猜我们忽略了网页其他提示,
其实是后面一段的flag有问题
在这里找到提示

然后复制文字
联网搜索+浅度思考(1R)
得到提示

于是我们又找到一个提示

提取红色的数字凑成
我们综合上面的信息让ai给我弄一个脚本,我们对后半段flag进行操作来解密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| from collections import deque from typing import List
def preprocess_key(key: int, max_len: int) -> List[int]: """ 将密钥转为0-based索引的整数列表,并限制范围 """ digits = [int(ch) - 1 for ch in str(key)] return [min(d, max_len - 1 - i) for i, d in enumerate(digits)]
def decrypt(ciphertext: str, key: int) -> str: """ 根据密钥顺序对密文进行解密,还原原始明文。 """ try: n = len(ciphertext) plaintext = [None] * n positions = deque(range(n)) key_sequence = preprocess_key(key, n)
for i, k in enumerate(key_sequence): if not positions: break target_index = list(positions)[k] positions.remove(target_index) plaintext[target_index] = ciphertext[i]
for c in ciphertext[len(key_sequence):]: if not positions: break plaintext[positions.popleft()] = c
return ''.join(filter(None, plaintext)) except Exception as e: return f"[解密错误] {e}"
ciphertext = "01_cu_5_3r35_th3b5t!}" key = 387531189
result = decrypt(ciphertext, key) print("解密后的明文是:", result)
|

运行之后得到
再把他们合起来
1
| ISCC{0p3n_50urc3_15_th3_b35t!}
|
成功解出
Author:
John Doe
Permalink:
http://example.com/2025/06/02/blog1/
License:
Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan:
Do you believe in DESTINY?