![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588chengxu.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
进程
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
文本区域是由
![](/icons/92588chengxu.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588cuowu.gif)
![](/icons/92588dou2.gif)
数据区域包含了已
![](/icons/92588chushi.gif)
![](/icons/92588chushi.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588dou2.gif)
/------------------\ 内存低地址
| |
| 文本 |
| |
|------------------|
| (已
![](/icons/92588chushi.gif)
| 数据 |
| (未
![](/icons/92588chushi.gif)
|------------------|
| |
| 堆栈 |
| |
\------------------/ 内存高地址
堆栈是
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
为什么要使用堆栈?
![](/icons/92588yi.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588chengxu.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
堆栈也用于给
![](/icons/92588hanshu.gif)
![](/icons/92588de.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588dou2.gif)
堆栈区详解
堆栈是
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
堆栈由逻辑堆栈帧组成
![](/icons/92588dou2.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588dou2.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588de.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
堆栈既可以向下增长(向内存低地址)也可以向上增长, 这依赖于具体
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
除了堆栈指针(SP指向堆栈顶部
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588int.gif)
![](/icons/92588dou2.gif)
![](/icons/92588dou2.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
因此, 许多编译器使用第 2个寄存器, FP, 对于局部变量和
![](/icons/92588hanshu.gif)
![](/icons/92588yinwei.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
当
![](/icons/92588yi.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
这里利用了
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
译后
![](/icons/92588de.gif)
![](/icons/92588dou.gif)
![](/icons/92588dou.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
序
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
------------------------------------------------------------------
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
example1.c:
------------------------------------------------------------------
void function(
![](/icons/92588int.gif)
![](/icons/92588int.gif)
![](/icons/92588int.gif)
char buffer1[5];
char buffer2[10];
}
void
![](/icons/92588main.gif)
![](/icons/92588kh.gif)
function(1,2,3);
}
------------------------------------------------------------------
使用gcc
![](/icons/92588de.gif)
$ gcc -S -o example1.s example1.c
通过查看汇编语言输出, 我们看到对function
![](/icons/92588kh.gif)
![](/icons/92588de.gif)
![](/icons/92588diaoyong.gif)
pushl $3
pushl $2
pushl $1
call function
以从后往前
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588kh.gif)
![](/icons/92588dou2.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
pushl ëp
movl %esp,ëp
subl $20,%esp
将帧指针EBP压入栈中
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
内存只能以字为单位寻址
![](/icons/92588dou2.gif)
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588kh.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
内存低地址 内存高地址
buffer2 buffer1 sfp ret a b c
<------ [ ][ ][ ][ ][ ][ ][ ]
堆栈顶部 堆栈底部
制造缓冲区溢出
现在试着修改我们第
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
![](/icons/92588zhk2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588zhk2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588zhk2.gif)
![](/icons/92588dou2.gif)
![](/icons/92588zhk2.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588hanshu.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
example3
![](/icons/92588dou2.gif)
--------------------------------------------------------------------
void function(
![](/icons/92588int.gif)
![](/icons/92588int.gif)
![](/icons/92588int.gif)
char buffer1[5];
char buffer2[10];
![](/icons/92588int.gif)
ret = buffer1 + 12;
(*ret)
![](/icons/92588jiadeng.gif)
}
void
![](/icons/92588main.gif)
![](/icons/92588kh.gif)
![](/icons/92588int.gif)
x = 0;
function(1,2,3);
x = 1;
pr
![](/icons/92588int.gif)
}
-------------------------------------------------------------------
我们把buffer1
![](/icons/92588zhk2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588int.gif)
![](/icons/92588diaoyong.gif)
![](/icons/92588dou2.gif)
如何知道应该给返回地址加8个字节呢? 我们先前使用过
![](/icons/92588yi.gif)
![](/icons/92588chengxu.gif)
-----------------------------------------------------------------
[aleph1]$ gdb example3
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions
![](/icons/92588dou2.gif)
There is absolutely no warranty for GDB; type "show warranty" for details
![](/icons/92588dou2.gif)
GDB 4
![](/icons/92588dou2.gif)
(no debugging symbols found)...
(gdb) disassemble
![](/icons/92588main.gif)
Dump of assembler code for function
![](/icons/92588main.gif)
0x8000490 : pushl ëp
0x8000491 : movl %esp,ëp
0x8000493 : subl $0x4,%esp
0x8000496 : movl $0x0,0xfffffffc(ëp)
0x800049d : pushl $0x3
0x800049f : pushl $0x2
0x80004a1 : pushl $0x1
0x80004a3 : call 0x8000470
0x80004a8 : addl $0xc,%esp
0x80004ab : movl $0x1,0xfffffffc(ëp)
0x80004b2 : movl 0xfffffffc(ëp),êx
0x80004b5 : pushl êx
0x80004b6 : pushl $0x80004f8
0x80004bb : call 0x8000378
0x80004c0 : addl $0x8,%esp
0x80004c3 : movl ëp,%esp
0x80004c5 : popl ëp
0x80004c6 : ret
0x80004c7 : nop
------------------------------------------------------------------
我们看到当
![](/icons/92588diaoyong.gif)
![](/icons/92588kh.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588de.gif)
![](/icons/92588de.gif)
![](/icons/92588dou2.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
![](/icons/92588yi.gif)
![](/icons/92588de.gif)
最新评论