REVERSE-PRACTICE-BUUCTF-20
REVERSE-PRACTICE-BUUCTF-20
- [SCTF2019]creakme
- [網(wǎng)鼎杯 2020 青龍組]bang
- [WUSTCTF2020]funnyre
- Dig the way
[SCTF2019]creakme
exe程序,運(yùn)行后提示輸入ticket,無殼,用ida分析
交叉引用字符串“please input your ticket:”來到sub_402540函數(shù)
分析sub_402320函數(shù),在DebugBreak和return之間有一段代碼引用
修改EIP從地址0x402412處開始執(zhí)行,調(diào)試可知sub_402450函數(shù)是對.SCTF段數(shù)據(jù)的SMC
回到sub_402540函數(shù),往下走
分析sub_4024A0函數(shù),過掉兩個(gè)反調(diào)試,執(zhí)行SMC好的.SCTF段的代碼,發(fā)現(xiàn)是將靜態(tài)可見的字符串">pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo"變成了動(dòng)態(tài)可見的字符串"nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo="
回到sub_402540函數(shù),往下走
獲取輸入input,拷貝input到Dst,sub_4020D0函數(shù)對Dst進(jìn)行AES的CBC模式加密,密文存儲(chǔ)在v2,令v4=v2,那段動(dòng)態(tài)可見的字符串賦給v6,最后就是比較v4和v6
sub_4020D0->sub_401690
在sub_401690函數(shù)中發(fā)現(xiàn)兩個(gè)字符串"sctfsctfsctfsctf"和"sycloversyclover",由于AES的CBC模式加密需要一個(gè)偏移量iv與第0塊明文異或,于是可以確定iv=“sctfsctfsctfsctf”,key=“sycloversyclover”,參考:AES五種加密模式(CBC、ECB、CTR、OCF、CFB)
已知key,iv,cipher,寫解AES.CBC腳本即可得到flag
[網(wǎng)鼎杯 2020 青龍組]bang
apk文件,jadx-gui打開什么都沒有,SecShell提示是加了殼
果然,這個(gè)apk加了梆梆的殼
使用frida腳本脫殼
脫殼后的dex文件再用jadx-gui分析,在com.example.how_debug.MainActivity類中找到flag
[WUSTCTF2020]funnyre
elf文件,運(yùn)行后沒有輸入,無殼,ida分析
main函數(shù)沒有被ida識(shí)別成函數(shù),是因?yàn)橛谢ㄖ噶?br /> jz和jnz指令都會(huì)跳轉(zhuǎn)到同一條(下一條)指令,把jz和jnz都nop掉
call后面的地址不存在,是因?yàn)樵谠菊_的指令字節(jié)基礎(chǔ)上加了多余的字節(jié),把call那條指令按d轉(zhuǎn)成數(shù)據(jù)后,順序地一個(gè)一個(gè)nop掉多余的字節(jié),直到ida能夠正確識(shí)別出指令
jz指令跳過了從地址0x400621開始的兩個(gè)字節(jié),也是直接nop掉jz
總共有4處類似這樣的花指令,去除完全后,選中main函數(shù)的全部紅色代碼,按p創(chuàng)建函數(shù),F5反匯編
main函數(shù)中,驗(yàn)證輸入的長度是否為38,且有flag{}包住,對花括號內(nèi)的32個(gè)字符做300多次運(yùn)算,最后與已知的unk_4025C0比較,驗(yàn)證輸入
angr參考:angr學(xué)習(xí)【一】
腳本參考:buuctf刷題記錄25 [WUSTCTF2020]funnyre
調(diào)用angr框架寫腳本即可得到flag
Dig the way
exe程序,運(yùn)行后直接閃退,無殼,ida分析
棧溢出的題目
main函數(shù)的主要邏輯為
讀取data文件到v7,執(zhí)行func0,func1和func2函數(shù),返回值分別賦給v9,v10和v11,如果v11為0,則調(diào)用get_key函數(shù)獲得flag。但是對于func2函數(shù),無論傳入的參數(shù)為何值,其返回值永遠(yuǎn)為正,v11不可能為0,而對于func1函數(shù),如果傳入的參數(shù)合適,其返回值可以為0,于是便需要通過func0函數(shù)交換v15和v16所存儲(chǔ)的函數(shù)指針,使得執(zhí)行func1函數(shù)時(shí),其返回值可以賦給v11
由于程序讀取data文件是從頭到尾全部讀取,而v7只有20個(gè)字節(jié)大小,如果data文件的字節(jié)數(shù)大于20,多出來的字節(jié)就會(huì)將v8,v9,v10等等這些變量覆蓋
v12和v13被程序賦值為3和4,進(jìn)入func0函數(shù)后并不能達(dá)到交換v15和v16的目的,因?yàn)榇藭r(shí)func0函數(shù)中參與運(yùn)算的變量為v11和v12,而不是v15和v16。于是便利用程序讀data文件有可能覆蓋v12和v13的漏洞,將v12和v13覆蓋為7和8
v7有20個(gè)字節(jié),v8~v11是4個(gè)int,也就是4x4=16個(gè)字節(jié),于是data文件需要從第36個(gè)字節(jié)開始,將v12和v13覆蓋為7和8,data為
發(fā)現(xiàn)exe程序還是運(yùn)行后閃退,調(diào)試發(fā)現(xiàn)func1函數(shù)的返回值v11還是為正
仔細(xì)看調(diào)用func0~func2這部分代碼,在v12和v13分別為7和8作為參數(shù)傳入func0函數(shù)交換v15和v16后,v15執(zhí)行func2函數(shù),v16執(zhí)行func1函數(shù),而在循環(huán)中v12和v13由i賦值,當(dāng)執(zhí)行v16(func1)函數(shù)時(shí),v12和v13的值分別為2和3
也就是說,func1函數(shù)執(zhí)行時(shí),實(shí)際上是abs(v10+v11)-abs(v11)-abs(v10)+2,v10等于2,要使返回的值為0,則需v11為-1,于是同樣利用程序data讀文件的漏洞將v11覆蓋為-1,data為
再次運(yùn)行exe程序,得到flag
總結(jié)
以上是生活随笔為你收集整理的REVERSE-PRACTICE-BUUCTF-20的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招行汽车分期怎么还款 招行汽车分期怎么提
- 下一篇: 地板价要按不住了,国内油价将迎来上调,可