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函数!

最新文章

  1. Mongodb集群搭建的三种方式
  2. oracle 职业学习指引
  3. canvas学习之制作动画
  4. ctrl+enter提交留言
  5. 架构设计--逻辑层 vs 物理层
  6. 关于HTTP协议的学习
  7. CTE Recursion Performance
  8. c语言结构体5之匿名结构体
  9. ps aux 中的状态说明
  10. 数值分析1:三角函数的计算(C语言实现)
  11. mysql 数据备份
  12. POJ 2594 Treasure Exploration(最小路径覆盖变形)
  13. Castle.DynamicProxy Part 1: ClassProxy
  14. HDU--1301--Jungle Roads(最小生成树)
  15. System.Uri类 - 获取Url的各种属性,文件名,参数,域名,端口等等
  16. .Net中的AOP系列之《AOP实现类型》
  17. 给负载均衡器添加多IP
  18. C# Excel行高、列宽、合并单元格、单元格边框线、冻结
  19. B-number 数位dp
  20. 云笔记项目-网页端debug功能学习

热门文章

  1. 【c++】虚基类
  2. python环境
  3. VUE 入门基础(2)
  4. Windows 2008 server IIS 7 中开启CGI, ISAPI
  5. convert return char from sql server 2008 r2 or below version to c#
  6. PRML
  7. java.lang.IllegalStateException: Couldn&#39;t read row 1, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data fr
  8. U-boot中的FDT
  9. Types of Learning
  10. excel中的TEXT函数