-
-
[原创]签到题:乱世鬼雄
-
2019-9-16 21:39 1974
-
程序首先转换输入,按照字符所表示的字面值保存
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 值
所以只要根据给出的公开用户名及序列号算出异或值,进而异或我们的用户名‘KCTF’,便可得到序列号:
固定值1: c6e4cab5ced2b8fccfb2bbb6cbefbce1
注册码:
KCTF
8DA79EF3CED2B8FCCFB2BBB6CBEFBCE1
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
赞赏
他的文章