[re]硬猜flag:2020網鼎杯青龍組re_joker_wp

[re]硬猜flag:2020網鼎杯青龍組re_joker_wp

2020網鼎杯青龍組的一道逆向題joker,這道題其實並不是很難,但難在考心態和腦洞,獲取flag的最後一步居然是硬猜,我吐了啊,而且沒法爆破,因爲這道題你拿到flag了,在程序中輸入也不會告訴你flag正確。

題目分析

題目是一個32位windows程序:
在這裏插入圖片描述
逆向分析一下,main函數直接f5是不行的,堆棧不平衡。

但這裏無需去糾正他,因爲main函數的邏輯還算簡單:

直接可以看出flag字符串長度是0x18也就是24
在這裏插入圖片描述
然後對輸入的flag進行了下面兩個操作,這兩個函數都可以f5:

分別是wrong:
在這裏插入圖片描述
和omg:
在這裏插入圖片描述
首先對輸入的flag的每個字節根據並1後是否爲真進行了-下標或者亦或下標的操作,然後得到的結果跟一個全局變量比較,邏輯比較簡單就可以還原:

result="fkcd\x7fagd;Vka{&;Pc_MZq\x0c7f"
i=0
flag=""
for j in result:
    if(i&1):
        flag+=chr(ord(j)+i)
    else:
        flag+=chr(ord(j)^i)
    i+=1
print flag

然而flag是假的(看flag的字符串也能看出來,而且程序還沒結束)。
在這裏插入圖片描述
然後繼續分析:
在這裏插入圖片描述
這裏可以看到對一個函數進行了一些操作,很明顯可以看出右邊的操作是循環對這個函數進行解密,解密之後直接調用。直接點進這個函數也是一堆亂碼:

好辦,直接上od,在這個函數調用前的位置0x401833 下斷點,然後執行到這:
在這裏插入圖片描述
可以看到函數已經解密了:
在這裏插入圖片描述
然後olldump直接脫殼,啥也不用選:

然後IDA打開,可以f5這個函數:
在這裏插入圖片描述
邏輯是,對輸入的內容和hahahaha_do_you_find_me?這個字符串進行異或,然後和一個全局變量進行比較,注意只異或了19個字節,然後寫出腳本還原一下:

result2="\x0e\x0d\x09\x06\x13\x05\x58\x56\x3e\x06\x0c\x3c\x1f\x57\x14\x6b\x57\x59\x0d"
flag=""
haha="hahahaha_do_you_find_me?"
for i in range(19):
    flag+=chr(ord(haha[i])^ord(result2[i]))
print flag

在這裏插入圖片描述
只有19個字節,還缺後5個字節,這個就體現這道題的噁心之處了。

IDA中看程序的邏輯發現調用flag校驗函數之後還有一個finally函數,這個函數正常執行是執行不到的,當然執行到了也不是校驗flag或者計算輸出flag,這是個“逗你玩”的函數:

這個函數同樣是加密的,從剛剛從OD中脫出來的程序中可以看到這個函數的明文:
在這裏插入圖片描述
5個字符:“%tp&:”,但後面的判斷簡直是在搞笑,每次都是隨機的?這裏顯然不是,雖然說腦洞不是很大,但這樣子加大難度真的很煩。

因爲flag最後一個字節一定是‘}’,那麼用‘:’^‘}’=0x47,然後使用“%tp&:”分別異或0x47得到最後5個字節。爆破沒用,因爲這個flag你就算是得到了,在程序中輸入也會告訴你是錯誤的,只有在比賽頁面提交纔會正確,也就是說沒有任何一個隊伍在提交這道題的flag前是確定自己做對了的…

完整exp:

result="fkcd\x7fagd;Vka{&;Pc_MZq\x0c7f"
i=0
flag=""
for j in result:
    if(i&1):
        flag+=chr(ord(j)+i)
    else:
        flag+=chr(ord(j)^i)
    i+=1
print flag
result2="\x0e\x0d\x09\x06\x13\x05\x58\x56\x3e\x06\x0c\x3c\x1f\x57\x14\x6b\x57\x59\x0d\x47\x47\x47\x47\x47"
flag=""
haha="hahahaha_do_you_fin%tp&:"
for i in range(24):
    flag+=chr(ord(haha[i])^ord(result2[i]))
print flag

得到真的flag:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章