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