大家好,我是
HackerU以色列高中IT和安全部门的策展人Nikita Kurtin。
我将继续谈论来自领先的以色列公司在信息安全检查站领域的网络测试。 在上一篇
文章中,我描述了我如何通过四个测试,在此我想谈一谈我成功通过的下三个测试。
对于那些错过了第一篇文章的人,今年夏天我将告诉您
Checkpoint发布了一系列网络测试。
挑战赛于2018年9月底正式结束。
任务分为六类:
•逻辑
•网站
•编程
•联网
•倒车
•惊喜
每个方向有两个任务。 正如我已经
写过的那样 ,Checkpoint已经设法赢得了我的尊重和兴趣,因此我决定接受这些挑战。 但是,由于工作原因,我只能负担12个任务中的8个(来自四个不同类别)。 我设法解决了其中的7个问题。
依此类推:
挑战:难题
说明:
终于我们找到了你!
我们需要解决这个难题,正如预言所述,只有您有能力做到。
这个难题非常奇怪。 它由一个10列10行的电路板组成。 总共-100个零件。 他们每个人都有一个谜! 这些部分包括四个部分:上,下,右和左。 每个节拍是一个数字。 例如:
上-12,右-3,下-4和左-5。
为了使拼图更加完整,必须将所有细节放置在板上,以使每块棋子都具有相等的值。
此外,必须将不与任何内容相邻但作为板边界的一部分的小数设置为0。其余小数不能为零。 这是4个部分的有效示例:

在板的顶部,形成边界的所有波瓣均为零。
考虑左上方。 它的右叶为9,相邻的叶(右上部分的左叶)也为9。
不幸的是,我们所有的细节都被改组了。 它们以以下格式给出:
立方体的ID [分数]; 多维数据集ID,[份额]; ...多维数据集ID,[份额]
其中,多维数据集id是从0到99的数字,分数由按顺序排列的数字组成:上,右,下,左。
例如,查看下面的混洗板:

这是描述此板的行:

我们需要您拼砌拼图!
给我们写一条看起来像这样的行:
多维数据集的id,需要顺时针旋转多少次; 立方体的id,需要顺时针旋转多少次; ...立方体的id,需要顺时针旋转多少次
此板的解决方案行如下所示:

上一行对应于以下(已解决的)难题:

考虑左上方。 在该行中,它对应于名称“ 2.2”。 我们如何从输入中获取2号多维数据集:

但是我们将其顺时针旋转两次,得到[0,19,5,0]。
现在考虑上中间部分。 在该行中,它对应于名称“ 1.0”。 因此,我们从输入中获取1号多维数据集:

并且完全不要扭曲(是的,将其扭曲0次)-这意味着它已经处于正确的位置。
知道了吗
现在帮助我们解决难题!
看起来像这样:

祝你好运
从理论上讲,可以以许多不同的方式解决此问题。 找到您的并分享。 我考虑了几种选择,最终得出以下结论:
第一个。 在任何给定时间,我只需要定义一个多维数据集。 对于每个多维数据集,我将始终确定有两个方面:顶部和左侧。 开头是0和0。顶部的下一个多维数据集也将具有0,而左侧的数字将对应于前一个多维数据集的右叶数。
第二个。 由于多维数据集之间存在大量不同的变化,因此,我应尽量减少步骤,并消除对第一个否定结果的无意义检查。
第三。 要使用不同的多维数据集,我总是需要记住它们的初始位置(id),从起始点开始的匝数以及显然的边数(顶部,右侧,底部,左侧)。
第四。 初始输入是一个字符串。 并且输出也是一个字符串(而不是当前位置)。
基于所有这些,我为自己制定了以下策略:
线性移动-从左到右,直到到达右角。 接下来,向下一行,从左侧的多维数据集的较低数字开始,该数字位于上方。
每次旋转后应检查其是否合格。 因此,如果您已经完成4个回合,但仍然没有该立方体的任何一个匹配项,那么我将处理下一个。 每个检查的多维数据集都可以与其他所有详细信息一起进行检查,为此,我可以使用完整的所有其他多维数据集来递归地重复每个初始化的多维数据集。
为了跟踪源数据的所有操作,我选择了一种面向对象的编程方法,其中,多维数据集是一个具有id,转数和四个边(顶部,右侧,底部和左侧)的对象。
我不会复制初始状态并避免多次旋转后出现错误计数,而是始终将计数增加一。 但是,当我检查最终的旋转数时,我使用了模(除法余数)乘以4。
例如,如果需要旋转一圈(从[1,2,3,4]到[4,1,2,3]),但是错误地进行了前三个旋转(当前为[2,3,4,1] ),下一次将花费2(从当前[2,3,4,1]到必要的[4,1,2,3])。 3加2是5。5%4 = 1,这就是您需要的。
我总是需要跟踪所使用的多维数据集并防止再次检查。 为此,我使用了一个ID多维数据集表。 如果要比较的多维数据集匹配,则将其从列表中删除。
我选择了以下数据结构:
HashMap-绑定id(初始位置)和从输入字符串构造的多维数据集。
堆栈-检查相关的ID多维数据集。
数组-用于临时测试结果。
目标代码多维数据集:

字符串操作函数:

查找匹配的多维数据集的解决方案的逻辑:

结果:
挑战:乒乓球
说明:
我敢打赌,你不够快,无法击败我。
这是我的位置:
数控35.157.111.68 10158通过运行此命令,您将获得:

乍一看,这似乎是处理流的任务。
但是,在接收到第一个数据后,似乎它属于“超时”,然后完全落入-将被覆盖。
数据结束时,将出现一个新的行分隔符。
我使用Python代码重新创建了流。
它似乎起作用了,所以我添加了一个重复代码,重复了乒乓算法,然后我将等到该标志出现。

在客户端和服务器之间进行了大量的此类乒乓球改组(可能超过一千次)之后,我终于完成了工作。
挑战:“协议”
说明:
嗨,那里!
我们需要从特殊服务器中提取机密数据。 我们对他了解不多,但是我们设法拦截了支持与此服务器通信的流量。
我们也知道此秘密文件的路径是:/usr/PRivAtE.txt
您可以在此处找到嗅探文件(链接到该文件)。
请告诉我们秘密是什么!
祝你好运我下载了文件并使用Wireshark打开了文件

并检查了注册谈判

它可以让我弄清楚发生了什么。

我注意到在IP 35.157.111.68之间通过端口20120和SSH端口22进行了协商。我决定检查该端口20120,然后切换到SSH(后来我意识到这是不必要的)。
我使用nc命令检查此IP和端口,并收到响应:“ 0 8 Welcome”

我不确定他期望什么输入,所以我回到Wireshark看看是否还有任何线索。
我过滤了端口20120上35.157.111.68的所有数据包,发现了一个易于阅读的对话:





我使用nc命令行重新创建了所有这些内容:

我注意到“ 2 3 XOR”请求的答案与文件中的答案不同。
我一遍又一遍地重复整个过程,以查看答案是否每次都改变了。


我认为,每次获得的4个值都不同,最终数据也不同。
获得的四个值似乎是解密最终数据的关键。
我还注意到每个数据包之前的数字不是随机的。
看起来如下。
第一个数字表示顺序:0->第一,1->第二,2->第三,依此类推...
第二个数字表示短语8->“ Welcome”,5->“ Hello”->等的持续时间。
我知道这是否不是解密的关键。 由于最终数据是4个十六进制值的块的连续行,并且XOR键也是4个十六进制值。 也许我可以遍历每个对象,并将其分成单独的字节,然后用密钥中的字节咬住它们。
我试图解密:

一切都变了,但是接收到的数据中没有标记。

我重新阅读了规则,并记住了该秘密文件的路径如下:/usr/PRivAtE.txt
我再次重复了该过程,但是这次请求的路径是“ /usr/PRivAtE.txt”

我再次尝试解密最终数据:

旗帜在我手中:

你成功了吗? 写下您的想法和选择,我将很乐意发表评论。