编写自己的缓冲区溢出利用程序
日期:2004年3月20日 作者:清风网络学院 查看:[大字体 中字体 小字体]-
|bffff856| 字符串"AAAAAAAA"在内存中的起始地址
0xbffff69c +--------+
|bffff6a0| vulFunc函数栈帧中分配的十二个字节起始地址
0xbffff698 +--------+ <-- vulFunc的当前esp
| ...... |
(内存低址)
我们注意到在vulFunc函数栈帧中所分配的那十二个字节, 从传递给strcpy函数的起始
地址处被我们所输入的八个'A'(十六进制0x41)填充了.
这是我们的第二个焦点.
同时也注意到, 内存地址0xbffff6a8所指向的四个字节的内容由原来的垃圾数据0xbffff6b8
变成了bffff600.
低字节的00应该就是字符串"AAAAAAAA"的零结尾字节.
所以得出结论: vulFunc函数栈帧中分配的那十二个字节是给局部变量buf(缓冲区)的.
这里会奇怪: 程序中buf缓冲区只定义了十个字节的大小, 为什么为它分配了十二个字
节? 原因是: 内存的分配是以四字节为单位的.所以十个字节(4+4+2)要用三个内存分
配单元, 3*4=12.
如果我们在命令行提供的字串长度为十(多两个字符, 刚好是程序中定义的缓冲区的大
小), 那么内存地址0xbffff6a8所指向的四个字节的内容将是bf004141; 如果增加到十
一个, 内存地址0xbffff6a8所指向的四个字节的内容为00414141, 刚好填满栈帧中分配
给buf的内存空间. 可以看出, 在命令行中提供的字串长度小于12, 程序是不会出错的.
现在让我们看看字串长度等于十二的情况, 这时0xbffff6a8所指向的四个字节的内存单
元已被41414141填满.0xbffff6ac所指向的四个字节的内存单元的低字节被00所填, 其内
容变为bffff600, 从上面的影像图可知: 这个内存单元里保存的是调用函数的ebp. 也就
是说, 当字串长度大于或等于十二时, 调用函数的ebp被复盖.
从进程的影像图可以看出, 要想全面复盖vulFunc函数的返回地址, 则字节串的长度至少
要二十(12+8)个字节.
我们继续分析后面的指令:
0x8048413 <vulFunc+19>: add $0x8,%esp ; 栈帧缩小8个字节--放弃了两个内存存储单元.
可以看到, 在调用strcpy前, 依次压了s和buf的地址入栈, 现在这条指令是把这两个地址抛弃.
所以可以得出, Linux x86系统在调用函数时(其实是编译器所生成的机器指令), 所传给
被调用函数的参数是由调用函数从右到左依次入栈的.
如现在的strcpy(buf, s), 首先是s先入栈, 然后是buf. 参数的出栈也由调用函数负责.
0x8048416 <vulFunc+22>: lea 0xfffffff4(%ebp),%eax - 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] 下一页
-
- 编写自己的缓冲区溢出利用程序 相关文章:
- ·编写自己的缓冲区溢出利用程序
- 编写自己的缓冲区溢出利用程序 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:UNIX 系统常用管理命令
下一篇:cookie欺骗教程
精品推荐
热点TOP10
- ·用c#监控网络流量
- ·C#编写的windows计算器-源代码
- ·C #中的几个线程同步对象方法
- ·飞机订票系统设计
- ·C/C++笔试、面试题目大汇总
- ·《俄罗斯方块》程序编写详解
- ·Windows API-GDI入门基础知识详解(2)
- ·socket编程原理
- ·打字游戏
- ·七年IT奋斗纪实及感悟
- ·牛顿和拉格朗日插值算法
- ·无废话C#设计模式之九:Proxy
- ·C#编程中的 New 关键词的几种用法
- ·实战开发 C# 索引器学习笔记
- ·VC++动态链接库编程之MFC扩展 DLL
- ·C# 操作文件
- ·如何用C#编写文本编辑器
- ·c#操作word表格
- ·编程特例篇——LOGO语言
- ·Raw Socket(原始套接字)实现Sniffer(嗅探)
特别推荐
- ·C#程序开发中的常用函数汇总
- ·C#数据库操作的三种经典用法
- ·C/C++笔试、面试题目大汇总
- ·Beej的网络socket编程指南
- ·socket编程原理
- ·C语言的常用库函数使用方法分析及用途
- ·在C语言中如何处理时间和日期
- ·C++设计模式之Singleton
- ·VC++动态链接库编程之MFC扩展 DLL
- ·TCP/IP网络重复型服务器通信软件的设计
- ·DirectX游戏开发入门
- ·经典与现代的结合:在MFC中集成RAD .NET框架
- ·Windows API-GDI入门基础知识详解(2)
- ·Visual C++ 入门精解
- ·C#基础概念二十五问
- ·用C#实现pdf文件的完整性验证
- ·成为嵌入式程序员应知道的0x10个问题
- ·TCP/IP编程实现远程文件传输
- ·几个C#编程的小技巧
- ·C# 编码规范和编程好习惯
