[2019紅帽杯]easyRE
查殼
無殼,64位elf檔案
分析
首先沒找到什麼有用的函式,用shift + 12
搜尋字串
定位這個字串
x追蹤到函式
首先關注這裡第一個for迴圈,按tab到彙編介面檢視
這是個簡單的異或,寫一下指令碼
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
第二個加密
跟進sub_400E44
函式
檢視裡面的aAbcdefghijklmn
字串:
很明顯這是一個base64加密
將off_6CC090
變數進行解密
十次base64解密
得到https://bbs.pediy.com/thread-254172.htm
點進去是看雪論壇的一篇文章,但沒有什麼與flag有關的內容
後面其實就沒思路了,後面也是看的別的大佬的wp:
最後加密
點進off_6CC090
這裡還有一大串字串,對著變數名按x找到函式,f5反彙編
直接關注這個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_6CC0A0
與v4
進行異或
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位元組
因此便可寫指令碼得到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}