首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第七题 密室逃脱 Writeup
发表于: 2018-6-30 12:00 4250

[原创]看雪.京东 2018CTF 第七题 密室逃脱 Writeup

2018-6-30 12:00
4250

题目描述如下:

这是一个数字迷宫 分为20层楼
16个人各选择一把初始钥匙 开始游戏
16个人进入第一层 按照一定的规则 每个人都会在另外2个人的帮助下开启一个房间 拿到1把第二层楼的钥匙
当16个人都拿到了各自的二层楼钥匙后 一起上楼
第二层重复相同的操作,16个人再一起上到第三层
...
直至16个人拿到了的20层天台的钥匙
天台上有一架直升机,需要16把正确的钥匙才能开走
试试看 你能否找出16把正确的初始钥匙

程序开门见山。程序中的算法也如上所述。

函数check伪代码如下:

程序流程是:

对数据及校验过程分析后,有这么几个发现:

想到循环,测试为先,计算前贴下常量值。
64字节的表为:

16次的取值的序号为:

开始计算,先试初始值为全0。因为完全分布均匀,那应该64轮后循环。

结果是:

竟然32轮就循环了,重点是确实循环了。

将数据换成校验值,这次循环轮数更大了,但是64的倍数:

打印循环前数据:

循环轮再往前数19,即429轮,应该就是输入转换的16字节数据了。

[17, 43, 33, 5, 63, 1, 37, 11, 57, 19, 51, 9, 63, 57, 53, 37]

验证如下:

输出结果为:

投机取巧的非预期解法。

 
 
int __cdecl main(int argc, const char **argv, const char **envp)
{
  printf("Only 'a'-'z','A'-'Z','0'-'9' accepted.\n");
  printf("Only 16 chars accepted.\n");
  printf("Serial:");
  scanf_s("%s", serial, 17);
  check();
  system("PAUSE");
  return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-6-30 13:59 被poyoten编辑 ,原因: 加转义
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
2
你这个解法厉害
2018-6-30 16:06
0
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
3
ccfer 你这个解法厉害
见笑
2018-6-30 16:08
0
游客
登录 | 注册 方可回帖
返回
//