系列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下面一切正常啊。 ====================== 其怪,今天重新编译又没有问题了。。。。 |
|