-
-
[原创]看雪6月 京东 2018CTF 第七题——有趣的密室逃脱游戏
-
发表于: 2018-6-30 11:55 3654
-
这道题最后一看发现其实并不难,但是做起来怪怪的,有些本应该很简单的地方卡了很久,所以还是感觉有问题,自我总结一下。
这个CrackMe咋一看很简单,关键算法就是一个三层嵌套的循环,前面有个把数字字母转成指定表下标的循环太简单了不说。
但是,这个内存布局给我的感觉就是很乱,最后我整理到后面得出如下
就是他循环遍历到后面,会通过这个结构体的base来访问后面的包括输入在内的数据,但是因为下标遍历从16开始,所以不会污染到下面的info里的数据。这个我不知道是怎么弄的,是否作者真的做了一个共用体来混淆。
这个弄清楚搞得我有点久,想了一下,问题就在有时候不想整理想直接通过各种强转看出逻辑,这个是不对的,至少我不行。所以有时候整理一下内存结构做个结构体真的是磨刀不误砍柴工的。
然后整理出来还有一个局部变量,有个地方他通过栈的地址强转成了int计算某个值,然后用于操作,实际上那个值就是会一直在2-11这样一直循环,这个情况很简单,调试一下,OD下个条件记录,就明了了。
所以总结
接下来程序逻辑搞懂这些就好办了,他有一个bool_tab
,一个初始化好的表,然后会根据那个东西赋值key_idx
,这个是来自上一次的结果,然后这个会被计算成一个下标,访问一个char keys[64][64][64]
的全局变量做一个映射。不如动态看看key_idx
的值,输入abcdefghijklmnop
,此时下标等于下标的数,方便分析
很明显,这个bool_tab
会控制这个循环,然后将上一次结果给到key_idx
虽然看起来有可能会溢出,但因为bool_tab
的构造其实根本不会,其实连第4个元素都不会访问到(keys做映射只需要三个数)
然后逻辑基本上就是,根据上面来取下标,然后通过这个计算key_idx
,访问keys
,作为下一个结果
比方说第一个,就是取下标012,然后访问keys[[0]][[1]][[2]]
作为下一个下标为0的数。
然后这么迭代19次。
这个爆破我还是想了很久的,满足一条限制的有4096个可能性,其实这个的规律是,如果有m个数,n条限制条件,那么可能性就是
通过真实写爆破验证程序观察和通过脑补,貌似都能感觉到是这个。关键是keys的映射是每64个都不一样的,才能导致这样的结果。
然后如果爆破的话,发现用前面两个爆破01234是pow(64,5-2)
,然后基本上就维持在这个数了,后面多加一条限制最多也就多加一个数,所以最多需要的循环次数是0x40000000
,不难爆破
所以爆破一条,找出3个元素的可能性,是这样的,能找到4096个
然后爆破01234
多加一个数,同时多加一条限制
然后加限制但是不加数是这样
基本就这样,慢慢撸,完整代码写的又臭又长就不贴了,放在附件了
最后爆出来花的时间数了一下,VS release差不多4分钟多,没违反规则哈哈。
话说pdb路径看到个midpoint verify,不会我这个爆破的方法不是预期解吧。。。?