-
-
[原创] KCTF2022秋季赛 第六题 解析过程
-
发表于: 2022-11-29 01:51 9237
-
该题的加密思路用的是 "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附件已给出)

结果验证:

[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!
赞赏
谁下载
谁下载
赞赏
雪币:
留言: