• GDB调试汇编堆栈


    GDB调试汇编堆栈

    准备工作

    • 终端编译工具:

      • 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386
    • 测试代码:

    分析过程

    • 1.生成汇编代码:gcc -g gdbtest.c -o gdbtest -m32
    • 2.调试:gdb test
    • 3.设置断点,因为目的是分析而不是调试bug,所以我们将断点设置在main函数
    • 4.开始gdb调试:r(un),如若想获取此时的汇编代码,可用指令:disassemble
    • 5.此时可以用指令查看寄存器的值:i(nfo) r(egisters),显示的格式为3列:

      • 第1列:寄存器名称
      • 第2列:寄存器的地址
      • 第3列:寄存器中存的值  
    • 6:结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化:

    过程(截图中的指令实际上是待执行指令)
    • 初始

    • push $0x7

    • call 0x80483e8  call调用f(0x80483e8)

    • push %ebp  执行f函数,f初始化帧指针,将上一个函数的基址入栈,将当前%esp作为新基址

    •  mov %esp,%ebp  分配栈空间,为传参做准备

    • pushl 0x8(%ebp)   将%esp中的8存入栈中

    • call 0x80483db  call调用g(0x80483db)

    • push %ebp  初始化栈指针

    • mov %esp,%ebp  分配栈空间

    • mov 0x8(%ebp),%eax  将8存入栈中

    • add $0x1336495,%eax   将 %eax 与立即数 20145301 相加

    • pop %ebp  %ebp在结束前弹栈

    • ret   返回调用位置,结束函数

    • add $0x4,%esp    将 %esp 与立即数 4 相加

    • leave   返回准备栈

    • ret  返回调用位置,结束函数

    • add $0x4,%esp  将 %esp 与立即数 4 相加

    • add $0x1,%eax  将 %eax 与立即数 1 相加

    对汇编代码进行分析

    寄存器分析

    main函数的开始到结束
    指令 %eip %esp %ebp %eax 堆栈 
    初始  0x80483fb 0xffffd068 0xffffd068 0xf7fbaddc
    push $0x7  0x80483fd 0xffffd064 0xffffd068 0xf7fbaddc 0x7
    call 0x80483e8 0x80483e8 0xffffd060  0xffffd068 0xf7fbaddc 0x8048402 0x7
    push %ebp  0x80483e9 0xffffd05c  0xffffd068 0xf7fbaddc 0xffffd068 0x8048402 0x7
    mov %esp,%ebp 0x80483eb 0xffffd05c 0xffffd05c 0xf7fbaddc 0xffffd068 0x8048402 0x7
    pushl 0x8(%ebp) 0x80483ee 0xffffd058 0xffffd05c 0xf7fbaddc 0x7 0xffffd068 0x8048402 0x7
    call 0x80483db 0x80483db 0xffffd054 0xffffd05c 0xf7fbaddc 0x80483f3 0x7 0xffffd068 0x8048402 0x7
    push %ebp  0x80483dc 0xffffd050 0xffffd05c 0xf7fbaddc 0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
    mov %esp,%ebp 0x80483de 0xffffd050 0xffffd050 0xf7fbaddc 0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
    mov 0x8(%ebp),%eax 0x80483e1 0xffffd050 0xffffd050 0x7  0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
    add $0x1336495,%eax 0x80483e6 0xffffd050 0xffffd050 0x133649c 0xffffd05c 0x80483f3 0x7 0xffffd068 0x8048402 0x7
    pop %ebp  0x80483e7 0xffffd054 0xffffd05c 0x133649c  0x80483f3 0x7 0xffffd068 0x8048402 0x7
    ret  0x80483f3 0xffffd058 0xffffd05c 0x133649c 0x7 0xffffd068 0x8048402 0x7
    add $0x4,%esp 0x80483f6 0xffffd05c 0xffffd05c 0x133649c 0xffffd068 0x8048402 0x7
    leave  0x80483f7 0xffffd060 0xffffd068 0x133649c 0x8048402 0x7
    ret  0x8048402  0xffffd064 0xffffd068 0x133649c 0x7
    add $0x4,%esp 0x8048405  0xffffd068 0xffffd068 0x133649c
    add $0x1,%eax 0x8048408 0xffffd068 0xffffd068 0x133649d
    leave  0x8048409 0xffffd06c 0x0  0x133649d  
  • 相关阅读:
    DB2中的ROW_NUMBER() OVER()函数用法 转
    各个数据库分页语句汇总
    db2导出DDL
    db2数据库操作
    在myeclipse+tomcat中出现org.apache.juli.logging.LogFactory这样的错误,为什么?
    spring的事务管理有几种方式实现 (转自:http://blog.csdn.net/bopzhou/article/details/7094108)
    JAVA 判断一个字符串是不是一个合法的日期格式
    oracle添加字段 与 db2 添加字段
    ajax详细讲解
    Js 时间间隔计算(间隔天数)
  • 原文地址:https://www.cnblogs.com/5301z/p/6146871.html
Copyright © 2020-2023  润新知