REVERSE-PRACTICE-BUUCTF-23
REVERSE-PRACTICE-BUUCTF-23
- [2019紅帽杯]Snake
- [BSidesSF2019]blink
- [De1CTF2019]Re_Sign
- [ACTF新生賽2020]Splendid_MineCraft
[2019紅帽杯]Snake
unity游戲,dnSpy打開(kāi)Snake\Snake_Data\Managed\Assembly-CSharp.dll
發(fā)現(xiàn)要載入Interface這個(gè)dll
ida打開(kāi)Snake\Snake_Data\Plugins\Interface.dll
交叉引用字符串"You win! flag is "來(lái)到GameObject函數(shù)
分析GameObject函數(shù),該函數(shù)只有一個(gè)參數(shù)a1,當(dāng)a1∈[0,99]時(shí),會(huì)執(zhí)行if語(yǔ)句包絡(luò)的代碼,其中就有輸出flag的語(yǔ)句
于是考慮爆破,寫C代碼,載入Interface.dll,調(diào)用GameObject函數(shù),傳入從0到99之間的整數(shù),爆破成功即可得到flag,從flag可以知道是RSA加密算法
[BSidesSF2019]blink
apk文件,jadx-gui打開(kāi),com.example.blink.MainActivity什么都沒(méi)有
在com.example.blink.r2d2中,將一段字符串解base64,分割成byte數(shù)組,填入一個(gè)圖像文件中
apk在模擬器中雙擊運(yùn)行會(huì)直接退出
按照jeb調(diào)試apk smali的方法,在啟動(dòng)apk activity時(shí),將MainActivity改成r2d2,即adb shell am start -D -n com.example.blink/com.example.blink.r2d2,jeb附加后運(yùn)行即可得到flag
[De1CTF2019]Re_Sign
exe程序,運(yùn)行后輸入,有upx殼,ESP定律脫殼后ida分析
交叉引用字符串"Success"來(lái)到sub_401000函數(shù),程序脫殼后不能運(yùn)行,ida和x32dbg配合分析
調(diào)試發(fā)現(xiàn),sub_402BA0函數(shù)讀取輸入,sub_402E40函數(shù)和sub_sub_402F80函數(shù)都是簡(jiǎn)單的賦值,調(diào)試的輸入為"abcdefg",經(jīng)過(guò)sub_401233函數(shù)變換為"GD9MH6SeHd==",而正常的base64編碼結(jié)果為"YWJjZGVmZw==",猜測(cè)sub_401233函數(shù)是變表base64,重要的是找到變表
F7單步步入sub_401233函數(shù),在這個(gè)地方找到變表
驗(yàn)證一下,sub_401233函數(shù)的變表就是找到的這個(gè)表
分析sub_401F0A函數(shù),輸入經(jīng)變表base64編碼后,在while循環(huán)體中,一個(gè)字節(jié)一個(gè)字節(jié)拷貝到v30,v30賦給v37,v37傳入sub_2160函數(shù),返回值與v25(ebx)指向的int數(shù)據(jù)比較
sub_402160函數(shù)中使用到了常規(guī)base64表,調(diào)試輸入為"abcdefg",變表base64后為"GD9MH6SeHd==",第一個(gè)字節(jié)"G"傳入sub_402160函數(shù),返回值為7,也就是"G"在常規(guī)base64表中的位置(下標(biāo)從1開(kāi)始),于是可知要去比較的數(shù)據(jù)也是某字符在常規(guī)base64表中的位置(下標(biāo)從1開(kāi)始)
x32dbg調(diào)試得到要去比較的數(shù)據(jù)
寫逆運(yùn)算腳本即可得到flag
[ACTF新生賽2020]Splendid_MineCraft
exe程序,運(yùn)行后輸入,無(wú)殼,ida分析
交叉引用字符串"Welcome to ACTF_Splendid_MineCraft!“來(lái)到sub_401080函數(shù)
讀取輸入,驗(yàn)證輸入的長(zhǎng)度是否為26,strtok函數(shù)用字符’_'將輸入分割成三個(gè)部分,于是可知輸入的格式為"ACTF{xxxxxx_yyyyyy_xxxxxx}”,v12-v13(v14-v15)為{}中的第一部分"xxxxxx",v8-v9為{}中的第二部分"yyyyyy",v10-v11為{}中的第三部分"xxxxxx"
v12-v13,即{}中的第一部分要進(jìn)入dword_4051D8,經(jīng)SMC后,驗(yàn)證{}中的第一部分
來(lái)到data段dword_4051D8,按d轉(zhuǎn)成字節(jié)形式的數(shù)據(jù),按c轉(zhuǎn)成代碼,可看到SMC的代碼
調(diào)試,SMC執(zhí)行完成后是這個(gè)樣子
往下走,來(lái)到驗(yàn)證{}內(nèi)的第一部分的代碼,“3@1b;b"和"elcome"兩個(gè)字符串異或,再加0x23,結(jié)果與傳入的{}內(nèi)的第一部分比較,可知正確的第一部分的6個(gè)字符為"yOu0y*”
由于v5與{}內(nèi)的第一部分的6個(gè)字符相關(guān),更新輸入后調(diào)試,可知v5==0x20
執(zhí)行完SMC后,來(lái)到驗(yàn)證{}內(nèi)第二部分的代碼,eax指向的是數(shù)組byte_DC5018,于是這段代碼的驗(yàn)證思路就是,cl=byte_DC5018[input[i]^(i+0x83)],寫腳本可知第二部分為"knowo3"
往下走(期間要修改幾次ZF的值),來(lái)到驗(yàn)證第三部分的代碼,這里直接比較第三部分和已知字符串"5mcsM<"
于是三個(gè)部分的腳本放在一起就是,輸入flag,驗(yàn)證成功
總結(jié)
以上是生活随笔為你收集整理的REVERSE-PRACTICE-BUUCTF-23的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AMD FSR 2.0技术正式开源!NV
- 下一篇: REVERSE-PRACTICE-BUU