我正在为课程作业进行堆叠式练习,我已完成作业,但有一个方面我不明白.@H_403_2@
这是目标计划:@H_403_2@
@H_403_2@
#include dio.h>
#include
以下是在运行Ubuntu 12.04且禁用ASLR的x86虚拟机上编译它的命令.@H_403_2@
@H_403_2@
gcc -ggdb -m32 -g -std=c99 -D_GNU_SOURCE -fno-stack-protector -m32 target1.c -o target1
execstack -s target1
当我在堆栈上查看该程序的内存时,我看到buf的地址为0xbffffc40.此外,保存的帧指针存储在0xbffffd48,返回地址存储在0xbffffd4c.@H_403_2@
这些特定地址不相关,但我观察到即使buf只有256长度,距离0xbffffd48 – 0xbffffc40 = 264.符号上,这个计算是$fp – buf.@H_403_2@
为什么buf的结尾和堆栈中存储的帧指针之间有8个额外的字节?@H_403_2@
这是函数foo的一些反汇编.我已经检查了它,但我没有看到该内存区域的任何明显用法,除非它是隐含的(即某些指令的副作用).@H_403_2@
@H_403_2@
0x080484ab <+0>: push %ebp
0x080484ac <+1>: mov %esp,%ebp
0x080484ae <+3>: sub $0x118,%esp
0x080484b4 <+9>: mov 0x8(%ebp),%eax
0x080484b7 <+12>: add $0x4,%eax
0x080484ba <+15>: mov (%eax),%eax
0x080484bc <+17>: lea -0x108(%ebp),%edx
0x080484c2 <+23>: mov %edx,0x4(%esp)
0x080484c6 <+27>: mov %eax,(%esp)
0x080484c9 <+30>: call 0x804848c
最佳答案