發表文章

buffer_overflow 第3章 筆記2 為啥我們第一個shellcode不能在真實世界生存

圖片
我們第一個shellcode 成功執行但會產生一些問題: 問題有4個 1. 預設是用window 的cmd執行,才能看到我們的Hello, World。 2.shellcode 中包含了\x00字元 (NULL字元) 3我們使用了絕對位址 77C4186A (mscvrt.printf)   和 77C39E7E(msvcrt.exit) 4.預先假設 printf , exit 一定可以被呼叫到,也就是假設說 msvcrt.dll 一定會被載入到記憶體中 第一個問題: 可以使用Messagebox解決的shellcode 之後會實作 第二個問題:可以使用編碼器來解決 第三個問題:  只要是早期的作業系統,DLL的位址通常不會改變,但vista之後的版本系統會啟動ASLR 亂數的使DLL 的基址給改變。 第四個問題:  只要是Dev C++編譯出的程序,msvcrt.dll通常會被載入,但如果今天換成 其他編譯器就不保證一定會載入。 我們先看一下 //hello.exe #include <cstdio> #include <cstdlib> int main() {         printf("Hello, world!\n");         exit(0); }  DEV C++ 所編譯出來的hello.exe 載入的dll 根據 Immunity Debugger顯示: 按下ALT+E 載入的DLL 有三個 1.msvcrt.dll 2.kernel32.dll 3.ntdll.dll visual c++ 2010 express 所編譯出來的hello.exe 載入的dll 載入的DLL 有三個 1.MSVCR100D.dll 2.kernel32.dll 3.ntdll.dll 所以看的出來   同樣程式dev c++ 載入了msvcrt.dll 但 VC++載入了的卻是MSVCR100D.dll,也就是說,我們的shellc...

buffer_overflow 第3章 筆記1 第一個shellcode

圖片
第三章  shellcode  shellcode 也就是一隻程式,你需要這個程式做出什摸樣的動作。 shellcode 是用組合語言來編寫的,編寫完後轉換為相對應的opcode利用buffer_overflow 攻擊定位到EIP暫存器之後,在把流程跳到shellcode上,如此一來shellcode就會被執行。 在此之前,需要先了解DLL DLL是動態函數連接庫,一個DLL裡面有好多微軟提供的API 函數。 當應用程式被執行加載時,如果該程式有使用到某個DLL裡面的API,應用程式就會載入該DLL,DLL可以使用應用程式的資源,應用程式可以使用該DLL的API。 那我們就寫一個打印出hello world 然後結束的程式,觀察一下用組合語言的角度會長什摸樣子。 <<<<用DEV  c++編譯>>>> int main() {       printf("hello world\n");       exit(0); } 用OllyDbg打開: 框起來的為主程式: 可以在 004012C1看到 CALL <JMP.&msvcrt.printf> 代表他要呼叫printf,我們可以在 004012C1下中斷點按F2 在按F9 讓程式執行到中斷點,接著F7進入看看 printf 真正位置。 下方顯示了 77C1186A才是printf真正的位址。 可以在 004012CD看到 CALL <JMP.&msvcrt.exit> 代表他要呼叫exit,我們可以在 004012CD下中斷點按F2 在按F9 讓程式執行到中斷點,接著F7進入看看 exit 真正位置。 可以觀察到: printf()函數的真正位址在 msvcrt.dll 內  位置為 77C1186A exit()   函數的真正位址在 msvcrt.dll 內  位置為 77C09E7E 知道了函數的位址我們只要先把參...

buffer_overflow 第2章 筆記2 組合語言

圖片
來,馬上淺談組合語言之不給你喘息。                                           首先,組合語言就2件事。 1.CPU。        //做運算 2.暫存器。    //用來存放數據 把CPU看成是你的大腦在做思考,暫存器則是每個手跟腳或器官,可以放不同東西。 例如:           左手現在有一隻掃把,右手則有一隻笨斗,光拿著是沒用的,想要掃地,就必須結合使用,靠我們的大腦思考要如何掃地。 上面的例子: 左手是一個暫存器           存放的數據是掃把 右手也是個暫存器           存放的數據是笨斗 左腳    暫存器                   一隻白鞋 右腳    暫存器                   一隻白鞋 CPU才是老大可以控制所有手跟腳,讓左手的掃把打人,也可以掃地,也可以穿白色鞋子邊走邊掃。 常見暫存器有哪些: AX,BX, CX, DX    這四個暫存器基本上隨便用,可以存放任何數據。 接下來非常重要的指針暫存器,IP,BP,SP  。 指針熟悉C語言的都知道吧?    不知道別怕。。。 範例             宣告 int *ptr     ...

Buffer_overflow 第2章 筆記1 函數堆疊的故事

圖片
首先:                     要先講一個故事給大家暖暖場。 故事:        領銜主演  孔同學                           白同學                                                                            蒼老師 夏日限定寫真集(500)頁                                                                            可拆式筆記本(已用到第60頁)                                               ...

buffer_overflow 第1章 筆記 介紹

圖片
本系列文章出自於Windows軟體安全實務 緩衝區溢位攻擊(張大衛)著 這本書的學習筆記 首先感謝這位作者:提供了這本質量非常高的書 看真的10遍都閒不夠多 XD 我並不會一一講解所有書中的例子,但為了講讓大家看懂,還是會從基本知識開始講由於本人也不是這方面的高手,所以如果有錯的話希望可以告知小弟我                                                                                   緩衝區溢位是啥?    看圖    角色 1. 我們是hacker 也就是服務生倒水的人 角色 2. 有漏洞的軟體  也就是杯子 角色 3. 攻擊方式  (shellcode) 馬上給大家講個故事: 在一間港式餐廳中(為啥是港式 因為我愛吃燒賣XD)有個服務生很不爽故意把客人的水杯加到滿出來   而且還故意用熱水以至於燙到客人的腳上 ,他感覺不夠過癮,下一次便把熱水換成熱茶讓客人的衣服染色 這就很舒服。                               為什摸說這是一個漏洞呢,首先漏洞在於杯子 ,杯子並沒有幫你檢查繼續倒水會不會滿出來的這個功能 導致於服務員故意跟你來這手,那攻擊呢,也就是我們溢出的水,又稱shellcode 。 shellcode就是攻擊方式 我們希望用什摸方式達到什摸樣的攻擊,以上面的例子來說我們可以單純加清水讓客人...