获取ESP地址的疑惑
编个程序获取ESP地址并打印,但是用GDB调试的结果却和单独执行程序的结果不一样。请问这是为什么,测试程序如下:
- long get_esp()
- {
- __asm__("movl %esp,%eax");
- }
- main()
- {
- long esp;
- esp = get_esp();
- printf("%x\n",esp);
- }
- (gdb) disassemble main
- Dump of assembler code for function main:
- 0x080483ab <main+0>: lea 0x4(%esp),%ecx
- 0x080483af <main+4>: and $0xfffffff0,%esp
- 0x080483b2 <main+7>: pushl 0xfffffffc(%ecx)
- 0x080483b5 <main+10>: push %ebp
- 0x080483b6 <main+11>: mov %esp,%ebp
- 0x080483b8 <main+13>: push %ecx
- 0x080483b9 <main+14>: sub $0x24,%esp
- 0x080483bc <main+17>: call 0x80483a4 <get_esp>
- 0x080483c1 <main+22>: mov %eax,0xfffffff8(%ebp)
- 0x080483c4 <main+25>: mov 0xfffffff8(%ebp),%eax
- 0x080483c7 <main+28>: mov %eax,0x4(%esp)
- 0x080483cb <main+32>: movl $0x80484b0,(%esp)
- 0x080483d2 <main+39>: call 0x80482b8 <printf@plt>
- 0x080483d7 <main+44>: add $0x24,%esp
- 0x080483da <main+47>: pop %ecx
- 0x080483db <main+48>: pop %ebp
- 0x080483dc <main+49>: lea 0xfffffffc(%ecx),%esp
- 0x080483df <main+52>: ret
- End of assembler dump.
- (gdb) r
- Starting program: /kernelwork/bats-linux/overflow/muyin/testesp
- bfffe358
- Program exited with code 011.
复制代码
- [root@localhost muyin]# ./testesp
- bfffe3a8
复制代码
谢谢~~~
[ 本帖最后由 ruger 于 2008-8-23 16:30 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
每个程序分配情况不一样吧 栈底总在小于0xc0000000 的地方吧
同一个程序,在同一个终端中运行结果都是一样的,但是在GDB调试的时候执行结果是不同的,你的意思是gdb对程序的地址产生了一定的影响?
这样看栈指针恐怕不行吧。
版主教我~~~
gcc -S 之后对着汇编码自己琢磨琢磨,呵呵
你的get_esp不过是个普通函数,而且是外部的函数,那么别的函数调用这个函数的时候,你觉得会和调用别的函数有什么区别吗?
[ 本帖最后由 cjaizss 于 2008-8-23 15:13 编辑 ]
复制代码
我查了一下#APP和#NOAPP啥意思,看样子是没有多大关系的:
The “#APP” and “#NO_APP” parts are instructions to the assembler that briefly put it into
normal operating mode, as opposed to the special high-speed “compiler output” mode that
turns off every feature that the compiler doesn’t use as well as a lot of error-checking. For
our purposes, it’s convenient becuase it highlights the part of the code we’re interested in.
版主的意思是这样获取的ESP指针应该是实际想要获得的减少了4?因为get_sp()是在将EBP压栈后的结果,因此少了4个数?但是我用gdb调试的结果确和单独执行差了0x50啊?
[ 本帖最后由 ruger 于 2008-8-23 16:36 编辑 ]
#define get_esp() ({ int reg; __asm__("movl %esp,%0\n\t" : "=r"(reg); reg; })