[CTF] rootme靶场-Polybius

[CTF] rootme靶场-Polybius
题目相关资料里有一个 PDFPDF 的核心主题是Le carré de Polybe也就是Polybius square / 波利比奥斯方阵。PDF浅析它把 Polybius 方阵归类为一种很基础的单表替换密码-就是每个明文字母都有一个固定替换结果并且在全文中保持不变。文章不需要看的很懂只需要知道这道题考的啥命题中的(他指望你敏锐的头脑来解读这条信息)就是需要把这段密文解密出来就行了具体考的啥加密PDF也写的很明白了(Polybius)Polybius了解什么是波利比奥斯方阵波利比奥斯方阵Polybius Square是一种经典的加密方法最早由古希腊学者波利比奥斯提出。它的基本原理是通过一个方阵将字母与数字通常是2位数字对应起来从而实现加密和解密。加密时明文中的每个字母都被替换为方阵中对应字母的行和列的坐标。解密时接收到的数字坐标会根据预设的方阵找到对应的字母。波利比奥斯方阵如何加密确定字母表、行数和列数 在加密之前首先需要确定字母表支持多种语言、行数和列数同时还可以选择使用的分隔符例如逗号、空格等。生成方阵 根据字母表、行数和列数自动生成对应的波利比奥斯方阵方阵中每个字符都会被分配一个行列坐标。加密过程将明文中的每个字母按照行列坐标替换结果是用数字对行列坐标来表示明文。输出密文 最终的密文是由数字对组成的字符串。示例对于标准的26个英文字母“ABCDEFGHIJKLMNOPQRSTUVWXYZ”通常使用5行5列的方阵明文“HELLO”的加密过程H - (2, 3)E - (1, 5)L - (3, 1)L - (3, 1)O - (3, 4)所以“HELLO”加密后的密文是“23 15 31 31 34”。波利比奥斯方阵如何解密确定字母表、行数和列数 解密时首先需要知道字母表、行数和列数以便构建正确的方阵。解析数字对 密文是由数字对行列坐标组成的每个数字对对应一个字母。根据密文中的数字对在方阵中查找相应的字母。输出明文把查找到的字母组合起来输出最终的明文。示例如果收到密文“23 15 31 31 34”根据上述方阵查找23 - H15 - E31 - L31 - L34 - O解密后的明文是HELLO。加密和解密流程PDF 对这个方法的思路可以概括成两步。加密时先准备一个5x5字母表。找到每个明文字母所在的位置。用“行号 列号”替换这个字母。解密时反过来把密文按两个字符一组拆开。每组坐标定位到方阵里的一个格子。读出格子里的字母。所以只要看到一串东西像这样11 22 35 44 15或者像本题这样b3 a3 d1 c2 b1第一反应就应该是它可能不是普通文本而是坐标。a b c d e 1 2 3 4 5这非常像一个改写版的5x5坐标系统1 2 3 4 5 ----------------------- a | a1 | a2 | a3 | a4 | a5 b | b1 | b2 | b3 | b4 | b5 c | c1 | c2 | c3 | c4 | c5 d | d1 | d2 | d3 | d4 | d5 e | e1 | e2 | e3 | e4 | e5也就是说题目把传统的11 12 13 14 15 21 22 23 24 25 ...改成了a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 ...所以b3a3d1不应该看成 6 个独立字符而应该拆成b3 / a3 / d1这一步就是本题最重要的前置判断。本题的坐标和明文字母之间不是标准顺序而是被重新打乱过。而且笔者还拿去对应网站试过是无法直接套出来的根据最终的密文分析出b3 - c a3 - e d1 - s如果按普通标准表b3应该是等于12 3。这说明题目不是单纯的标准 Polybius而是Polybius 坐标外壳 打乱后的单表替换前置文件只能帮我们识别“它是坐标型密文”但不能直接给出最终明文。真正解题还需要做频率分析。题目的核心思路只有三步先识别密文的最小单位不是单个字符而是像 b3 这样的坐标对。再利用法语高频词把这些坐标对还原成明文字母。最后把整篇密文回代解密那段密文得到明文便可得到flag【----帮助网安学习以下所有学习资料免费领加vxYJ-2021-1备注 “博客园” 获取】① 网安学习成长路径思维导图② 60网安经典常用工具包③ 100SRC漏洞分析报告④ 150网安攻防实战技术电子书⑤ 最权威CISSP 认证考试指南题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂面试题合集含答案⑧ APP客户端安全检测指南安卓IOS结构分析先看密文长什么样题目文件里的内容大概是这样b3a3d1 c2b1e3d4d3d1 a4e5c5b1e3c2a3d1 ...先注意两个现象里面只出现a-e和1-5。每个“词”长度几乎都是偶数。这说明它不是普通字母表而是把“一个字母”编码成了“两个字符”的坐标。比如b3a3d1 - [b3][a3][d1]也就是说真正的解密单位是b3、a3、d1这种二元坐标。1 2 3 4 5 ----------------------- a | a1 | a2 | a3 | a4 | a5 b | b1 | b2 | b3 | b4 | b5 c | c1 | c2 | c3 | c4 | c5 d | d1 | d2 | d3 | d4 | d5 e | e1 | e2 | e3 | e4 | e5在这种写法里b3就表示“第 b 行第 3 列”。 题目给你的密文实际上就是把明文字母替换成了这种坐标。注意本题里并不是所有格子都被用到e4没有出现所以咱们不需要去分析未被使用过的密文在整篇密文里每个符号始终对应同一个明文字母。 例如如果e3代表a那么全文里所有e3都应该还是a。法语里e出现特别多。常见短词有de、et、la、le、que。单字母词在法语里也很有用比如a。所以只要统计密文里“谁最常见、谁是短词、谁的重复模式像法语”就能开始反推。先抓最明显的词这里一定要分清两个统计对象坐标频率统计a3、d1、e5等等这种单个高频坐标出现了多少次。词频统计d3a3、c4e3、a3a1等等这种高频完整密文词出现了多少次。通过代码计算汇总坐标频率最高的几个是import re from collections import Counter from pathlib import Path # 读取密文文件 text Path(ch12.txt).read_text(encodingutf-8) # 提取所有坐标对比如 a3、d1、e5 pairs re.findall(r[a-e][1-5], text) # 统计频率 counter Counter(pairs) # 输出前 5 个 print(| 坐标 | 出现次数 ) print(| --- | ---: |) for pair, count in counter.most_common(5): print(f| {pair} | {count} |)通过代码计算汇总词频最高的几个是import re from collections import Counter from pathlib import Path text Path(ch12.txt).read_text(encodingutf-8) # 提取完整密文词 words re.findall(r(?:[a-e][1-5]), text) # 统计词频 counter Counter(words) # 输出前 10 个最高频密文词 print( 密文词频 Top 10 ) for i, (word, freq) in enumerate(counter.most_common(10), 1): print(f{i:2}. {word:20} {freq})穷举评分证明笔者这次采用的方法不是直接凭感觉猜字母而是“先统计、再筛选、再打分、最后回代验证”。就是先用代码统计密文里哪些坐标、哪些短词最常出现再把这些高频坐标与法语里常见的高频字母、高频功能词做候选匹配看哪一种映射能同时解释更多高频词最后再把得分最高的候选回代到原文中检查是否能形成通顺的法语句子。上ai联网搜索法语频率排行榜排名 字符 出现频率 1 e 14.47% 2 s 7.98% 3 a 7.60% 4 n 7.32% 5 i 7.21% 6 t 7.11% 7 r 6.86% 8 l 5.86% 9 u 5.55% 10 o 5.39% 11 d 4.08% 12 c 3.39% 13 p 2.98% 14 m 2.78% 15 é 2.43% 16 v 1.29% 17 g 1.18% 18 f 1.12% 19 b 0.96% 20 h 0.93% 21 q 0.85% 22 à 0.43% 23 x 0.43% 24 è 0.42% 25 y 0.34% 26 j 0.30% 27 k 0.16% 28 ê 0.13% 29 z 0.10% 30 w 0.08% 31 â 0.05% 32 ç 0.05% 33 ô 0.05% 34 î 0.04% 35 œ 0.02% 36 ù 0.02% 37 û 0.02% 38 ï 0.01%我们真正已经知道的事实只有两个a3是全文出现次数最多的坐标频次是6443。单表替换会保留“谁最常出现”这个整体趋势。那么可以根据ai联网搜索的排行榜:假设a3 为e,不过呢这里仍然不是最终证明它只是“最优先验证的候选映射”。真正让这个判断成立的不是这一步本身而是它带来的后续连锁验证。上ai联网搜索与e结合的高频词排行榜假如a3 e则最高频双坐标词通过高频对比d3a3 --de假如a3 e则a3a1变成 e?通过高频对比-- et把这些结果继续回代到开头句子里还能推出一整串正常法语代码统计先证明 a3 是最高频坐标法语字母频率说明最高频坐标最值得优先验证成 e后续词频和整句回代再把这个假设验证为成立最终能得到以下表这张表才是真正开始破题的地方。d3a3是全篇最高频的双坐标词频次377。如果把前面的统计结论a3 e带进去它就变成?e。法语正文里最常见、最值得优先验证的两字母词之一就是de所以首先检查d3a3 de是否成立一旦成立就能得到d3 d。e3是一个单坐标词频次234。法语里常见单字母词主要是a、y而在这种散文正文里a的频率通常远高于y所以e3 a是更优先验证的候选。c4e3出现182次。如果前一步e3 a成立那么它的形状就是?a。法语高频短词里最常见且最值得先检验的就是la因此再验证c4 l。a3a1出现174次。如果a3 e已经被前两步支持那么它就变成e?。法语里最常见的两字母高频词之一就是et因此可继续验证a1 t。这时我们已经有了一批比较稳的基础映射a3 e d3 d e3 a c4 l a1 t把这些候选映射连续回代到原文里看它们能不能稳定地产生高频法语词并最终拼出通顺句子。用开头四个词把表补起来:把前几个长词直接回代明文会很快显形。把它按“已知字母 未知字母”的形式进行迭代。拿文章开头前四个词进行验证把已经得到的映射填进去b3a3d1 - ?e? c2b1e3d4d3d1 - ??a?d? a4e5c5b1e3c2a3d1 - ????a?e? b3a4b4e1e3b1a3d1 - ????are?先看第一个词b3a3d1 - ?e?。文章开头是一个三字母词第二个字母是e。法语里常见的开头词可以是les、des、ces、ses。但是只靠这一个词还不能定先放着。把前四个词连在一起看目前只有这些形状?e? ??a?d? ????a?e? ????are?继续看第二个词。c2b1e3d4d3d1 - ??a?d?。如果最后两个坐标d3d1里面d3 d那么这个词尾是d?。法语形容词里非常常见的六字母词grands正好是g r a n d s c2 b1 e3 d4 d3 d1这样能一次补出c2 g b1 r d4 n d1 s有了d1 s第一个词立刻变成b3a3d1 - ?es在?es grands ouvrages这个语境里最顺的是ces grands ouvrages。后续也有ai联网证明于是b3 c再看第三个词a4e5c5b1e3c2a3d1 - ???rages它的尾巴已经确定是rages而且前面句子是ces grands ???rages到这一步就不需要盲测了ai联网搜索一下a4e5c5b1e3c2a3d1 - ouvrages于是补出a4 o e5 u c5 v第四个词再回代b3a4b4e1e3b1a3d1 - co??ares继续ai联网搜索b4 m e1 p现在开头四个词就能完整读出来ces grands ouvrages compares如果再往后多看四个词验证会更强e3e5 - au b3a4b1e1d1 - corps b2e5b4e3d2d4 - humain d1a3b4c3c4a3d4a1 - semblent连起来就是ces grands ouvrages compares au corps humain semblent继续补出更多字母把已有映射回代到高频词里假如如果前面的a3 e、e3 a、c4 l有一个错了这里就不会连续冒出le、les、de、et、est、un、que、qui这么多正常法语词所以前面的高频穷举目前没有问题。例 1votrec5a4a1b1a3 - votre这个词其实大部分字母已经由ouvrages和grands带出来了c5 v a4 o a1 t b1 r a3 ev-o-t-r-e全部能对上证明前面的v/o/t/r/e没有冲突。例 2frerese2b1a3b1a3d1 - ?reres这个词的结构很特别第 2 位和第 4 位都是r第 3 位和第 5 位都是e最后是s。在文章主题里又经常谈到“兄弟”所以?reres-freres。于是补出e2 f例 3maintenantb4e3d2d4a1a3d4e3d4a1 - ma?ntenant这里的判断更直观。b4 m、e3 a、d4 n、a1 t、a3 e已经有了只剩中间的d2。ai联网证明ma?ntenant-maintenant所以d2 i这个结论还会被d2c4 - il、c1e5d2 - qui反复验证。例 4toujoursa1a4e5a2a4e5b1d1 - tou?ourst o u ? o u r s这个形状非常明显法语高频词就是toujours所以a2 j到这里常见字母基本齐了。剩下的b、h、x、y、z这类低频字母是不可能一眼看出来的法语生的话就当我没说过这句话通常是在全文回代到九成可读以后从个别词里补出来。笔者是没有任何法语基础的某些词都是靠ai翻译得出的。完整映射表最终得到的对应关系如下a1 - t a2 - j a3 - e a4 - o a5 - z b1 - r b2 - h b3 - c b4 - m b5 - x c1 - q c2 - g c3 - b c4 - l c5 - v d1 - s d2 - i d3 - d d4 - n d5 - y e1 - p e2 - f e3 - a e5 - u最终解密之后的明文