zoukankan      html  css  js  c++  java
  • GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析

    环境准备

    • linux ubuntu 16.04.1
    • 终端编译工具:
      • 基于64位Linux版本32位编译调试指令:sudo apt-get install libc6-dev-i386
    • 测试代码准备:

    分析过程

    思路

    • Step1:生成汇编代码:gcc -g gdbtest.c -o gdbtest -m32

    • Step2:调试:gdb gdbtest

    • Step3:设置断点,因为目的是分析而不是调试bug,所以我们将断点设置在main函数

    • Step4:开始gdb调试:r(un),如若想获取此时的汇编代码,可用指令:disassemble

    • Step5:此时可以用指令查看寄存器的值:i(nfo) r(egisters),显示的格式为3列:

      • 第1列:寄存器名称
      • 第2列:寄存器的地址
      • 第3列:寄存器中存的值
    • Step6:使用display /i $pc可查看当前执行的汇编代码,通过e(x)amine /nfu可查看寄存器的地址以及栈中的值

    • 综上:有了上述这些功能指令,就足够我们对寄存器的内容进行分析了,每执行一条语句记录相关寄存器中的值(注意:本文分析汇编过程中%eip、%esp、%ebp、%eax、堆栈的情况,针对前3者我们在乎其地址的变化,而后两个情况我们则关心其中存储的值,在此特别说明一下,后文寄存器分析中不再特别说明。

    过程(截图中的指令实际上是下一条待执行指令)

    • 初始

    • push $0x8

    • call 0x80483e6

    • push %ebp

    • mov %esp,%ebp

    • pushl 0x8(%ebp)

    • call 0x80483db

    • push %ebp

    • mov %esp,%ebp

    • mov 0x8(%ebp),%eax

    • add $0x3,%eax

    • pop %ebp

    • ret

    • add $0x4,%esp

    • leave

    • ret

    • ```add $0x4,%esp``

    • ```add $0x1,%eax``

    寄存器分析

    从main函数开始,到main函数结束(根据以上截图填写)

    指令 %eip %esp %ebp %eax 堆栈(相对初始栈底)
    初始 0x80483f9 0xffffcff8 0xffffcff8 0xffffd09c
    push $0x8 0x80483fb 0xffffcff4 0xffffcff8 0xffffd09c 0x8
    call 0x80483e6 0x80483e6 0xffffcff0 0xffffcff8 0xffffd09c 0x08048400,0x8
    push %ebp 0x80483e7 0xffffcfec 0xffffcff8 0xffffd09c 0xffffcff8,0x08048400,0x8
    mov %esp,%ebp 0x80483e9 0xffffcfec 0xffffcfec 0xffffd09c 0xffffcff8,0x08048400,0x8
    pushl 0x8(%ebp) 0x80483ec 0xffffcfe8 0xffffcfec 0xffffd09c 0x8,0xffffcff8,0x08048400,0x8
    call 0x80483db 0x80483db 0xffffcfe4 0xffffcfec 0xffffd09c 0x080483f1,0x8,0xffffcff8,0x08048400,0x8
    push %ebp 0x80483dc 0xffffcfe0 0xffffcfec 0xffffd09c 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
    mov %esp,%ebp 0x80483de 0xffffcfe0 0xffffcfe0 0xffffd09c 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
    mov 0x8(%ebp),%eax 0x80483e1 0xffffcfe0 0xffffcfe0 0x8 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
    add $0x3,%eax 0x80483e4 0xffffcfe0 0xffffcfe0 0xb 0xffffcfec,0x080483f1,0x8,0xffffcff8,0x08048400,0x8
    pop %ebp 0x80483e5 0xffffcfe4 0xffffcfec 0xb 0x080483f1,0x8,0xffffcff8,0x08048400,0x8
    ret 0x80483f1 0xffffcfe8 0xffffcfec 0xb 0x8,0xffffcff8,0x08048400,0x8
    add $0x4,%esp 0x80483f4 0xffffcfec 0xffffcfec 0xb 0xffffcff8,0x08048400,0x8
    leave 0x80483f5 0xffffcff0 0xffffcff8 0xb 0x08048400,0x8
    ret 0x8048400 0xffffcff4 0xffffcff8 0xb 0x8
    add $0x4,%esp 0x8048403 0xffffcff8 0xffffcff8 0xb
    add $0x1,%eax 0x8048306 0xffffcff8 0xffffcff8 0xc

    参考资料

  • 相关阅读:
    Android开发总结
    LeakCanary原理分析
    机器学习
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):2. 实现绘图功能
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作
    远程显示(操作) 服务器 GUI 程序(图形化界面) (基于 X11 Forwarding + Centos + MobaXterm)
  • 原文地址:https://www.cnblogs.com/20145221GQ/p/6130938.html
Copyright © 2011-2022 走看看