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


    GDB调试汇编堆栈过程分析

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

    使用gdb调试代码。

    使用break main指令在main函数处设置断点,然后调试,直到mian函数处。

    使用diassemble指令获取汇编代码

    查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0

    使用命令display /i $pc每次程序中断后可以看到即将被执行的下一条汇编指令

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

    准备传参

    查看f函数的汇编代码

    g分配栈空间

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

    ret返回g中call的调用位置

    ret返回f中call的调用位置,结束f函数

    主函数汇编代码

    将%edx于%eax相加

    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 0x0
    ret 0x804841d 0xffffd04c 0x0 0xe
  • 相关阅读:
    古代军队的官的从大到小的排序
    [转]DAO、RDO、ADO、OLE DB 、ODBC and JDB
    JSP页面之间参数传递中文出现乱码
    重置VS2008插件环境
    PB7中调用VC6的DLL
    Visual Studio统计有效代码行数
    php.ini 中文版
    IDEA Plugin JB* Components
    [转]你还在为怎么查看字节码指令而担忧吗?
    战地2, 2142解决Win10运行闪退问题
  • 原文地址:https://www.cnblogs.com/bestizwh/p/6138188.html
Copyright © 2020-2023  润新知