蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 | -->
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程 -->


    

蓝森林 http://www.lslnet.com 2006年8月16日 14:08

如何得到全局变量在堆栈中的地址?

有以下一段程序:
char code[]="aaaaaaaaaa";
int main(int argc,char** argv)
{
unsigend int codeaddr;
//计算code在堆栈中的地址
codeaddr=0xc0000000-4-(strlen(code)+1);
}
但我觉得这样计算出来的好象不对,我用redhat7.3,kdevelop2.1。
1。不知这段程序中0xc0000000是不是表示堆栈的基地址?但在redhat7.3中堆栈的基地址好象不是0xc0000000。
2。不知这段程序如何改正才能在redhat7.3中正确计算出code在堆栈中的地址?


Re: 如何得到全局变量在堆栈中的地址?

不明白你想干啥.
如果你只是想得到code的地址,为什么不直接printf("%p",code)呢?


Re: 如何得到全局变量在堆栈中的地址?

我是想通过堆栈中存放的数据得到code的地址。

Re: 如何得到全局变量在堆栈中的地址?

想再问个问题:
堆栈中存放的是该全局变量的地址还是全局变量的值(如本例中的字符a)?
(我觉得好象量全局变量的地址,不知对不对?)

Re: 如何得到全局变量在堆栈中的地址?

全局變量不放在堆棧里,放在數據段里
你那個程序很有意思,是你一個人寫的嗎?還是被別人改過?

Re: 如何得到全局变量在堆栈中的地址?

他取得那个是$_的的值

Re: 如何得到全局变量在堆栈中的地址?

但我跟踪程序时,发现堆栈中好象存入了全局变量的地址,不知全局变量的地址是否要存入堆栈中

Re: 如何得到全局变量在堆栈中的地址?

要清楚变量地址和变量的值是不同概念,你的问题翻译一下就是“全局变量的地址是否可以成为局部变量的值?”

Re: 如何得到全局变量在堆栈中的地址?

谢谢大家!
我再描述一下:

c程序:
char code[]="aaaaaaaaaa";
int main(int argc,char** argv)
{
unsigned int code=0;
}

在程序执行时观查到
ebp=0xbffffb88
esp=0xbfffffb80
code地址为&code=0x8049510

内存0xbffffb80开始的8字节数为(按字节显示):
0xbffffb80:0x1c 0x95 0x04 0x08 0x00 0x00 0x00 0x00
0xbffffb88:0xc8 0xfb 0xff 0xbf 0x99 0x74 0x01 0x42

问题:
1.ebp(0xbffffb88)是否为堆栈的起始地址?(堆栈反向生长)
2.地址(0xbffffb84---0xbffffb87)的4个0x00是什么?
3.地址(0xbffffb80---0xbffffb83)的0x1c 0x95 0x04 0x08 有什 么意义?

c程序运行在redhat7.3,kdevelop2.1下.


Re: 如何得到全局变量在堆栈中的地址?

你这样写谁都不清楚,你也没说是在那一步的时候看的积存器的值,其实这写都是很简单的东西,只要你对c堆栈的结构了解的话

Re: 如何得到全局变量在堆栈中的地址?

我在以下程序中画<<<<<处加的断点,观查到的值
char code[]="aaaaaaaaaa";
int main(int argc,char** argv)
{
unsigned int codeaddress=0; <<<<<<
}

谢谢!

Re: 如何得到全局变量在堆栈中的地址?

如果你没有执行那句话,那么*esp的内容是随机的,没有任何意义
如果你执行了那句话,*esp应该是0,至于为什么esp-ebp==8而不是4,那可能是不同的编译器有不同的方式,可能是对越界读写的一个小小的保护措施吧

Re: 如何得到全局变量在堆栈中的地址?

你到底要做什么?研究堆栈还是程序有问题?如果想研究的话建议你看看intel的开发手册的第一本,会有收获。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com