網鼎杯2020 joker逆向


gcc編譯,無殼:

 

看一下程序結構:

程序有函數分析錯誤,堆棧的原因,我就沒改它了,因為匯編也簡單,上手就擼:

 

 

第一個關鍵塊:

4017DD就是一個字符串拷貝函數,動態可見,然后4017EB是第一個無用函數,看一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char  *__cdecl wrong( char  *a1)
{
   char  *result;  // eax
   signed  int  i;  // [esp+Ch] [ebp-4h]
 
   for  ( i = 0; i <= 23; ++i )
   {
     if  ( i & 1 )
     {
       result = &a1[i];
       a1[i] -= i;
     }
     else
     {
       result = &a1[i];
       a1[i] ^= i;
     }
   }
   return  result;
}

a1就是輸入的flag,簡單操作之后到4017F9函數判斷:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int  __cdecl omg( char  *a1)
{
   int  result;  // eax
   int  v2[24];  // [esp+18h] [ebp-80h]
   int  i;  // [esp+78h] [ebp-20h]
   int  v4;  // [esp+7Ch] [ebp-1Ch]
 
   v4 = 1;
   qmemcpy(v2, byte_4030C0,  sizeof (v2));
   for  ( i = 0; i <= 23; ++i )
   {
     if  ( a1[i] != v2[i] )
       v4 = 0;
   }
   if  ( v4 == 1 )
     result =  puts ( "hahahaha_do_you_find_me?" );
   else
     result =  puts ( "wrong ~~ But seems a little program" );
   return  result;
}

byte_4030C0是硬編碼字符,大概逆一下得到虛假flag:

byte_4030c0=[0x66, 0x6B, 0x63, 0x64, 0x7F, 0x61,  0x67, 0x64, 0x3B, 0x56, 0x6B, 0x61, 0x7B, 0x26, 0x3B, 0x50, 0x63, 0x5F, 0x4D, 0x5A, 0x71, 0x0C, 0x37, 0x66]

flag=""

for i in range(23):

    if i &1:

        byte_4030c0[i]+=i

    else:

        byte_4030c0[i]^=i

 

for i in range(23):

    flag+=chr(byte_4030c0[i])

print(flag)

 

flag{fak3_alw35_sp_me!!

 

肯定是不對的,然后下面這塊吸引我的注意:

 

有smc操作,而且代碼中確實有很多沒有解釋的byte,解密函數很簡單,寫idc也行,我直接動態調試:

虛假函數nop掉:

這就是剛剛的fake函數,nop掉就行:

下面就是自解密函數:

解密位置是401500,斷在182D,然后過掉看結果:

 

之后就是調用這塊代碼了:

跟進去,單步可以看得到懂邏輯的:

 

 

大概意思就是輸入的位數,和hahahaha_do_you_find_me?這個字符串異或之后,等於3040位置的硬編碼值

意思很簡單,單步就ok

 

然后解密得到前部分flag:

str=[0x0E,0x0D,0x09,0x06,0x13,0x05,0x58,0x56,0x3E,0x06,0x0C,0x3C,0x1F,0x57,0x14,0x6B,0x57,0x59,0x0D]

str2="hahahaha_do_you_find_me?"

flag=""

for i in range(19):

    flag+=chr(str[i]^ ord(str2[i]))

print(flag)

 

flag{d07abccf8a410c

 

但是位數明顯不夠,少5位,還有一個finall函數:

 

動態的時候這一步改jmp,或者z=0過掉:

 

進入final函數:

 

如果是字節強制分析就成:

時間函數過濾,沒用:

 

會得到%tp&:  五個字符,后面竟然和前面的flag{做比較

 

所以忙猜這是flag最后的五個字節,:就是 }的異或答案,那么:答案就是b37a}

 

所以

flag{d07abccf8a410cb37a}

 

 

 

總結:感染函數,自解密很到位,但最后的函數確實有點無腦,這樣盲猜不適合大型比賽,不行就好好整算法題目像kctf一樣(手動狗頭.jpg)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM