2015年2月11日 星期三

[很雷][C++][OllyICE][ASM]摸摸摸、初探Buffer Overflow攻擊

一直覺得Buffer Overflow的算法很神奇
一定要算到很精確才能讓Shellcode溢位到準確的EIP上做return
不過最近某某大神的這篇緩衝區溢位攻擊:第二章 - 改變程式執行的流程<(_ _)>
看完之後自己的心得吧(?)

不過因為使用上原版的好麻煩...(各種懶惰)
所以改寫了一下

在中間因為x恆等於1所以永遠都會printf出"x is 1"這句話
用跟蹤了一下Dev C++編譯出來的結果
先對strcpy下breakpoint然後跟蹤回去可以看到整支code在哪

接著可以跟蹤一下記憶體
在func函數跑到申請區域變數記憶體完後的stack資料
在func函數跑到尾巴時候的stack資料
可以試著把Dev C內的Code文字改成24個點去占用buffer變數的24個Byte看看
占用後的結果:
會發現還有兩組LONG大小的空間,才會占用到EIP返回點
後來跟了一下22FEC0中記錄的777B8CD5的這個位置,是strcpy的API地址
至於22FEC4的這個就不知道是啥了...看不太懂到底這個位置是?
總之可以得知我們需要占用24個字節+2個LONG的長度+一個LONG(EBP記錄的變數)
最後才能占用到22FECC的EIP返回點

可以發現那個永遠不會被執行到的位置地址為0x0040170C
轉成BYTE Array得寫:0C 17 40 00

所以最後文字的Shellcode可以寫成:
........................xxxxyyyyzzzz\x0C\x17\x40\x00
24個「.」負責占用buffer的內容
四個x負責占用strcpy的地址
四個y負責占用不知道是啥的空間
四個z負責占用占存的EBP值
接著就是補上四個BYTE的返回點
最後把文字換為shellcode,就成功控制了底下的邏輯流程惹