-
-
[原创]签到题:乱世鬼雄
-
发表于: 2019-9-16 21:39 2905
-
程序首先转换输入,按照字符所表示的字面值保存
i = 0; do { c = my_serial[2 * i]; v3 = c - '7'; if ( c <= '9' ) v3 = my_serial[2 * i]; real_serial_4212F8[i] = my_serial[2 * i + 1] + 16 * v3 - (my_serial[2 * i + 1] > '9' ? '7' : '0'); //将输入的字符的十六进制字面值保存到real_serial_4212F8[i] ++i; } while ( i < 16 ); v4 = 0; s_ptr = &temp; do { sub_401990(s_ptr, "%02X", real_serial_4212F8[v4++]);//存取大写表示的十六进制数 s_ptr = (s_ptr + 2); } while ( v4 < 16 ); v6 = strcmp(my_serial, &temp);//比较转换结果,即判断输入是否为大写字符表示的十六进制 if ( v6 ) v6 = -(v6 < 0) | 1; if ( v6 ) { print_401910(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); print_401910("【请输入合法序列号!】\n\n"); }
序列号需要是大写十六进制字符串,32位,表示16字节
i = 0; do { c = my_serial[2 * i]; v3 = c - '7'; if ( c <= '9' ) v3 = my_serial[2 * i]; real_serial_4212F8[i] = my_serial[2 * i + 1] + 16 * v3 - (my_serial[2 * i + 1] > '9' ? '7' : '0'); //将输入的字符的十六进制字面值保存到real_serial_4212F8[i] ++i; } while ( i < 16 ); v4 = 0; s_ptr = &temp; do { sub_401990(s_ptr, "%02X", real_serial_4212F8[v4++]);//存取大写表示的十六进制数 s_ptr = (s_ptr + 2); } while ( v4 < 16 ); v6 = strcmp(my_serial, &temp);//比较转换结果,即判断输入是否为大写字符表示的十六进制 if ( v6 ) v6 = -(v6 < 0) | 1; if ( v6 ) { print_401910(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"); print_401910("【请输入合法序列号!】\n\n"); }
序列号需要是大写十六进制字符串,32位,表示16字节
下面便是进行md5运算,将用户名异或注册码的结果进行md5加密,最后进行固定md5值的比较
else { a1 = 0; v23 = 0; v24 = 0x67452301; v25 = 0xEFCDAB89; *a2 = _mm_xor_si128(*my_name_42130C, *real_serial_4212F8);// 将用户名与注册码异或操作 v26 = 0x98BADCFE; v27 = 0x10325476; v29 = 0i64; sub_401000(&a1, a2, 0x10u); v7 = (a1 >> 3) & 0x3F; v8 = 0x78 - v7; v9 = 0x38 - v7; v10 = v7 < 0x38; v11 = &a1 + 1; if ( !v10 ) v9 = v8; v12 = 0; do { v13 = *(v11 - 1); v11 += 4; LOBYTE(a2[v12]) = v13; BYTE1(a2[v12]) = *(v11 - 4); BYTE2(a2[v12]) = *(v11 - 3); HIBYTE(a2[v12]) = *(v11 - 2); ++v12; } while ( v12 < 2 ); sub_401000(&a1, &::a2, v9); sub_401000(&a1, a2, 8u); v14 = &v24 + 1; v15 = 0; do { v16 = *(v14 - 1); v14 += 4; *(&v29 + v15) = v16; *(&v29 + v15 + 1) = *(v14 - 4); *(&v29 + v15 + 2) = *(v14 - 3); *(&v29 + v15 + 3) = *(v14 - 2); v15 += 4; } while ( v15 < 0x10 ); v17 = &v29; // MD5(用户名^序列号) v18 = byte_4208B0; // 004208B0 DA E5 23 10 06 71 95 71 4B A2 CE E2 33 2B B8 66 阱#q晀K⑽?+竑 //固定md5 值
else { a1 = 0; v23 = 0; v24 = 0x67452301; v25 = 0xEFCDAB89; *a2 = _mm_xor_si128(*my_name_42130C, *real_serial_4212F8);// 将用户名与注册码异或操作 v26 = 0x98BADCFE; v27 = 0x10325476; v29 = 0i64; sub_401000(&a1, a2, 0x10u); v7 = (a1 >> 3) & 0x3F; v8 = 0x78 - v7; v9 = 0x38 - v7; v10 = v7 < 0x38; v11 = &a1 + 1; if ( !v10 ) v9 = v8; v12 = 0; do { v13 = *(v11 - 1); v11 += 4; LOBYTE(a2[v12]) = v13; BYTE1(a2[v12]) = *(v11 - 4); BYTE2(a2[v12]) = *(v11 - 3); HIBYTE(a2[v12]) = *(v11 - 2); ++v12; } while ( v12 < 2 ); sub_401000(&a1, &::a2, v9); sub_401000(&a1, a2, 8u); v14 = &v24 + 1; v15 = 0; do { v16 = *(v14 - 1); v14 += 4; *(&v29 + v15) = v16; *(&v29 + v15 + 1) = *(v14 - 4); *(&v29 + v15 + 2) = *(v14 - 3); *(&v29 + v15 + 3) = *(v14 - 2); v15 += 4; } while ( v15 < 0x10 ); v17 = &v29; // MD5(用户名^序列号) v18 = byte_4208B0; // 004208B0 DA E5 23 10 06 71 95 71 4B A2 CE E2 33 2B B8 66 阱#q晀K⑽?+竑 //固定md5 值
所以只要根据给出的公开用户名及序列号算出异或值,进而异或我们的用户名‘KCTF’,便可得到序列号:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- [原创]KCTF 2024 第十题 试探 2047
- KCTF2023第五题 争分夺秒 9501
- KCTF2022第三题 石像病毒 7283
- [原创]KCTF2021春季赛第四题 英雄救美 10010
- [原创] 第五题:魅影舞姬 3193
看原图
赞赏
雪币:
留言: