• 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析


    20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析

    本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析

    首先放上以前环境配置的图:

    图1:

    测试代码:

    #include <stdio.h>
    
    int g(int x){
    return x+5;
    }
    
    int f(int x){
    return g(x)+3;
    }
    
    int main(ing argv,char *argc[]){
    return f(7)+14;
    }
    

    汇编堆栈分析过程:

    预热

    首先,进行最简单的helloworld的测试,用以熟悉步骤

    图2:

    使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器:

    b 位置 语句先在main函数处设置一个断点,r一下,使用disassemble指令获取汇编代码

    图3:

    图4:

    完成预热,开始执行我的代码wk5run.c

    正式汇编栈堆分析

    图5:

    按上面的步骤跑wk5run.c,并用gdb 进入gdb调试器,并查看汇编代码

    图6:

    设置断点在main函数处,并查看寄存器的值。

    图7:

    接下来改设断点至g函数,同样的步骤

    图8:

    图9:

    调试过程

    元知识:

    • 单步执行使用si
    • 单步执行时输出正在执行的语句display /i $pc
    • 输出对应的寄存器中的值,方便我们跟踪调试 i r $xxx

    对于断点设在main的情况,我们进行 跟踪调试

    图10:

    %eip为当前执行的指令的地址,%eax用于实参存储,计算,%ebp%esp用于存储栈指针地址

    接下来使用si进行单步执行,然后继续观察

    图11:

    通过观察,我们可以看到,main的值上涨2,而此时esp的值会-4.

    分析:这是因为call指令使

    图12:

    再次进行单步执行,我们发现esp值已经发生变化,说明程序按照流程正在进行。

    分析:此时eip中的值入栈了,明显的看到了esp值改变

    图13:

    程序进动,上一个函数的基址入栈,当前%esp作为新基址

    图14:

    分析:%esp的值减4,然后eax中增加了6,是为了后面的计算作准备,根据后面来分析。

    我知道最终输出的值是在%eax中输出的,因此我直接不断进行si指令并在每一次调出“i r $eip $ebp $esp $eax”来查看各寄存器中的值。

    直到出现以下界面:

    图15:

    从图中可以看到ebp、esp的值首先变化,然后带动最终的eax寄存器中的值也从原来的空到现在有值的变化。

    还可以看到,现在已经开始地址入栈了,调用了g函数

    图16:

    接下来继续执行,g函数中的步骤在一步一步进行,%eax中的值也随着步骤在增长

    图17:

    此后出现了ret语句,所以对此前的所有语句进行一次分析:

    • 在调用f函数时,call指令将会将下一条指令的地址入栈
    • 在push语句时,标明该步骤需要数值出栈。
    • call语句将吓一跳指令地址入栈

    接下来遇到其他语句:

    图18:

    pop语句:出栈,将地址弹到%ebp中。
    ret指令:将之前入栈的代码地址弹回%eip中,此后开始执行f函数
    add指令:简单的将寄存器中的值相加

    图19:

    程序如上执行,这里我们遇到了一个leave指令

    不是很懂leave指令是做啥的,参考了卢肖明的博客之后,我发现他这么说的

    图20:

    也就是说,leave指令起到的是恢复功能,其原理是先进行寄存器对齐对位,然后再进行弹栈操作。

    另一方面,在寄存器中的值也是按照步骤而上涨

    图21:

    最终,完成执行,分析也到此结束。

    指令 %esp %ebp %eip %eax 堆栈
    push $0x7 0xffffd098 0xffffd098 0x80483fc 0xf7fbadbc 0x0
    call 0x80483e6 0xffffd094 0xffffd098 0x80483fe 0xf7fbadbc 0x7 0x0
    push 0xffffd098 0xffffd094 0xffffd098 0x80483fe 0xf7fbadbc 0x08048403 0x7 0x0
    mov %esp %ebp 0xffffd08c 0xffffd098 0x80483e7 0xf7fbadbc 0x08048403 0x7 0x0
    pushl 0x8(%ebp) 0xffffd08c 0xffffd08c 0x80483e9 0xf7fbadbc 0xffffd08c 0x08048403 0x7 0x0
    call 0x80483db(g) 0xffffd088 0xffffd08c 0x80483ec 0xf7fbadbc 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
    push %ebp 0xffffd084 0xffffd08c 0x80483db 0xf7fbadbc 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
    mov %esp %ebp 0xffffd080 0xffffd08c 0x80483dc 0xf7fbadbc 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
    mov (0x8)%ebp %eax 0xffffd080 0xffffd080 0x80483de 0xf7fbadbc 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
    add $ox5 %eax 0xffffd080 0xffffd080 0x80483e1 0x7 0xffffd08c 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
    pop %ebp 0xffffd080 0xffffd080 0x80483e4 0xc 0x80483ec 0xffffd08c 0x08048403 0x7 0x0
    ret 0xffffd084 0xffffd08c 0x80483e5 0xc 0xffffd08c 0x08048403 0x7 0x0
    add $0x4 $esp 0xffffd088 0xffffd08c 0x80483f1 0xc 0xffffd08c 0x08048403 0x7 0x0
    add $0x3 $eax 0xffffd08c 0xffffd08c 0x80483f4 0xc 0xffffd08c 0x08048403 0x7 0x0
    leave 0xffffd08c 0xffffd08c 0x80483f7 0xf 0x08048403 0x7 0x0
    ret 0xffffd090 0xffffd0898 0x80483f8 0xf 0x7 0x0
    add $0x4 $esp 0xffffd094 0xffffd0898 0x8048403 0xf 0x7 0x0
    add $0x13 $eax 0xffffd098 0xffffd0898 0x8048406 0xf 0x7 0x0
    leave 0xffffd098 0xffffd0898 0x8048409 0x22 0x0
    ret 0xffffd09c 0x0 0x804840a 0x22
    add $0x10 $esp 0xffffd0a0 0x0 0x7e21637 0x22
    sub 0xc %esp 0xffffd0b0 0x0 0x7e2163a 0x22
    push %eax 0xffffd0a4 0x0 0x7e2163d 0x22
    call 0xf7e377b0 0xffffd0a0 0x0 0x7e2163e 0x22
    call 0xf7f260d9 0xffffd09c 0x0 0x7e377b0 0x22
  • 相关阅读:
    Key ssd_300_vgg/block3_box/L2Normalization/gamma not found in checkpoint的解决方案
    微调(Fine-tune)原理
    TensorFlow的数据读取机制
    卷积神经网络CNN识别MNIST数据集
    TensorFlow基本计算单元与基本操作
    一些小软件闪退的解决方案
    机器学习之SVM调参实例
    机器学习之支持向量机算法(二)
    机器学习之支持向量机算法(一)
    机器学习项目实战----新闻分类任务(二)
  • 原文地址:https://www.cnblogs.com/5314zkj/p/6130521.html
Copyright © 2020-2023  润新知