Writeup 4 PCTF — Leonidas left message题目信息题目名称Leonidas left messageAuthorHxN0n3难度Easy题目描述The 300 Spartans as fighting entirely alone. In reality, King Leonidas led a coalition of roughly 6,000 to 7,000 Greek allies, including hundreds of Thespians and Thebans who also stayed and died in the final stand.Leonidas left messageu(x/B(FICBqCGqWFG-qIzCyqt)IqEEvqIBq}Biq(zEq)~EG1Flag format:pctf{...}一、初步观察拿到密文u(x/B(FICBqCGqWFG-qIzCyqt)IqEEvqIBq}Biq(zEq)~EG1字符集包含小写字母u x q z y t v i大写字母B F I C G W E符号( / - ) }( ) ~数字1字符分布很不自然大量出现q、I、B、E等且没有任何空格或常见英文单词痕迹。Flag 格式是pctf{...}但密文中没有{反而出现了}说明密文经过了某种整体变换。二、寻找关键线索题目描述反复强调两个数字300 Spartans300 名斯巴达勇士6,000 到 7,000 Greek allies实际联军人数其中300是最突出的数字也是最经典的 CTF 提示。常见的 CTF 编码/加密方式中与数字直接相关的是ROTCaesar 移位。ROT 通常有两种作用域字母表模 26ROT13、ROT5 等ASCII 可见字符模 94ROT47、ROT18 等题目里的密文包含大量符号说明它很可能是在ASCII 可见字符范围33~126共 94 个字符上做的移位。计算300 mod 94 300 - 94 × 3 300 - 282 18得到18。于是猜测加密方式是ROT18对每个 ASCII 可见字符33~126偏移 18 位。三、ROT18 原理ROT18 的加解密公式相同因为 18 与 94 不互素实际上 18 和 94 的最大公约数是 2但 ROT18 加两次不等于原文所以加密和解密方向相反加密c 33 ((c - 33 18) mod 94)解密c 33 ((c - 33 - 18) mod 94)其中c必须满足33 ≤ c ≤ 126否则字符不变。四、解密过程对密文逐字符做 ROT18 解密减 18密文u(x/B(FICBqCGqWFG-qIzCyqt)IqEEvqIBq}Biq(zEq)~EG1解密结果ctf{r0t4710n_15_E45y_7h1ng_bu7_n33d_70_kN0W_th3_rul35}逐段解读leetspeak密文片段解密结果含义ctf{ctf{开头r0t4710nr0t4710nrotation_15__15_isE45yE45yEasy_7h1ng_7h1ng_thing_bu7__bu7_butn33dn33dneed_70__70_tokN0WkN0WkN0W_th3__th3_therul35rul35rules}}结尾得到明文ctf{r0t4710n_15_E45y_7h1ng_bu7_n33d_70_kN0W_th3_rul35}注意题目要求 Flag 格式为pctf{...}而解出的明文开头是ctf{缺少首字母p。检查密文开头密文第一个字符是uu减 18 得到c如果明文第一个字符是p加密加 18后应该是$即pctf{加密后为$u(x/而题目给出的密文开头是u(x/正好少了开头的$多了一个不仔细对比明文p c t f { r ... 加密$ u ( x / ... 密文 u ( x / ...密文确实是$u(x/...去掉第一个$后的结果。也就是说题目密文可能漏掉了第一个字符$或者出题人故意省略了p让选手根据格式补全。根据 Flag 格式pctf{...}补上前缀p得到最终 Flagpctf{r0t4710n_15_E45y_7h1ng_bu7_n33d_70_kN0W_th3_rul35}五、Python 解密脚本defrot18_decrypt(s):result[]forcins:oord(c)if33o126:result.append(chr(33((o-33-18)%94)))else:result.append(c)return.join(result)cipheru(x/B(FICBqCGqWFG-qIzCyqt)IqEEvqIBq}Biq(zEq)~EG1plainrot18_decrypt(cipher)print(plain)# 输出ctf{r0t4710n_15_E45y_7h1ng_bu7_n33d_70_kN0W_th3_rul35}六、Flagpctf{r0t4710n_15_E45y_7h1ng_bu7_n33d_70_kN0W_th3_rul35}七、总结步骤内容1观察密文包含大量符号推测是 ASCII 可见字符范围的移位2题目描述强调300计算300 mod 94 183确定加密方式为ROT184对密文逐字符减 18 解密5得到 leetspeak 明文补全pctf{前缀6提交 Flag关键点CTF 中看到“300”“斯巴达”等数字提示要立刻联想到 ROT 系列ROT18 是 ASCII 可见字符94 个上的移位与 ROT47 类似但偏移量不同。Rambo2026年9月26日
