aaaaaaaa:
checksec檢查吉嚣,ida分析:
開了堆棧不可執(zhí)行的保護,分析邏輯很簡單蹬铺,就是輸入必須a尝哆,且是一堆a,a數(shù)量大于99即可甜攀,就可以直接getshell了秋泄,上腳本:
薯片拯救世界1:
checksec檢查琐馆,ida分析:
開了Cannary棧溢出保護,堆棧不可執(zhí)行保護恒序。邏輯就是將讀取出來的flag放到bss段s1中啡捶,看到read函數(shù),在while循環(huán)里面奸焙,輸入存到buf中瞎暑,buf與s1進行比較,匹配就成功与帆,不匹配就失敗了赌,這里本地測試時需要自己寫個flag(24位的大小)不然跑步起來玄糟,剛開始以為可以繞過泄露cannary去繞過保護勿她,失敗了,換思路阵翎,拿出逆向的思想逢并,這題或許可以暴力破解,就是ASSCI碼一個個去試郭卫,加個截斷符\x00砍聊,每一次只要成功了,就往下贰军,猜想flag是hgame{xxxxx}玻蝌,所以直接上腳本:
總結(jié):當(dāng)思路不對時,及時調(diào)整思路词疼,爆破的思路繼續(xù)學(xué)習(xí)~
babysc:
64位俯树,沒有開任何保護,堆椃〉粒可以執(zhí)行许饿,直接生成shellcode,確定下來舵盈,然后去ida看看邏輯:
剛開始陋率,發(fā)現(xiàn)F5大法不行了,此時兩種方法:1书释、直接剛匯編 2翘贮、nop掉fail的地方,就可以F5大法了爆惧,我們選擇方法2狸页,把call rdx nop掉,得到圖:
這里很明顯是進行了異或加密,邏輯很簡單芍耘,直接生成的shellcode先進行異或一次(相當(dāng)于加密)址遇,發(fā)送過去時它又會異或一次(相當(dāng)于解密),就是我們的shellcode了斋竞,paylaod:
之前做逆向題也遇到過代碼異或加密的題目倔约,把代碼轉(zhuǎn)成16進制,進行解密坝初,再轉(zhuǎn)成字符型浸剩,也作為一個經(jīng)驗的積累吧。
Stein鳄袍;Gate:
檢查下保護機制:
保護還挺多的绢要,就一個地址隨機化沒有開了
ida分析:
看來是有很多關(guān)卡要過了,一個個來吧:
看來要return 0才能一步步地過關(guān)拗小,不能中途exit(0)重罪,看看參數(shù)函數(shù),也就是
第一關(guān):
看到random哀九,應(yīng)該會產(chǎn)生隨機數(shù)剿配,然后看到輸入ID是到bss段的,沒什么思路阅束,暫時知道ID是放到bss中呼胚,看看下一關(guān):
看到是有棧溢出的操作,但是開了棧溢出保護围俘,不能直接溢出哎砸讳,只能先覆蓋那個v2 為0x2333才能進入下一關(guān)琢融,那么查看棧中的位置:
v2就是那個var_10界牡,所以棧的偏移為0x40-0x10=0x30,然后覆蓋那個0x2333即可過第一關(guān),下一關(guān):
格式化字符串漏洞漾抬!小竊喜宿亡,下斷點看程序:
可以發(fā)現(xiàn),我們的輸入在rsi寄存器中纳令,而我們的隨機數(shù)v4剛好在我們的rsi所在棧中位置的上一個挽荠,所以隨機數(shù)在棧中的位置與esp的偏移為2,而64位因為6個寄存器優(yōu)先存值平绩,rsi是第二個寄存器圈匆,所以rsi到棧esp有5的偏移,所以總的偏移為7捏雌,這樣就可以泄露出隨機數(shù)的值了跃赚,這個值加上那個0x1234又寫回到v4中,所以可以用填充的方法實現(xiàn),又因為第三關(guān)要提前填好v1成0x6666的值:
所以在這里一起寫:
來到第三關(guān):
我們知道那個v1已經(jīng)寫好了纬傲,這里讀取5個字節(jié)满败,然后又是格式化字符串的漏洞,那么可以canary泄露了叹括,我們知道canary是存在于ebp的上一個的值算墨,緊挨著ebp的,那么就可以知道它的偏移量了:
可知在棧中相對于ebp的偏移是6汁雷,而rsi和esp的偏移為5净嘀,所以總的偏移為11,那么:
這里我們就得到了canary的值侠讯,到時填充到它的溢出位置就能實現(xiàn)棧溢出了面粮,到時直接一個gadget利用system函數(shù)就能getshell了: