-
-
[原创]看雪.京东 2018CTF 第七题 密室逃脱 Writeup
-
发表于:
2018-6-30 12:00
4393
-
[原创]看雪.京东 2018CTF 第七题 密室逃脱 Writeup
题目描述如下:
这是一个数字迷宫 分为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]
验证如下:
输出结果为:
投机取巧的非预期解法。
1 2 3 4 5 6 7 8 9 10 | 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编辑
,原因: 加转义