-
-
[原创] KCTF2022秋季赛 第六题 解析过程
-
发表于: 2022-11-29 01:51 8909
-
该题的加密思路用的是 "srand(X)" 和 "Y = rand()" 的特性进行加密,即当X一定时,依次调用rand()的结果Y是不变的;这里附上答案:“14725KCTF83690”。
分析过程大致为:
找到输入长度: 14个字符
构造输入"0123456789abcd",判定出输入的奇前5位和后5位处理方式相同,转为整型,调用srand(X),并调用rand()的结果和一个长度为20的整型数组比较。
“arr1”和“arr2”的内容分别是
第中间这段为KCTF字符直接比较
根据前面的分析可得,只要前后长度分别为5的字符串就能顺利搞定!这里写了一个简单的爆破代码:
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <stdio.h> #include <Windows.h> #include <iostream> #include <io.h> DWORD WINAPI CheckArry1( LPVOID lparam) { DWORD arr[ 20 ] = { 0 }; FILE * pf; fopen_s(&pf, "arr1.bin" , "r" ); fread_s(arr, 80 , sizeof(DWORD), 20 , pf); fclose(pf); for ( int i = 10000 ; i < 99999 ; i + + ) { srand(i); int j = 0 ; for (; j < 20 ; j + + ) { if (rand() ! = arr[j]) { break ; } } if (j = = 20 ) { printf( "p1 = %d\n" , i); return 1 ; } } return 0 ; } DWORD WINAPI CheckArry2(LPVOID lparam) { DWORD arr[ 20 ] = { 0 }; FILE * pf; fopen_s(&pf, "arr2.bin" , "r" ); fread_s(arr, 80 , sizeof(DWORD), 20 , pf); fclose(pf); for ( int i = 10000 ; i < 99999 ; i + + ) { srand(i); int j = 0 ; for (; j < 20 ; j + + ) { if (rand() ! = arr[j]) { break ; } } if (j = = 20 ) { printf( "p2 = %d\n" , i); return 1 ; } } return 0 ; } int main( int argc, char * argv[]) { HANDLE ht1 = CreateThread(NULL, 0 , CheckArry1, NULL, 0 , NULL); HANDLE ht2 = CreateThread(NULL, 0 , CheckArry2, NULL, 0 , NULL); WaitForSingleObject(ht1, INFINITE); WaitForSingleObject(ht2, INFINITE); return 0 ; } |
输出结果为:(arr1.bin和arr2.bin附件已给出)
结果验证:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
谁下载
谁下载
看原图
赞赏
雪币:
留言: