BUUCTF Findkey

发布时间 2023-07-30 21:45:25作者: zydt10

 

对题目分析:
 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就可以了