20145318 GDB调试汇编堆栈分析
20145318 GDB调试汇编堆栈分析
-
代码
#include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long addend3 = 3; static int g(int x) { return x + addend1; } static const int f(int x) { return g(x + addend2); } int main(void) { return f(8) + addend3; }
分析过程
-
编译,产生32位汇编,进入gdb调试
-
在main处设置断点
break main
,运行r
,停在main,用disassemble
获取汇编代码
-
读取主函数的栈基址(0xffffd088)
-
依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
1、使用si指令单步跟踪一条机器指令
2、使用i r(info registers)指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
3、使用x/na %esp对应的值指令查看堆栈变化
将上一个函数的基址入栈,从当前%esp开始作为新基址:
-
call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:
-
先为传参做准备:
-
将栈中的数据push
-
leave返回准备栈
-
ret结束main函数!
posted on 2016-12-26 09:07 20145318赵一 阅读(86) 评论(0) 编辑 收藏 举报