通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>JAVA编程>>正文 新版上线![旧版]
注:打开慢时请稍等

java缓冲区溢出编程心得

http://www.iyit.net  日期:2006-10-13 10:54:47  来源:  点击:
参加讨论】    前言:网上关于缓冲区溢出的资料也有很多,但我在阅读过程中发现介绍的都不是很明了,而且各网站也只是转贴老外的那篇译文而已,不仅内容有缺损,而且程序也无法调通,因为GCC版本不一样.经过几天的琢磨,终于明白了真正的原理,特地写出来分享. 

    测试环境:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-24)

$ gdb -v
GNU gdb Red Hat Linux (6.0post-0.20031117.6rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".

$ uname -a
Linux candy 2.4.21-9.EL #1 Thu Jan 8 17:03:13 EST 2004 i686 athlon i386 GNU/Linux
   实例:
   网上和我的这个实例雷同的也有,但是他们的是无法正确实现的.因为关键的跳转代码没有计算正确.(GCC版本问题,呵呵)
/************
* a.c
************/
void function(void)
{
char buffer[5];
int* ret;

ret=buffer+28;
(*ret)+=10;
}

void main()
{
int x;

x=0;
function();

x=1;
printf("%d\n",x);

return;
}
/*end*/
   懂C语言的人都会认为最后的输出结果是1,可惜输出结果为0.为什么呢?请听解释.

   实例分析:
相关堆栈的基础知识我就不罗嗦了,网上的介绍很多.
关键问题在于如何确定源代码
ret=buffer+28;
(*ret)+=10;
中的28 和 10
编译(会有warning,不用管他.)
$gcc -g -o a a.c //加上-g 用来在gdb中调试

$gdb a
(gdb)disas main //得到反汇编代码 如下:
Dump of assembler code for function main:
0x08048366 <main+0>: push %ebp
0x08048367 <main+1>: mov %esp,%ebp
0x08048369 <main+3>: sub $0x8,%esp
0x0804836c <main+6>: and $0xfffffff0,%esp
0x0804836f <main+9>: mov $0x0,%eax
0x08048374 <main+14>: sub %eax,%esp
0x08048376 <main+16>: movl $0x0,0xfffffffc(%ebp)
0x0804837d <main+23>: call 0x8048348 <function>
0x08048382 <main+28>: movl $0x1,0xfffffffc(%ebp)
0x08048389 <main+35>: sub $0x8,%esp
0x0804838c <main+38>: pushl 0xfffffffc(%ebp)
0x0804838f <main+41>: push $0x8048474
0x08048394 <main+46>: call 0x8048288
0x08048399 <main+51>: add $0x10,%esp
0x0804839c <main+54>: leave
0x0804839d <main+55>: ret
End of assembler dump.

(gdb)disas function
Dump of assembler code for function function:
0x08048348 <function+0>: push %ebp
0x08048349 <function+1>: mov %esp,%ebp
0x0804834b <function+3>: sub $0x28,%esp
0x0804834e <function+6>: lea 0xffffffe8(%ebp),%eax
0x08048351 <function+9>: add $0x1c,%eax
0x08048354 <function+12>: mov %eax,0xffffffe4(%ebp)
0x08048357 <function+15>: mov 0xffffffe4(%ebp),%edx
0x0804835a <function+18>: mov 0xffffffe4(%ebp),%eax
0x0804835d <function+21>: mov (%eax),%eax
0x0804835f <function+23>: add $0xa,%eax
0x08048362 <function+26>: mov %eax,(%edx)
0x08048364 <function+28>: leave
0x08048365 <function+29>: ret
End of assembler dump.
    可以得知当main中执行 0x0804837d <main+23>: call 0x8048348 < function> 时 会将下一条指令的地址保存在堆栈中. 即 0x08048382 我们的目的就是要想这个值修改成下一条指令的地址 0x08048389 这样就达到了屏蔽 x=1 这条语句了. 关键问题在于如何寻找保存0x08048382这个值的地址....

本新闻共2页,当前在第1页  1  2  


编辑: [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:完美解决一个事件激活多个函数(2)
下一篇:从XML到Java代码的数据绑定之创建类
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
从XML到Java代码的数据绑定之创建类 php里怎么实现javascript的unescape函数 有谁知道去除一个文本中的所有空格,用
初学Javascript之cookie篇(译) JavaScript对象与数组参考大全 用Javascript 实现的Dual listbox
javascript版的日期输入控件 用 JavaScript 来操作字符串 一个非常实用的Javascript类库
如何利用IE进行JavaScript脚本调试 JavaScript常用检测脚本 javascript 经典函数
Email地址加密javascript版 JavaScript方法和技巧大全 搜索引擎页面分析中的 javascript 处理
[JAVA]十四种Java开发工具点评 初学java常用开发工具介绍 Java编程中更新XML文档的常用方法
用Java实现HTTP文件队列下载 Singleton在Java中的应用 Java学习从入门到精通 4方法篇
Java学习从入门到精通 2书籍篇 Java学习从入门到精通 3过程篇 [基础知识]JAVA是什么
最新更新 热点排行 推荐新闻
从XML到Java代码的数据绑定之创建类
java缓冲区溢出编程心得
完美解决一个事件激活多个函数(2)
初学Javascript之cookie篇(译)
JavaScript对象与数组参考大全
我的QQ被盗走的原因分析
WebQQ好玩不?大鸟带你一起体验
奇奇怪怪的QQ密技十五招
QQ被盗到出售过程详解
微软WinXP SP3再次跳票 推至08年发布
Google苹果合作浏览器 防恶意网站
微软操作系统实现开源?
网管应当如何管理Windows操作系统?
让Windows XP系统锁定期间拒绝关机
WindowsVista中文版11月30日正式发布
从XML到Java代码的数据绑定之创建类
java缓冲区溢出编程心得
完美解决一个事件激活多个函数(2)
初学Javascript之cookie篇(译)
JavaScript对象与数组参考大全
合并VCD片断、快速删除文件夹--DOS命令
DOS教程 DOS命令基础应用
低格、分区、高格的应对--DOS命令应用
破解QQ密码如此简单 
一劳永逸--批处理命令(一)
QQ2006 Beta3隆重发布 实用功能一一奉
美国微软总部相中重庆15岁网络奇才(图
QQ号码激活的常见问题及案例分析 
SQL Server安装文件挂起错误解决办法
三分钟让你的系统变处女:Acronis Tru
给年轻工程师的“十大忠告” 
vbscript和javascript互相调用 
我的QQ被盗走的原因分析
WebQQ好玩不?大鸟带你一起体验
奇奇怪怪的QQ密技十五招
QQ被盗到出售过程详解
Google苹果合作浏览器 防恶意网站
网管应当如何管理Windows操作系统?
让Windows XP系统锁定期间拒绝关机
WindowsVista中文版11月30日正式发布
Google优化网站管理员指导方针
Hilltop算法- 探索Google排名新算法

vbscript和javascript

设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息