REVERSE-PRACTICE-BUUCTF-17
REVERSE-PRACTICE-BUUCTF-17
- [網(wǎng)鼎杯 2020 青龍組]jocker
- [2019紅帽杯]childRE
- [MRCTF2020]PixelShooter
- [ACTF新生賽2020]SoulLike
[網(wǎng)鼎杯 2020 青龍組]jocker
exe程序,運(yùn)行后提示輸入flag,無(wú)殼,用ida分析
main函數(shù)平衡棧后,F5反匯編
主要邏輯為
讀取輸入,檢驗(yàn)輸入長(zhǎng)度是否為24,對(duì)輸入進(jìn)行變換,與已知數(shù)組比較,執(zhí)行一段從encrypt函數(shù)起始地址開(kāi)始的SMC,分析可知,finally函數(shù)也會(huì)完全被SMC,未經(jīng)變換的輸入作為參數(shù),調(diào)用encrypt函數(shù)和finally函數(shù)
先寫(xiě)input經(jīng)過(guò)wrong變換和omg驗(yàn)證的逆運(yùn)算腳本,得到的是假flag
往下走,在ida中使用idapython腳本完成SMC自修改代碼
SMC前,encrypt函數(shù)和finally函數(shù)各自包含了一大段數(shù)據(jù)
SMC后,encrypt函數(shù)和finally函數(shù)的指令間都有一些db指令,實(shí)際上為花指令
encrypt函數(shù):
finally函數(shù):
手動(dòng)nop掉多余的db指令,讓ida能夠自動(dòng)分析成代碼
完成nop后,發(fā)現(xiàn)encrypt函數(shù),在兩端黑色代碼中間插有一段紅色代碼
這時(shí)的處理方法是,在encrypt函數(shù)起始地址0x401500處,右鍵->undefine,變成黃色的數(shù)據(jù),再按c轉(zhuǎn)成代碼,這時(shí),encrypt函數(shù)起始地址與finally函數(shù)起始地址之間的代碼全部為紅色,再在encrypt函數(shù)起始地址0x401500處,右鍵->create function,平衡棧后,F5反匯編
這里encrypt函數(shù)反匯編后,好像沒(méi)有用到未經(jīng)變換的input,可能是patch代碼的時(shí)候出錯(cuò)了,不過(guò)可以猜測(cè)為input和字符串“hahahaha_do_you_find_me?”異或,再與已知的unk_403040數(shù)組比較
寫(xiě)encrypt函數(shù)的逆運(yùn)算腳本,得到部分flag,之所以是部分flag,是因?yàn)殚L(zhǎng)度為24的unk_403040的最后5個(gè)元素為0,“d_me?”與0異或不變,或者v6=19說(shuō)明了只異或了19次,而且提交失敗
同encrypt函數(shù)的解析步驟,對(duì)finally函數(shù),先nop掉多余的db指令,undefine掉黑色代碼,轉(zhuǎn)成數(shù)據(jù),按c再轉(zhuǎn)成代碼,右鍵->create function,F5反匯編
沒(méi)看懂這個(gè)函數(shù),看了其他師傅的wp,說(shuō)這里也是異或,能看到的5個(gè)值[37,116,112,38,58]是異或后要比較的值,由于input的最后一位一定是“}”,它異或一個(gè)值(“71”)后與58相等,而且它之前的四位也是和這個(gè)值(“71”)異或,結(jié)果是58之前的四個(gè)值
寫(xiě)finally函數(shù)的逆運(yùn)算腳本得到后半部分的flag,替換掉“flag{d07abccf8a410cd_me?”的后5位,flag即為“flag{d07abccf8a410cb37a}”
[2019紅帽杯]childRE
exe程序,運(yùn)行后直接輸入,無(wú)殼,ida分析
交叉引用字符串“flag{MD5(your input)}”來(lái)到sub_140001610函數(shù)
sub_140001610函數(shù)主要的邏輯為
讀取輸入,驗(yàn)證輸入的長(zhǎng)度是否為31,對(duì)輸入進(jìn)行位置變換處理,位置變換的結(jié)果放到v2(name),經(jīng)調(diào)試可知,輸入為abcdefghijklmnopqrstuvwxyz12345時(shí),v2(name)的內(nèi)容為pqhrsidtujvwkebxylz1mf23n45ogca
對(duì)v2(name)調(diào)用UnDecorateSymbolName函數(shù)處理,結(jié)果放到outputstring,驗(yàn)證outputstring的長(zhǎng)度62及其內(nèi)容
先寫(xiě)驗(yàn)證outputstring的長(zhǎng)度62及其內(nèi)容的逆運(yùn)算腳本,得到outputstring,為一個(gè)未修飾的C++符號(hào)名
UnDecorateSymbolName函數(shù)反修飾指定已修飾的 C++ 符號(hào)名,參考:UnDecorateSymbolName
第1個(gè)參數(shù)為已修飾的 C++ 符號(hào)名,此名稱能以始終為問(wèn)號(hào) (?) 的首字符鑒別,本題中為v2(name),第2個(gè)參數(shù)指向字符串緩沖區(qū)的指針,該緩沖區(qū)接收未修飾的名字,本題中為outputstring
可知需要對(duì)outputstring符號(hào)名修飾才能得到v2(name),參考:c/c++函數(shù)名修飾規(guī)則
或者通過(guò)寫(xiě)C++代碼,調(diào)用__FUNCDNAME__宏(FUNCDNAME:只有在函數(shù)內(nèi)部才有效,返回該函數(shù)經(jīng)編譯器修飾后的名字。如果編譯器選項(xiàng)中設(shè)定了/EP或/P,則__FUNCDNAME__是未定義。)直接得到函數(shù)經(jīng)編譯器修飾后的符號(hào)名,需要注意的是函數(shù)所在的類,域,返回類型,函數(shù)名,參數(shù)類型都必須和已知完全相同
運(yùn)行結(jié)果即為v2(name),注意是在x86架構(gòu)下運(yùn)行的結(jié)果
寫(xiě)逆位置變換腳本即可得到輸入,對(duì)輸入進(jìn)行md5散列即可得到flag
[MRCTF2020]PixelShooter
apk文件,jadx-gui打開(kāi),什么都沒(méi)發(fā)現(xiàn)
用Apktool Box反編譯apk后,在PixelShooter->lib->armeabi-v7a目錄下發(fā)現(xiàn)3個(gè).so文件,依次分析,同樣什么都沒(méi)發(fā)現(xiàn)
突然想到這是個(gè)安卓unity游戲,而安卓unity游戲的核心邏輯一般位于assets\bin\Data\Managed\Assembly-CSharp.dll
用dnSpy打開(kāi),在類UIController的GameOver方法中找到flag
[ACTF新生賽2020]SoulLike
elf文件,無(wú)殼,ida分析
main函數(shù),讀取輸入,驗(yàn)證輸入的前5個(gè)字符是否為“actf{”,將輸入{}內(nèi)的字符放入v8,可知輸入{}內(nèi)的長(zhǎng)度為12,調(diào)用sub_83A函數(shù)驗(yàn)證v8,且輸入的最后一個(gè)字符為“}”
分析sub_83A函數(shù),可以看到是對(duì)input{}內(nèi)12個(gè)字符的超多異或運(yùn)算
在sub_83A函數(shù)的最后,是input{}內(nèi)的12個(gè)字符經(jīng)過(guò)超多異或運(yùn)算后的值與已知的v4到v15比較,因?yàn)闀?huì)有類似input[3]^=input[2]的情況,所以不能通過(guò)調(diào)試得到每個(gè)字符最后等效的異或值是什么
不過(guò)當(dāng)比較為不相同時(shí),程序會(huì)打印輸入是哪個(gè)位置的字符錯(cuò)了,于是可以寫(xiě)腳本爆破出flag
爆破腳本
運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的REVERSE-PRACTICE-BUUCTF-17的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 存款达到一个数,每月可领5000元的生活
- 下一篇: 招行现金分期怎么还款 招行现金分期怎么提