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;
      }
    

分析过程

  1. 编译,产生32位汇编,进入gdb调试

  2. 在main处设置断点break main,运行r,停在main,用disassemble获取汇编代码

  3. 读取主函数的栈基址(0xffffd088)

  4. 依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
    1、使用si指令单步跟踪一条机器指令
    2、使用i r(info registers)指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
    3、使用x/na %esp对应的值指令查看堆栈变化

将上一个函数的基址入栈,从当前%esp开始作为新基址:

  1. call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:


  2. 先为传参做准备:



  1. 将栈中的数据push

  2. leave返回准备栈

  3. ret结束main函数!

原文地址:https://www.cnblogs.com/zy1111/p/6221201.html