Shenzhen-Office
记录一道在GoogleCTFBeginner2021中的一道很有意思的题,涉及编码和小众编程语言。
0X1 简要概述
题目给出了两个文件:
-encodings (这里面涉及的内容均为该Chall的提示)
-chall.txt (根据encodings编码后的内容)
本题的基本思路就是根据encodings所给的hints去一层层的解chall.txt中的编码。
0x2 EXPLOITED
chall.txt中的内容大致如下,
观察到chall.txt文件中的内容均为可见字符,根据encodings中的提示{a weird base, much higher than base64} 考虑是base家族的编码并且该编码不常见。文件中的内容均为Unicode字符(UCS-2编码),范围达到65535,Googling base65535,找到一个在线Decoder。解码后得到以下内容,
均为Hex表示,使用xxd将其转换为二进制文件,
|
|
使用file查看base65535_decoded.bin的类型,见下图
我们得到一张jpeg格式的图片,转换扩展名打开图片,我们得到下图,
谢谢老番茄让我知道这是什么东西,这是画家蒙德里安的著作,根据encodings中的提示{a language named after a painter},我们googling一下可以找到该语言Piet,并且还有其在线解释器,不过我把图片丢进去没啥效果,好像不是这副图片,我们得继续挖掘一下这幅图片,祭出我所有关于图片隐写的工具。在尝试了多种工具后,我在exiftool中提取到了有趣的数据,
|
|
稍微处理掉一些我们不感兴趣的信息,得到
看似又是一种奇怪的语言:( 根据encodings中的提示{a language that is the opposite of good},我一开始想的是Bad,找了半天没找到,后来我干脆直接去找Good的反义词,
在互联网世界遨游了一番后终于确定了那门语言——Evil,故技重施找在线Interpreter,但没找着。无奈只好在主页下载了用Java实现的Interpreter。
用javac编译一下后再执行我们得到的代码(Piet.txt)并将输出结果重定向至Evil.txt。我们又得到了一连串Hex,
故技重施,用xxd转换为二进制文件,并用file检查文件类型,发现是一个zlib压缩文件,使用zlib-flate解压该文件,
|
|
使用File检查该文件,发现是一个gzip包,解压后得到一个Netpbm格式的文件,googling一下,
Netpbm (formerly Pbmplus) is an open-source package of graphics programs and a programming library. It is used mainly in the Unix world, where one can find it included in all major open-source operating system distributions, but also works on Microsoft Windows, macOS, and other operating systems.[2]
这时候我们可以将这个图片丢进Piet的Interpreter里了,我们又得到了一连串Hex,重复上述转换过程,最终我们得到一个ASCII文档,其中的内容为
根据encodings中的提示{language that looks like a rainbow cat},googling后定位到nya~语言。由于nya~的语法比较简单,我们可以用python自实现。
Command | Description |
---|---|
n | Decrement integer |
y | Increment integer |
a | Put char from ASCII |
~ | Reset integer to 0 |
|
|
得到一个长整数,
|
|
这里就不能够再转换为Binary了,至此我们还剩下两个Hints{a language that is too vulgar to write here;a language that ended in ‘ary’ but I don’t remember the full name}
经过一番艰难的Googling之后,我最终确定了剩下的两门语言,Brainfuck和Unary。
上面的大整数可以转换为二进制按照Unary转换表转换为Brainfuck可以识别的语言,使用的Python脚本如下,
|
|
最后再Googling找到Brainfuck的Online Interpreter后运行程序得到Flag : : CTF{pl34s3_n0_m04r}
一些”实用“(神奇)的网站:
Esolang 各种奇奇怪怪的编程语言