欢迎来到文本解码挑战赛!

T{4 G=C 9<=E B63 3<3;G /<2 9<=E G=C@A3:4^ G=C <332 <=B 43/@ B63 @3AC:B =4 / 6C<2@32 0/BB:3A` {4 G=C 9<=E G=C@A3:4 0CB <=B B63 3<3;G^ 4=@ 3D3@G D71B=@G 5/7<32 G=C E7:: /:A= AC443@ / 2343/B` {4 G=C 9<=E <37B63@ B63 3<3;G <=@ G=C@A3:4^ G=C E7:: AC11C;0 7< 3D3@G 0/BB:3`T _ !C< "HC^ "63 s@B =4 %/@

这是来自CTF的一串符号(当然不是原题,不过已经很相似了)。由于这个挑战已经结束,当时没有完成出来的家伙找到我,希望我帮助他们解决,至少今后遇到类似的问题他们不会再措手不及了。

现实中,需要解码的内容经常会附带一个脚本或者程序。因此几乎不会遇到一个编码的字符串,要求你独立破解出来。

有经验的CTF团队或许在十分钟之内就能破解,而我使用Calculator和Notepad也就用了十分钟。或许我应该使用电子表格。而在我做完这些之后,我发现我可以编写一个程序更快地解码这段字符串。

下面你将从何处着手破解?这里我提供了三个思路,但我相信一定会有其他更好的方法。

方法一:字符频率

单击“Statistics”(数据)选项中的“Get Stats”(统计)按钮,便会出现每个字母在脚本中出现的次数。这是你会发现“3”和“=”是出现最多的字符(除了空格之外)。

通过维基百科,我们知道最常用的英文字母为E T A O I N S H R……那让我们来看看“3”和“e”之间的差别。在“Difference”(差异)栏中输入这两个值,点击“Calculate Difference”(计算差别)按钮,我得到的值为“50”。

现在点击“Decoder”(解码器)菜单,输入“50”,选中“Character Shift”(字符替换)然后点击“Decode”(解码)。看起来我们的解码工作好像能够完成了。

方法二:枚举

第二个方法是把文本文件中,所有可能的值进行枚举,选择“Enumerate to File”(对文件进行枚举)和“Character Shift”(字符替换)。

检查结果文件,寻找线索。我搜索“the”的时候,发现第50行的看起来比较特别。第50行意味着值为50的字符替换已经被利用。

这是你可以去Decoder选项,进行一个值为“50”的字符替换,就像我们之前进行的那样。

方法三:距离计算器

两个字母之间的字符数与XOR长度相同,或者字符替换值应保持不变。

举个例子

单词h-e-l-l-o中字母间距离为-3、7、0和3(h和e间距离为-3,e与l间为7,诸如此类)如果我们将“hello”的值替换为10,产生的字符串为“rovvy”,而r-o-v-v-y间的距离仍然是3、7、0和3。

在“Statistics”选项中,你可以搜索“the”或者任何含有三个或更多字母的单词,工具箱会试图帮你找到字符串中的相同字符间距。

自定义替换表

三种不同的方法均发现值为50的字母替换是破译的起始点,但是文本中仍然还有一些未解之谜。

在输出框中,第三个字符看起来像“f”,因此前面的字符可能是“i”(if)。另外还有两个例子可以证实我们的推理可能正确,但还是让我们来验证一下。

回到“Statistics”选项中,我选中了一个应该是“I”的字符,然后单击“Get Hightlighted Char”(突出显示字符)。程序将在输入和输出框中提取相应的字符。

在这个例子中,我认为“{”应该是“I”,因此我做出了相应的转换,点击了“Calculate Difference”按钮。结果得到值“-50”。

现在我们就得到了两个不同的字符替换值。那么我该如何使用两个值解码?我需要再次映射字符,并利用ASCII表更直观地看到映射。因此我想出了“Custom Substitution Table”(自定义替换表)。

如果你在标题行输入一个值,该值会被复制到纵列。如果你需要为一个特定的字母输入一个值,那就在相应的框中输入该值。在这里,输入字符串中的空格字符被替换成了“R”。这里我并不想过多考虑这个,因此我在“032-SPC”框中输入了“0”。

你可以在这里下载到这个程序。如果有人在CTF之外的情况中用到了这个程序,记得要让我知道哟!

*原文链接:kahusecurity,编译/明明知道