zoukankan      html  css  js  c++  java
  • 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函数!

  • 相关阅读:
    HDU-4726 Kia's Calculation 贪心
    HDU-4725 The Shortest Path in Nya Graph 最短路
    HDU-4722 Good Numbers 数位DP
    HDU-4720 Naive and Silly Muggles 圆的外心
    golang-mysql
    golang web
    golang接口
    golang对象
    亲测可用的golang sql例程与包管理
    golang-练习3
  • 原文地址:https://www.cnblogs.com/zy1111/p/6221201.html
Copyright © 2011-2022 走看看