-
-
看雪 2022·KCTF 秋季赛第六题 病疫先兆
-
发表于: 2022-11-29 21:44 8240
-
题目的逻辑很简单,就是一个输入然后,验证输入,全部在main函数里面很明显。
题目的大题意思就是输入14个字节的字符串,然后分成三部分,第一部分转换为十进制数,第二部分不作转换,第三部分也转换为十进制数字。下面就是这题的主要验证逻辑。
!
可以判断出第二部分就是KCTF四个字母占用四个字节,然后上面有俩个循环,分别进行伪随机比较(与已知不变的盒子比较).
由字符长度为14个字节可以判断出伪随机数字的种子为五位数。所以可以进行爆破。
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include<stdio.h> #include<stdlib.h> int main() { unsigned int rand1[] = { 15356 , 8563 , 9659 , 14347 , 11283 , 30142 , 29542 , 18083 , 5057 , 5531 , 23391 , 21327 , 20023 , 14852 , 4865 , 23820 , 16725 , 18665 , 25042 , 24920 , 0 }; unsigned int rand2[] = { 11190 , 27482 , 980 , 5419 , 28164 , 9548 , 16558 , 22218 , 6113 , 21959 , 13889 , 11580 , 2625 , 19397 , 25139 , 8167 , 28165 , 3950 , 25496 , 27351 , 0 }; for ( int i = 10000 ;i< 100000 ;i + + ) { int j = 0 ; srand(i); while (rand1[j] = = rand())j + + ; if (rand1[j] = = 0 ) { printf( "%d\n" ,i); break ; } } for ( int i = 10000 ;i< 100000 ;i + + ) { int j = 0 ; srand(i); while (rand2[j] = = rand())j + + ; if (rand2[j] = = 0 ) { printf( "%d" ,i); break ; } } } / / 序列号为 14725KCTF83690 |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
看原图
赞赏
雪币:
留言: