[2019紅帽杯]easyRE WP

结城希亚發表於2024-10-27

[2019紅帽杯]easyRE

查殼

image-20241027144149739

無殼,64位elf檔案

分析

首先沒找到什麼有用的函式,用shift + 12搜尋字串

image-20241027144313145

定位這個字串

x追蹤到函式

image-20241027144347396

首先關注這裡第一個for迴圈,按tab到彙編介面檢視

image-20241027145347850

這是個簡單的異或,寫一下指令碼

a = [73,111,100,108,62,81,110,98,40,111,99,121,127,
     121,46,105,127,100,96,51,119,125,119,101,107,
     57,123,105,121,61,126,121,76,64,69,67]
hint = ''
for i in range(len(a)):
    hint += chr(a[i] ^ i)
print(hint)

得到hint : Info:The first four chars are flag

第二個加密

image-20241027145512241

跟進sub_400E44函式

image-20241027145550894

檢視裡面的aAbcdefghijklmn字串:

image-20241027145612961

很明顯這是一個base64加密

off_6CC090變數進行解密

十次base64解密

得到https://bbs.pediy.com/thread-254172.htm

點進去是看雪論壇的一篇文章,但沒有什麼與flag有關的內容

後面其實就沒思路了,後面也是看的別的大佬的wp:

最後加密

點進off_6CC090

image-20241027150535982

這裡還有一大串字串,對著變數名按x找到函式,f5反彙編

image-20241027150620747

直接關注這個for迴圈

 if ( (v1 ^ byte_6CC0A0[0]) == 'f' && (HIBYTE(v4) ^ byte_6CC0A3) == 'g' )
  {
    for ( j = 0; j <= 24; ++j )
      sub_410E90((byte_6CC0A0[j] ^ *(&v4 + j % 4)));
  }

這裡最主要是拿byte_6CC0A0v4進行異或

byte_6CC0A0是已知的

現在就是要求v4

關注上面的if判斷,讓v1第一個位元組與byte_6CC0A0[0]進行異或和讓v4(v4就是v1)高位元組(也就是最後一個位元組與byte_6CC0A3第一個位元組進行異或,分別得到字元f和g

因此猜測v4與byte_6CC0A0前四位元組進行異或得到字串flag(逆向七分技術三分猜說是)

為什麼v4是四位元組,可以從這裡看到v4是unsigned int變數,從其在rsp暫存器中的位置也能知道他是4位元組

image-20241027151551153

因此便可寫指令碼得到v4並進行後面的for迴圈異或得到flag

enc = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
key = []
enc2 = 'flag'
flag = ''
for i in range(len(enc2)):
    key.append(ord(enc2[i]) ^ enc[i])
for i in range(len(enc)):
    flag += chr(enc[i] ^ key[i % 4])
print(flag)

flag{Act1ve_Defen5e_Test}

相關文章