20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
分析的c语言源码

生成汇编代码——命令:gcc -g example.c -o example -m32
进入gdb调试,先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码:

通过info registers查看使用的寄存器:

此时主函数的栈基址为0xffffd038,用x(examine)指令查看内存地址中的值,目前%esp所指堆栈内容为0,%ebp所指内容也为0:

Step6:使用display /i $pc可查看当前执行的汇编代码,通过e(x)amine /nfu可查看寄存器的地址以及栈中的值
过程:
·第一步:

·push 0x2:

·call将下一条指令的所在地址(即当时程序计数器PC的内容)入栈:

·push %ebp:

·mov %esp,%ebp:

·pushl 0x8(%ebp):

·call指令将下一条指令的地址入栈:

·push %ebp:

·mov %esp,%ebp:

·mov 0x8(%ebp),%eax:

·add $0x1,%eax:(计算)

·pop %ebp——将栈顶弹到%ebp中:

·ret_返回g中call的调用位置:

·add $0x4,%esp:

·leave返回准备栈:

·ret:

·add $0x4,%esp:

·add $0x3,%eax:

%eip,%ebp,%esp,%eax的值和堆栈的变化情况
| 序号 | 汇编代码 | %eip | %ebp | %esp | %eax | 堆帧 |
|---|---|---|---|---|---|---|
| 1 | 0x80483f9 | 0xffffd038 | 0xffffd038 | 0xf7fb7dbs | 0x0 | |
| 2 | push $0x2 | 0x80483fb | 0xffffd038 | 0xffffd034 | 0xf7fb7dbc | 0x2 |
| 3 | call | 0x80483e6 | 0xffffd038 | 0xffffd030 | 0xf7fbdbc | 0xffffd034 0x2 |
| 4 | push %ebp | 0x80483e7 | 0xffffd038 | 0xffffd02c | 0xf7fb7dbc | 0xffffd038 0x8048400 0x2 |
| 5 | mov %esp,%ebp | 0x80483e9 | 0xffffd02c | 0xffffd02c | 0xf7fb7dbc | 0xffffd038 0x8048400 0x2 |
| 6 | pushl 0x8(%ebp) | 0x80483ec | 0xffffd02c | 0xffffd028 | 0xf7fb7dbc | 0x2 0xffffd038 0x8048400 0xffffd034 0x2 |
| 6 | call | 0x80483db | 0xffffd02c | 0xffffd024 | 0xf7fb7dbc | 0x80483f1 0x2 0xffffd038 0x8048400 0xffffd034 0x2 |
| 7 | push %ebp | 0x80483dc | 0xffffd02c | 0xffffd020 | 0xf7fb7dbc | 0xffffd02c 0x80483f1 0x2 0xffffd038 0xffffd030 0x8048400 0x2 |
| 8 | mov %esp,%ebp | 0x80483de | 0xffffd020 | 0xffffd020 | 0xf7fb7dbc | 0xffffd020 0xffffd02c 0x80483f1 0x2 0xffffd038 0xffffd030 0x8048400 0x2 |
| 9 | mov 0x8(%ebp),%eax | 0x80483e1 | 0xffffd020 | 0xffffd020 | 0x2 | 0xffffd020 0xffffd02c 0x80483f1 0x2 0xffffd038 0xffffd030 0x8048400 0x2 |
| 10 | add $0x1,%eax | 0x80483e4 | 0xffffd020 | 0xffffd020 | 0x3 | 0xffffd020 0xffffd02c 0x80483f1 0x2 0xffffd038 0xffffd030 0x8048400 0x2 |
| 11 | pop %ebp | 0x80483e5 | 0xffffd02c | 0xffffd024 | 0x3 | 0xffffd024 0x80483f1 0x2 0xffffd038 0x8048400 0xffffd034 0x2 |
| 12 | ret | 0x80483f1 | 0xffffd02c | 0xffffd028 | 0x3 | 0xffffd028 0x2 0xffffd038 0x80448400 0x2 |
| 13 | add $0x4,%esp | 0x80483f4 | 0xffffd02c | 0xffffd02c | 0x3 | 0xffffd02c 0xfffd038 0x8048400 0x2 |
| 14 | leave | 0x80483f5 | 0xffffd038 | 0xffffd038 | 0x3 | 0xffffd030 0x8048400 0x2 |
| 15 | ret | 0x8048400 | 0xffffd038 | 0xffffd034 | 0x3 | 0x2 |
| 16 | add $0x4,%esp | 0x8048403 | 0xffffd038 | 0xffffd038 | 0x3 | 0x0 |
| 15 | add $0x3,5eax | 0x8048406 | 0xffffd038 | 0xffffd038 | 0x6 | 0x0 |