• GDB调试汇编堆栈过程分析


    GDB调试汇编堆栈过程分析

    • 这时需要使用sudo apt-get install libc6-dev-i386命令安装一个库之后就可以产生汇编代码了。说是这么说,但是真的要弄好就,乌邦图源弄了好久。

    • disassemble获取汇编代码,若命令不带参数,默认的反汇编范围是所选择帧的pc附近的函数。info registers列出使用的寄存器.

           

    • 使用x 0xffffd048指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0。

    • display,设置程序中断后欲显示的数据及其格式。使用命令display /i $pc每次程序中断后可以看到即将被执行的下一条汇编指令,可以 其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。

    • si执行一条汇编指令

    • %esp、%ebp(info registers)和堆栈内容的变化(x/na %esp)

    一直使用以上三个指令,观察其变化

    • call将下一条指令的所在地址(即当时程序计数器PC的内容)入栈

    • 将上一个函数的基址入栈,将当前%esp作为新基址。

    • 准备传参

    • 计算在%eax中进行

    • 查看f函数的汇编代码

    • 执行g函数,g初始化栈指针

    • g分配栈空间

    • 计算short+in

    • pop %ebp指令将栈顶弹到%ebp中

    • ret返回g中call的调用位置

    • 释放当前子程序在堆栈中的局部变量,恢复被函数修改的%ebp和%esp

    • 主函数汇编代码 

    • 进入main函数, %esp加立即数4

    • 将%edx于%eax相加

    • leave返回准备栈

    • ret结束main函数

    指令%eip%esp%ebp%eax堆栈
    push $0x8 0x804840b 0xffffd048 0xffffd048 0xf7fb8dbc 0x0
    call 0x80483ef 0x804840d 0xffffd044 0xffffd048 0xf7fb8dbc 0x8 0x0
    push %ebp 0x80483ef 0xffffd040 0xffffd048 0xf7fb8dbc 0x8048412 0x8 0x0
    mov %esp,%ebp 0x80483f0 0xffffd03c 0xffffd048 0xf7fb8dbc  
    mov 0x804a01c,%edx 0x80483f2 0xffffd03c 0xffffd03c 0xf7fb8dbc 0xffffd048 0x8048412 0x8 0x0
    mov 0x8(%ebp),%eax 0x80483f8 0xffffd03c 0xffffd03c 0xf7fb8dbc 0xffffd048 0x8048412 0x8 0x0
    call 0x80483db 0x80483fe 0xffffd038 0xffffd03c 0xa 0xa 0xffffd048 0x8048412 0x8 0x0
    push %ebp 0x80483db 0xffffd034 0xffffd03c 0xa 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
    mov %esp,%ebp 0x80483dc 0xffffd030 0xffffd03c 0xa 0xffffd03c 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
    ret 0x80483ee 0xffffd034 0xffffd03c 0xb 0x8048403 0xa 0xffffd048 0x8048412 0x8 0x0
    leave 0x8048406 0xffffd03c 0xffffd03c 0xb 0xffffd048 0x8048412 0x8 0x0
    ret 0x8048407 0xffffd040 0xffffd048 0xb 0x8048412 0x8 0x0
    add $0x4,%esp 0x8048407 0xffffd040 0xffffd048 0xb 0x8 0x0
    leave 0x804841c 0xffffd048 0xffffd048 0xe  
    ret 0x804841d 0xffffd04c 0x0 0xe
  • 相关阅读:
    JavaScript——标准对象
    JavaScript——方法
    JavaScript——变量作用域
    移动开发程序员的悲哀是什么?
    腾讯14年老员工被公司恶意逼走!以不胜任工作为由被裁!腾讯对待老员工也太狠了吧?
    Android开发北漂 8 年,飘飘飘 飘够了。。。。
    我是双非/三本/专科学校的Android开发,我有机会进入大厂吗?
    Android开发3年,我转Java后台了,真香!
    我的字节跳动Android面试初体验——稀里糊涂结束战斗
    Android Studio 教程:入门开发第一个程序
  • 原文地址:https://www.cnblogs.com/20145207lza/p/6181069.html
Copyright © 2020-2023  润新知