TomatoTools 一款CTF杂项利器
0x00 背景
以往在解MISC题时会遇到了编码或者是加密后的字符串,只能凭借个人对各种编码和密码学的熟悉程度去判断密文的类型
以base16/32/64编码为例,区分这三种base系列的编码常常是与其密码(字母)表的范围去判断识别,base16是0-9a-f,base32是2-7A-Z,base64是A-Za-z0-9+/
若假设密文是 *MZWGCZ33GEZDGNBVGZ6Q====* ,根据前面说的内容可以很轻松的得知这段密文是base32编码后的结果,解码可以得到明文为 flag{123456}
如果是在自身知识储备不足的情况下,没有系统地学习过各种编码解码和密码学的理论和知识,在遇到那些多重嵌套加密的密文就容易傻眼,到了关键部分不会分析密文,判断不了密文类型,也没办法解密得到flag。
那能不能根据前面说的,用判断字母表的方式去做个自动分析密文类型的工具呢?
于是,TomatoTools来了!
0x01 能做什么
TomatoTools 拥有CTF杂项中常见的编码密码算法的加密和解密方式,还具有自动提取flag的能力,以及异常灵活的插件模块。
目前支持36种编码和密码算法的加密和解密,包括
- Base16/32/36/58/62/64/85/91/92
- ROT5/13/18/47
- AAencode / XXencode / UUencode / JJencode
- Brainfuck / JSFuck / Jother
- Emoji
- 核心价值观编码 / 与佛论禅
- 莫斯密码 / 培根密码 / 云影密码 / 埃特巴什码 / 波利比奥斯方阵密码 / 凯撒密码 / 栅栏密码
- Shellcode / Handycode / URL
- 敲击码 / A1z26密码 / Quoted-printable编码
- 二进制010编码
其中支持31种密文的分析
- Base16/32/36/58/62/64/85/91/92
- XXencode/UUencode/JJencode
- Brainfuck/JSFuck/Jother
- Emoji
- 核心价值观编码/与佛论禅(佛曰)/与佛论禅(如是我闻)
- 莫斯密码(空格)/莫斯密码(斜杠)/培根密码/云影密码/波利比奥斯方阵密码
- Shellcode/Handycode/URL
- 敲击码/A1z26密码/Quoted-printable编码
- 二进制010编码
0x02 密文分析
密文分析过程可看下面的流程图
在密文分析时先从配置文件中加载各种密文类型的配置信息,包括函数名、密码表的正则范围,密码表的字符总个数等,然后进入密文类型筛选流程,判断该种密文类型的密码表的字符总个数和密文去重后的总个数之间谁更大些,若前者小于后者 的话,则将前者除去,其余的密文类型则进入下一轮的正则匹配阶段,
密文分析的核心是对经过某种加密/编码方式后密文的密码表进行正则匹配分析,对那些只针对密文中特定字符进行编码/加密的密文类型并没有很好的识别能力,以ROT5为例,ROT5的原理是明文中的数字向后移动5位,明文为 flag{a123bcd45ef} ,则ROT5编码过后的密文为 flag{a678bcd90ef} ,此时变化的只有数字,那么在密文分析中,ROT5的密码表正则范围该如何确定?
[0-9] 肯定是不合适的,在正则匹配的第一个阶段,遇到 f 后就将ROT5拉入黑名单了,那么只剩下一个办法了,使用 [\w] 去匹配所有的字符,乍一看可行,也确实是能匹配到了,因为只要密文中存在数字,ROT5也就能被成功解密输出到密文分析的结果里,但ROT5也因此成了常客,而在后面的自动化提取flag中,由于密码表正则范围 [\w] 过大,反复调用ROT5将会使其陷入一个永远也跳不出去的死循环。
0x03 自动提取flag
在解题时用TomatoTools去做密文分析,然后再加以手工解密的话,虽然和以往的人脑分析相比是快了一些,但是感觉还是不够快, 没有那种一秒出flag的惊喜与快感&