BUUCTF Findkey
对题目分析:
if ( Msg == 517 ) { if ( strlen(String1) > 6 ) // String位数小于等于6 ExitProcess(0); if ( strlen(String1) ) { memset(v17, 0, sizeof(v17)); v6 = strlen(String1); memcpy(v17, String1, v6); v7 = strlen(String1); // String1-->md5 // Str='0kk`d1a`55k222k2a776jbfgd`06cjjb'-->异或 // // 最后Str==String1 // // 逆向思路:Str异或SS再md5解码得到String1 sub_40101E(String1, v7, String1); // md5 strcpy(Str, "0kk`d1a`55k222k2a776jbfgd`06cjjb"); memset(&Str[33], 0, 0xDCu); v15 = 0; v16 = 0; strcpy(v11, "SS"); *&v11[3] = 0; v12 = 0; v13 = 0; v8 = strlen(Str); sub_401005(v11, Str, v8); // 异或 if ( _strcmpi(String1, Str) ) { SetWindowTextA(hWndParent, "flag{}"); MessageBoxA(hWndParent, "Are you kidding me?", "^_^", 0); ExitProcess(0); } memcpy(v10, &unk_423030, 0x32u); v9 = strlen(v10); // String1=123321,W^RTI_1miF2n_2lW[TL,19 sub_401005(v17, v10, v9); // 异或 MessageBoxA(hWndParent, v10, 0, 0x32u); } ++dword_428D54;
整个逆向的流程比较清晰,做题时有一处花指令,这里讲一下
jz 地址
jnz 地址
jmp 某个不合法地址
因为IDA分析到了不合法地址,所以不对这个函数进行反汇编
只需要把这个jmp patch 掉就可以(因为上面的jz和jnz保证了jmp是一定执行不到的)
以及后面第二部分的exp
String1_='123321' String1=list(String1_) enc_='W^RTI_1miF2n_2lW[TL' enc=list(enc_) a=[0]*19 for i in range(len(enc)): a[i]=ord(enc[i])^ord(String1[i%6]) for i in range(len(enc)): print(a[i],end=' ') #102 108 97 103 123 110 0 95 90 117 0 95 110 0 95 100 105 101 125 #这是打印结果,因为异或出来的0在py打印结果中不显示,所以如果直接打印就是 #flag{n_Zu_n_die},按照0的位置加入flag就可以了