aaaaaaaa:
checksec檢查,ida分析:
開了堆棧不可執行的保護,分析邏輯很簡單,就是輸入必須a,且是一堆a,a數量大于99即可,就可以直接getshell了,上腳本:
薯片拯救世界1:
checksec檢查,ida分析:
開了Cannary棧溢出保護,堆棧不可執行保護。邏輯就是將讀取出來的flag放到bss段s1中,看到read函數,在while循環里面,輸入存到buf中,buf與s1進行比較,匹配就成功,不匹配就失敗,這里本地測試時需要自己寫個flag(24位的大小)不然跑步起來,剛開始以為可以繞過泄露cannary去繞過保護,失敗了,換思路,拿出逆向的思想,這題或許可以暴力破解,就是ASSCI碼一個個去試,加個截斷符\x00,每一次只要成功了,就往下,猜想flag是hgame{xxxxx},所以直接上腳本:
總結:當思路不對時,及時調整思路,爆破的思路繼續學習~
babysc:
64位,沒有開任何保護,堆棧可以執行,直接生成shellcode,確定下來,然后去ida看看邏輯:
剛開始,發現F5大法不行了,此時兩種方法:1、直接剛匯編 2、nop掉fail的地方,就可以F5大法了,我們選擇方法2,把call rdx nop掉,得到圖:
這里很明顯是進行了異或加密,邏輯很簡單,直接生成的shellcode先進行異或一次(相當于加密),發送過去時它又會異或一次(相當于解密),就是我們的shellcode了,paylaod:
之前做逆向題也遇到過代碼異或加密的題目,把代碼轉成16進制,進行解密,再轉成字符型,也作為一個經驗的積累吧。
Stein;Gate:
檢查下保護機制:
保護還挺多的,就一個地址隨機化沒有開了
ida分析:
看來是有很多關卡要過了,一個個來吧:
看來要return 0才能一步步地過關,不能中途exit(0),看看參數函數,也就是
第一關:
看到random,應該會產生隨機數,然后看到輸入ID是到bss段的,沒什么思路,暫時知道ID是放到bss中,看看下一關:
看到是有棧溢出的操作,但是開了棧溢出保護,不能直接溢出哎,只能先覆蓋那個v2 為0x2333才能進入下一關,那么查看棧中的位置:
v2就是那個var_10,所以棧的偏移為0x40-0x10=0x30,然后覆蓋那個0x2333即可過第一關,下一關:
格式化字符串漏洞!小竊喜,下斷點看程序:
可以發現,我們的輸入在rsi寄存器中,而我們的隨機數v4剛好在我們的rsi所在棧中位置的上一個,所以隨機數在棧中的位置與esp的偏移為2,而64位因為6個寄存器優先存值,rsi是第二個寄存器,所以rsi到棧esp有5的偏移,所以總的偏移為7,這樣就可以泄露出隨機數的值了,這個值加上那個0x1234又寫回到v4中,所以可以用填充的方法實現,又因為第三關要提前填好v1成0x6666的值:
所以在這里一起寫:
來到第三關:
我們知道那個v1已經寫好了,這里讀取5個字節,然后又是格式化字符串的漏洞,那么可以canary泄露了,我們知道canary是存在于ebp的上一個的值,緊挨著ebp的,那么就可以知道它的偏移量了:
可知在棧中相對于ebp的偏移是6,而rsi和esp的偏移為5,所以總的偏移為11,那么:
這里我們就得到了canary的值,到時填充到它的溢出位置就能實現棧溢出了,到時直接一個gadget利用system函數就能getshell了: