2018 Mossad Challenge
2018-06-14 本文已影响22人
四火流年
2018 Mossad挑战,目的是招聘。
以下来自百度百科 - Mossad
摩萨德(Mossad),全称为以色列情报和特殊使命局(The Institute for Intelligence and Special Operations),由以色列军方于1948年建立,以大胆、激进、诡秘称著于世。与美国中央情报局、苏联国家安全委员会和英国军情六处,并称为“世界四大情报组织”。自从成立以来,摩萨德进行了多次让世界震动的成功行动。它的成功,成为世界情报史上的传奇。
第一个页面
https://www.r-u-ready.xyz
初始页面就是下面这张图,可以判断处高亮的字符实则是 brainfuck 编码。
左边的代码为:
>+-++<>-+--><[+-[
]+-]<+--+>[+--+]<
[+>+<-]><----[-->
+++<]>--.--------
-.+++.[++>---<]>+
+.-[----->++<]>-.
+[->+++<]>+.+++++
++++++.----------
--.----[->+++<]>+
.-[-->+++++<]>---
.------.[--->+<]>
++.[-]>+-++<>-+--
><[+-[]+-]<+--+>[
+--+]<[+>+<-]><>+
-++<>-+--><[+-[]+
-]<+--+>[+--+]<[]
右边的代码为:
+++++++++++[>++++
+++++++<-]>+[<+>-
]-[>+<-------]>--
-[<+>-][<+>-]>++>
+[>++[-<++++++>]<
<]>[<+>-]>+>++[++
>++[-<+++++>]<<]>
[<+>-]>+>+[>++++[
-<++++>]<<]>[<+>-
]++++++++[>++++++
+++++<-]>+[<+>-]+
++>>+>+[->+++[-<+
++++>]<<]>[<+>-]+
+++++++[>++++++++
<-]>+[<+>-]+++>++
++++>+>+-++<>-+--
解题路径
- 借助一个brainfuck的在线解释器(http://esoteric.sange.fi/brainfuck/impl/interp/i.html),可以很容易的得到左边的输出是
xor-with-key
- 同样使用这个在线解释器,去解析右边的代码,却得到的是空。
- 深入了解brainfuck这门语言,发现它用来输出的关键字是
.
,但是右边的代码却没有.
,即没有输出。所以在代码的最底下手动加上输出
.<.<.<.<.<.<.<.<.<.<.<.<.<.<.<.
(向右移动再输出也试过,空的)
得到结果:���AZ�YUS\Fz
-
到目前为止,解题陷入困境。
我们知道了,需要拿右边的输出和一个key
进行异或xor
,但是这个key是什么呢?
从页面上看、从页面的源代码看,都没有找到一个8字符长度的字符串。唯一比较像key的是,上面那幅图里的这句话Israel-is-70
,12个字符。 -
继续
实际上,右边的输出并不是8字符长度的字符串,而也是12个字符长度的字符串,只是没有显示出来!!!
从下图看,确实就是8个字符,复制粘贴到微信、Sublime等编辑器里,也都是显示8个字符。
image.png
但是,简书就很厉害了!下图是粘贴到简书的编辑器里的效果:
image.png
从上图可以看出,右边代码的输出确实就是12个字符长度的字符串!
- 知道了上述的事实,依然不知道空的位置是什么,那就继续研究brainfuck的语法,然后人肉解释执行出来。
(简书的强大是刚刚才知道的,当时的想法是,深入了解brainfuck,人肉解释执行。异曲同工)
这里有一个brainfuck的可视化工具,有助于理解brainfuck的执行过程。
http://top.jobbole.com/36665/
(其实,也可以通过在代码里加上输出的方式,只是这样依然无法知道缺失的那4个字符的具体数值) - 通过手动解释执行的结果为:
[0x7a, 0x46, 0x5c, 0x53, 0x55, 0x59, 0x03, 0x5a, 0x41, 0x03, 0x06, 0x01]
注意,要把上述的���AZ�YUS\Fz
顺序颠倒一下,即zF\SUYZA
。
手动解释执行的过程记录在这里:
2018-06-14 Brainfuck程序手动解释执行 - 再和
Israel-is-70
,进行异或,得到结果:
>>> a = [122, 70, 92, 83, 85, 89, 3, 90, 65, 3, 6, 1]
>>> b = list("Israel-is-70")
>>> [chr(a[i] ^ ord(b[i])) for i in range(12)]
['3', '5', '.', '2', '0', '5', '.', '3', '2', '.', '1', '1']
一个IP地址:35.205.32.11
第二个页面
打不开。。。
这个IP地址估计要翻墙、甚至要模拟地理位置才能打开吧?
总结
浅尝辄止总是会付出代价,只有深入去了解,踏踏实实一步一个脚印,才是真正的捷径。