• 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

    参考资料

  • 相关阅读:
    UVa-133-救济金发放
    UVa-340-猜数字
    UVa-1584-环状序列
    UVa-1585-得分
    UVa-1586-分子量
    BZOJ-3289: Mato的文件管理(莫队算法+树状数组)
    HDU-2824 The Euler function(欧拉函数)
    2017年10月12日22:27:20
    HDU-4715 Difference Between Primes(线性筛法)
    POJ-1185 炮兵阵地(状态压缩DP)
  • 原文地址:https://www.cnblogs.com/20145221GQ/p/6130938.html
Copyright © 2020-2023  润新知