系列C++问题请教高手之九:buffer overflow
|
发表于:2007-10-24 13:41:51 楼主
|
近日走火入魔,看了一下bufferoverflow,在以下代码中:在VC6中打印出来的信息是:Addressoffunction:0x0040100f,但在LINUX中打印出来的提示却是段错误,请问应该怎么改? #include"string.h" #include"stdio.h"
intcopy(char*input) { return0; }
inthacked(void) { printf("Canyouseemenow?/n"); exit(0); }
voidmain(intargc,char*argv[]) { printf("Addressoffunction:0x%08x/n",hacked); exit(1); }
2、另外一个问题是: 在VC6中反汇编,结果如下:hacked()的地址貌似是:00401080,和打印出来的信息:Addressoffunction:0x0040100f不一样!!请高手指点!
19:inthacked(void) 20:{ 00401080pushebp 00401081movebp,esp 00401083subesp,40h 00401086pushebx 00401087pushesi 00401088pushedi 00401089leaedi,[ebp-40h] 0040108Cmovecx,10h 00401091moveax,0CCCCCCCCh 00401096repstosdwordptr[edi] 21:printf("Canyouseemenow?/n"); 00401098pushoffsetstring"AAAABBBBCCCCDDDDEEEE/x80/x10@"(0042001c) 0040109Dcallprintf(00401410) 004010A2addesp,4 22:exit(0); 004010A5push0 004010A7callexit(00401280) 23:} |
|
|
问题点数:20回复次数:19 显示所有回复
显示星级回复
显示楼主回复
|
|
<iframe id="Topic_Zone" style="HEIGHT: 4px" marginwidth="0" marginheight="0" src="/u/AD/Topic_Zone.aspx" frameborder="0" width="100%" scrolling="no" height="0"></iframe>
|
发表于:2007-10-24 13:48:001楼得分:0
|
00401080pushebp 00401081movebp,esp 00401083subesp,40h 00401086pushebx
前面这一排是EIP,不是函数地址。
打开你的调试器的寄存器,看EIP的变化~
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:01:042楼得分:0
|
00401080pushebp 00401081movebp,esp 00401083subesp,40h 00401086pushebx 前面这一排是EIP,不是函数地址。 打开你的调试器的寄存器,看EIP的变化~ ============================================= 有点不明白,EIP不就是函数地址吗?? 如果不是,那么函数的入口地址跟调用它执行代码时的EIP有什么关系? 请解答,谢谢!
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:08:003楼得分:0
|
1.大约是不是gcc把你的小函数给内联了?
2.你在debug模式下用vc跟踪汇编代码, 0x0040100fjmp00401080
而且release模式下就没有这个问题。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:44:134楼得分:0
|
关于第二个问题,有位二星专家裸体跪求过,见贴: http://topic.csdn.net/u/20070716/22/72161ea9-3635-4d17-830c-4334573d5408.html |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:47:175楼得分:0
|
1.大约是不是gcc把你的小函数给内联了? 2.你在debug模式下用vc跟踪汇编代码, 0x0040100fjmp00401080 ================================= 厉害,看了一下,果然是: 0x0040100fjmp00401080 对于1、这一点先不管它。。。 我现在:想做的一点是覆盖EIP,照着书上讲的意思,写了如下代码, intcopy(char*input) { charvar[20]; charchtocopy[24]="AAAABBBBCCCCDDDDEEEE/x80/x10/x40"; strcpy(var,chtocopy); // var[20]= '/x80 '; // var[21]= '/x10 '; // var[22]= '/x40 '; return0; } 请问运行结果为什么不正确? |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:55:226楼得分:0
|
函数的地址指向的实际上是一个跳转指令 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 14:59:527楼得分:0
|
Addressoffunction:0x0040100f是真正的函数地址。 比如说0x0040100f处的memory为e9d90a,它其实表示这样一条指令 jmp代码段首地址+0x00000ad9(也就是0x00401080) |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:00:448楼得分:0
|
关于第二个问题,有位二星专家裸体跪求过,见贴: http://topic.csdn.net/u/20070716/22/72161ea9-3635-4d17-830c-4334573d5408.html ===================================================== 谢谢! 第二个问题解决了,现在可以跳转到hacked()函数了。 但第一个问题gcc的问题,还不明白: 记得有个保留字可以禁止编译器优化代码--就是没用的变量也留着。。。那个关键字是什么写着?请问:) |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:07:219楼得分:0
|
gcc编译器用的比较少。 有时间访问一下www.devdiv.net吧 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:13:4210楼得分:0
|
Addressoffunction:0x0040100f是真正的函数地址。 比如说0x0040100f处的memory为e9d90a,它其实表示这样一条指令 jmp代码段首地址+0x00000ad9(也就是0x00401080) ============================================ 明白,现在把 charchtocopy[28]="AAAABBBBCCCCDDDDEEEE/x80/x10/x40"; 改成charchtocopy[28]="AAAABBBBCCCCDDDDEEEEFFFF/x80/x10/x40";已经可以跳转了。
就是Linux下GCC的那个问题没解决,不知道为什么。。。。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:14:3711楼得分:0
|
gcc编译器用的比较少。 有时间访问一下www.devdiv.net吧 ============================== 好的,这个网站做什么的? |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:16:5512楼得分:0
|
在VC中,只要把debuginformationformat设置成ProgramDatabase(/Zi)就不会有这么一个jmp了。 release模式下,已经默认设置为ProgramDatabase(/Zi),所以没有jmp问题 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:26:1613楼得分:0
|
gcc编译器用的比较少。 有时间访问一下www.devdiv.net吧 ======================================= 看了,你做的B
在VC中,只要把debuginformationformat设置成ProgramDatabase(/Zi)就不会有这么一个jmp了。 release模式下,已经默认设置为ProgramDatabase(/Zi),所以没有jmp问题BS? ======================================================================================== 好的,谢谢。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 15:26:5014楼得分:0
|
贴个GCC反汇编出来的看看。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 16:25:5015楼得分:0
|
贴个GCC反汇编出来的看看。 ================================== .file "Cpp1.cpp" .section .rodata .LC0: .string "AAAABBBBCCCCDDDDEEEEFFFF/200/020@" .text .align2 .globl_Z4copyPc .type _Z4copyPc,@function _Z4copyPc: .LFB2: pushl %ebp .LCFI0: movl %esp,%ebp .LCFI1: pushl %edi .LCFI2: pushl %esi .LCFI3: subl $64,%esp .LCFI4: leal -72(%ebp),%edi movl $.LC0,%esi cld movl $7,%eax movl %eax,%ecx rep movsl subl $8,%esp leal -72(%ebp),%eax pushl %eax leal -40(%ebp),%eax pushl %eax .LCFI5: call strcpy addl $16,%esp movl $0,%eax leal -8(%ebp),%esp popl %esi popl %edi leave ret .LFE2: .Lfe1: .size _Z4copyPc,.Lfe1-_Z4copyPc .section .rodata .LC1: .string "Canyouseemenow?/n" .text .align2 .globl_Z6hackedv .type _Z6hackedv,@function _Z6hackedv: .LFB4: pushl %ebp .LCFI6: movl %esp,%ebp .LCFI7: subl $8,%esp .LCFI8: subl $12,%esp pushl $.LC1 .LCFI9: call printf addl $16,%esp subl $12,%esp pushl $0 call exit .LFE4: .Lfe2: .size _Z6hackedv,.Lfe2-_Z6hackedv .section .rodata .LC2: .string "Addressoffunction:0x%08x/n" .text .align2 .globlmain .type main,@function main: .LFB6: pushl %ebp .LCFI10: movl %esp,%ebp .LCFI11: subl $8,%esp .LCFI12: andl $-16,%esp movl $0,%eax subl %eax,%esp subl $12,%esp movl 12(%ebp),%eax addl $4,%eax pushl (%eax) .LCFI13: call _Z4copyPc addl $16,%esp subl $8,%esp pushl $_Z6hackedv pushl $.LC2 call printf addl $16,%esp subl $12,%esp pushl $1 call exit .LFE6: .Lfe3: .size main,.Lfe3-main .ident "GCC:(GNU)3.2.220030222(RedHatLinux3.2.2-5)"
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-24 16:26:5216楼得分:0
|
贴个GCC反汇编出来的看看。 ================================== C源代码如下: #include"stdlib.h" #include"string.h" #include"stdio.h" intcopy(char*input) { charvar[20]; charchtocopy[28]="AAAABBBBCCCCDDDDEEEEFFFF/x80/x10/x40"; strcpy(var,chtocopy); return0; } inthacked(void) { printf("Canyouseemenow?/n"); exit(0); }
intmain(intargc,char*argv[]) { copy(argv[1]); printf("Addressoffunction:0x%08x/n",hacked); exit(1); return0; }
|
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-27 12:00:4317楼得分:0
|
请大家说说以下这段代码: inthacked(void) { printf("Canyouseemenow?/n"); exit(0); }
intmain(intargc,char*argv[]) { printf("Addressoffunction:0x%08x/n",hacked); exit(1); return0; } 在Linux下运行出现段错误的问题啊。。。谢谢! |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-27 14:02:4018楼得分:0
|
我的在linux下面一切正常啊。 |
|
<!-- <span>预留的文字链广告位</span> //-->
|
|
|
发表于:2007-10-29 14:50:0019楼得分:0
|
我的在linux下面一切正常啊。 ====================== 其怪,今天重新编译又没有问题了。。。。 |
|
分享到:
相关推荐
编程高手之路—vb、C、C++、API、批处理系列教程汇总
鸡啄米:C++编程入门系列之九(函数的定义与调用) 鸡啄米:C++编程入门系列之十(函数的参数传递与内联函数) 鸡啄米:C++编程入门系列之十一(重载函数与函数模板) 第四部分:类与对象 鸡啄米:C++编程入门...
如果你在找一个环形buffer这就是你想要的了。使用场景为一个线程写一个线程读完全不需要锁。可以设定buffer的初始块及数量,初始块是固定大小的,当需要扩环时会动态创建块即不像其它的库块满了就写失败了,当释放时...
可能的问题在于,多次申请的问题,经过测试基本可以用。 方法2: 1、使用默认缓存5M 2、默认线程使用的内存为128K,即最多默认支持40个线程 3、初始化申请一块5M内存,然后进行分割,线程使用的定义为GROUP,没...
问题请教高手问题请教高手
C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++
C++ 11 ,thread ,atomic ,mutex ,condition_variable 。 程序特性: 1.每个实例支持读写双线程。 2.数据一致。 3.ringbuffer为空时,读取时候等待。直到有数据写入,再继续读取。 4.当写入数据的长度大于ring...
源代码+工具(包括win32的)
Algorithms in C++, Parts 1-4: Fundamentals, Data Structures, Sorting, Searching(3rd Edition)英文版
Thinking in C: Foundations for Java & C++ by Chuck Allison produced by Bruce Eckel Chapter 1: Introduction and Getting Started40 MinutesStart Lecture Chapter 2: Fundamental Data Types41 ...
最新版本CodeBlocks20.03版(支持C++20标准):一款中量级的IDE集成开发工具,适合小白入门,高手进阶,但最新版似乎调试有些问题。本压缩包解决了新版本调试自动退出问题,特此声明,此压缩包仅此一家(解决CodeBlocks...
C++多线程内存池和简单的BUFFER类。C++多线程内存池和简单的BUFFER类
如果你还在为win7系统装不上Visual+C+++6.0而烦恼,就下载这个吧,因为我也烦恼过,但终于装上了,欢迎大家下载。
将Buffer实例转换为“指针” 该模块的灵感来自于node-ffi中的旧Pointer类,但其目的是使用Node的快速Buffer实例而不是慢速的C ++ Pointer类。 这两个概念以前非常相似,但是现在这个模块带来了Pointers拥有的功能,...
C++领域的经典书籍; C++标准委员会主席力作 久负盛名的Exceptional系列之一
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和...
假定读者已经具备C++基本知识,本书通过展示C++语言风格和习惯用法,帮助读者提升C++的程序设计经验。这些方法是围绕C++支持的抽象机制实施的:抽象数据类型,继承结构中的组合类型,面向对象程序设计以及多重继承。...
数据库功能模拟Storage and Buffer Manager C++实现
C++高效编程:内存与性能优化(pdf版),深入C++经典好书!