發表文章

目前顯示的是 6月, 2018的文章

buffer_overflow 第3章 筆記6 拼出我們第二個shellcode。

圖片
本節將是最後一步了!!!! 在第3章 筆記3 抓取kernel32.dll基址中寫了個自動抓取kernel32.dll的組合語言: 把他改寫成這樣: // KERNEL32_BASE 為標籤,我們的程式要從這個標籤開始執行。 -------------------------------------------------------------------------------------------------------------------------- KERNEL32_BASE:            xor eax,eax                                  //eax=0  大概是不想用EAX暫存器來指向TEB 所以把EAX變0      mov ebx,[fs:eax+0x30]               //ebx = &(_PEB)      mov ebx,[ebx+0x0c]                   //ebx = PEB->Ldr      add ebx,0x1c                               //ebx = Ldr.InitializtionOrderModuleList       KERNEL32_BASE_NEXT_MODULE:         ...

buffer_overflow 第3章 筆記5 函數名稱的雜湊值

圖片
前情提要: 上一章的筆記我們在kernel32.dll裡面,最後找到了LoadLibraryA()的函數位置,其實可以開始用組合語言寫一個自動定位,並且找到LoadLibraryA()位址的程式,但為什摸不開始動手。 原因: 我們可以找到存放函數字串的位置,在一個一個字元比對是否為"LoadLibraryA",不過這在組合語言的角度,有點難寫,過程會變的很麻煩。 所以: 本節要用,另外用雜湊值(hash)的方式,來比對。 雜湊值: 簡單來說,"love you"字串經過某種運算可以得到一個固定長度為3的數值,例如=245  ,"oiasjdoiashfoaisjd"字串經過運算後,也得到一個長度3的數值,例如=889 雜湊值有好多種,本例: 使用團體:The Last Stage of Delerium 的演算法,基本運算式如下, extern char *c;                                         //存放字串 unsigned h =0;                                         //存放雜湊值 while(*c) h=((h<<5)|(h>>27))+*c++;     //19為32位元減去13而來,13就是組語0xd 當然你也可以使用其他的雜湊值來計算,不過雜湊值產生的結果盡量不要太長,也盡量不要有英文字母,為了方便比對。 以下程式為該雜湊值小程式以C++撰寫:  原碼來自書本上   :非常感謝作者fon909 //file name f...

buffer_overflow 第3章 筆記4 在kernel32.dl 抓取LoadLibraryA函數

圖片
本節目的: 筆記3的最後我們撰寫了一個組語,可以動態抓取kernel32.dll的基址,有了基址後我們要在kernel32.dll裡面尋找一個函數叫做LoadLibraryA() 小知識: 1. 前面抓到kernel32.dll的基底後,我們知道kernel32.dll有很多函數,我們需要的是LoadLibraryA函數。 2. PE文件的全稱是Portable Executable,意為可移植的可執行的文件,常見的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微軟Windows操作系統上的程序文件(可能是間接被執行,如DLL)。 3. 所以我們要知道DLL是按照PE文件格式的結構組成的,接下來要了解PE文件。 本節只會講相關的部分,不相關的一律跳過。 4. 先給大家一個小概念,我們需要找出PE文件中的導出表Export Directory,導出表是啥? 當應用程式需要某個DLL裡面的函數時,該DLL就會被載入到記憶體,但DLL裡面有那摸多函數,我們需要那些不需要那些,這時就是導入表,跟導出表的作用了。 5.導出表: 你可以想像我們進入到一家名為kernel32.dll的店裡,店家會提供菜單,所有的API函數都在菜單上面,這就是導出表,導出表提供該DLL全部的API函數。 6.導入表: 導入表的概念則是,我們想吃啥就在單子上面寫上啥,也就是說,此程式需要用到該DLL裡面的哪一個函數,導入表裡面就會存放哪個函數。 7.思路:從導出表找出導入表未提供的函數: 我們想要用shellcode攻擊A程式,A程式本身有加載kernel32.dll,A程式正常操作下,也只會加載kernel32.dll幾個正常被需要函數,放在導入表內,但我們的shellcode需要使用kernel32.dll裡面其他的函數,所以我們就需要去導出表挖出想要的函數。 首先,我們找到kernel32.dll的基址在7c800000,看一下PE大體架構:             1. 首先從7c800000+0x00開始就是整個PE文件結構,PE文件結構一開始是DOS頭結構,DOS Header是早期DOS作業系統下使用的,現在...

buffer_overflow 第3章 筆記3 抓取kernel32.dll基址

圖片
本節:shellcode 自行加載需要的dll 在前面的例子中 列出兩種編譯器所加載的dll,可以發現kernel32.dll 跟ntdll.dll都有被載入。 策略: kernel32.dll是系統重要得dll,假設他一定會被載入,kernel32.dll中有一個LoadLibraryA的函數,可以加載其他的dll,我們要利用LoadLibraryA來載入msvcrt.dll,找到msvcrt.dll之後,在找到msvcrt.dll裡面的函數 printf() 和 exit()完成打印Hello, world! 並 使用exit()離開程式。 1.先找到kernel32.dll的基址 2.找到kernel32.dll裡面的函數LoadLibraryA 3.利用函數LoadLibraryA載入msvcrt.dll 4.再從msvcrt.dll找到函數 printf() 和 exit() 我們需要shellcode幹上面這些事 小知識: 1. 程式在視窗作業系統下執行時,該程式底下的執行緒會被作業系統已一個資料結構TEB來表示。 2. 程式在視窗作業系統下執行時,作業系統也會保留一個特殊資料結構來代表這一程序,此資料結構稱為PEB。 3. FS是一個區段暫存器,程式在執行時,FS會指向TEB這個結構。 但由於區段暫存器執行速度比較慢,所以 TEB結構 偏移0x00 剛好是NT_TIB結構,NT_TIB結構下偏移0x18 有個成員self 。 4. 我們可以用WinDbg來觀察windows的內部結構,不過在輸入指令時如果出現: ************************************************************************* ***                                                    ...