中國(guó)頂級(jí)CTF競(jìng)賽網(wǎng)絡(luò)安全大賽--2022網(wǎng)鼎杯re2解題思路來(lái)了,快來(lái)圍觀!

作者:黑蛋
一、脫殼
PEID查不出來(lái),用了die,顯示是UPX3.96的殼,用了脫殼機(jī),脫不了,只能手動(dòng)脫殼,拖入x64dbg,F(xiàn)9運(yùn)行到程序領(lǐng)空,很明顯的特征,push:

無(wú)腦使用ESP定律大法,對(duì)ESP下硬件訪問(wèn)斷點(diǎn):

F9運(yùn)行,在pop處停下:

F4運(yùn)行到下面第一個(gè)jmp,F(xiàn)8,進(jìn)去又是一個(gè)jmp,繼續(xù)F8,到達(dá)OEP:

使用x64dbg插件dump:

第一步先dump保存,然后第二步,第三步,第四步選擇剛才dump保存的程序:

脫殼成功,但是運(yùn)行一閃而過(guò),這是動(dòng)態(tài)基址搞的鬼,手法很多,有脫殼機(jī)有禁用動(dòng)態(tài)基址選項(xiàng),這里我們直接把程序拖入010Editor修改標(biāo)志位,改為20即關(guān)閉動(dòng)態(tài)基址,保存退出:

可正常運(yùn)行,接下來(lái)分析算法。
二、算法分析
1、進(jìn)入主函數(shù)(很明顯是vs寫的程序,根據(jù)步驟找主函數(shù)就行)
F9進(jìn)入程序領(lǐng)空,進(jìn)入第一個(gè)call:

再進(jìn)入第二個(gè)call:

找特征碼,進(jìn)入標(biāo)記的call:

進(jìn)入第四個(gè)call:

走過(guò)一個(gè)跳轉(zhuǎn),進(jìn)入主函數(shù):

2.動(dòng)態(tài)調(diào)試
標(biāo)記的函數(shù)是輸入flag后第一個(gè)call,并且傳參進(jìn)去,所以這里可以跟進(jìn)去看一看:

隨便輸入一部分?jǐn)?shù),回車并跟進(jìn)標(biāo)記函數(shù):


從下面可以看到這邊傳入我們輸入flag,是關(guān)鍵函數(shù),跟進(jìn)去:

分析函數(shù):

可以猜到flag的長(zhǎng)度為20,如果不是20,直接到打印錯(cuò)誤的地方,繼續(xù)向下看,下面對(duì)字符串進(jìn)行第一次處理。亦或66,繼續(xù)看下去,又是一個(gè)比較長(zhǎng)度函數(shù),之后沒(méi)什么了,這個(gè)函數(shù)結(jié)束,直到返回主函數(shù):

下面就是打印wrong,長(zhǎng)度為20會(huì)跳過(guò)這個(gè)打?。?br>

我們看當(dāng)前標(biāo)記的函數(shù),傳入?yún)?shù)是我們flag亦或66之后的字符串,絕對(duì)關(guān)鍵函數(shù),跟進(jìn)去,F(xiàn)8一直運(yùn)行:

我們發(fā)現(xiàn)又對(duì)字符串處理,先+A,再亦或50:

繼續(xù)運(yùn)行發(fā)現(xiàn)關(guān)鍵函數(shù),F(xiàn)8走過(guò)直接失敗,重新到這個(gè)位置,發(fā)現(xiàn)傳入處理后的第一個(gè)字符,跟進(jìn)去:

我們發(fā)現(xiàn)一個(gè)cmp,和我們字符串第一個(gè)字母比較:

查看另一個(gè)地址的值:

繼續(xù)跟,會(huì)發(fā)現(xiàn)直接退出,所以這里是比較函數(shù),直接寫腳本:
#include?
int?main()
{
????unsigned?int?dword_14001D000[20]?=?{
????0x0000004B,?0x00000048,?0x00000079,?0x00000013,?0x00000045,?0x00000030,?0x0000005C,?0x00000049,
????0x0000005A,?0x00000079,?0x00000013,?0x00000070,?0x0000006D,?0x00000078,?0x00000013,?0x0000006F,
????0x00000048,?0x0000005D,?0x00000064,?0x00000064
????};
????char?flag[21]?=?{?0?};
????for?(int?i?=?0;?i?<?20;?i++)
????{
?????? flag[i]?=?((dword_14001D000[i]?^?0x50)?-?10)?^?0x66;
????}
??? printf(flag);
????return?0;
}

flag:why_m0dify_pUx_SheLL