`
xitongyunwei
  • 浏览: 925330 次
文章分类
社区版块
存档分类
最新评论

系列C++问题请教高手之九:buffer overflow

 
阅读更多
系列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> //-->
  • loops
  • 等 级:
发表于:2007-10-24 14:08:003楼得分:0
1.大约是不是gcc把你的小函数给内联了?

2.你在debug模式下用vc跟踪汇编代码,
0x0040100fjmp00401080

而且release模式下就没有这个问题。
<!-- <span>预留的文字链广告位</span> //-->
  • loops
  • 等 级:
发表于: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> //-->
  • loops
  • 等 级:
发表于: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> //-->
  • loops
  • 等 级:
发表于:2007-10-27 14:02:4018楼得分:0
我的在linux下面一切正常啊。
<!-- <span>预留的文字链广告位</span> //-->
发表于:2007-10-29 14:50:0019楼得分:0
我的在linux下面一切正常啊。
======================
其怪,今天重新编译又没有问题了。。。。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics