zoukankan      html  css  js  c++  java
  • 反汇编测试

    反汇编测试

    参考博文GDB调试汇编堆栈过程分析

    测试代码

    #include<stdio.h>
    
    int g(int x){
        return x+3;
    }
    int f(int x){
    
         int i = 02;
        return g(x)+i;
    }
    int main(void){
        return f(8)+1;
    }
    

    使用命令gcc - g week1307.c -o week1307 -m32编译遇到问题

    经过查询后得知需要安装multilib库:

    sudo apt-get install gcc-multilib
    sudo apt-get install g++-multilib
    

    使用gcc - g week1307.c -o week1302 -m32进行编译,使用gdb week1307进入gdb

    进入之后先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:

    可见此时主函数的栈基址为0xffffd1f8,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0

    结合display命令和寄存器或pc内部变量,做如下设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化:



    可见8被压入了栈中,同时esp减少了4

    使用si命令,进入f函数,此时%esp,%ebp和堆栈的值为:

    单步运行汇编代码

    call指令将下一条指令的地址入栈,进入g函数


    g函数运算完成后,ret返回f函数

    f函数运算完成后,ret返回main函数

    最终结果被写入eax寄存器中

    f函数的汇编代码

    f() eip ebp esp eax
    endbr32 0x565561c6 0xffffd1f8 0xffffd1f0 0x56558fdc
    push %ebp 0x565561ca 0xffffd1f8 0xffffd1f0 0x56558fdc
    mov %esp %ebp 0x565561cb 0xffffd1f8 0xffffd1ec 0x56558fdc
    sub $0x10 %esp 0x565561cd 0xffffd1fc 0xffffd1ec 0x56558fdc
    call 0x56556213 %esp 0x565561d0 0xffffd1fc 0xffffd1dc 0x56558fdc
    add $0x2e07 %eax 0x565561d5 0xffffd1fc 0xffffd1dc 0x565561d5
    movl $0x2 0x4(%ebp) 0x565561da 0xffffd1fc 0xffffd1dc 0x56558fdc
    push 0x8(%ebp) 0x565561e1 0xffffd1fc 0xffffd1dc 0x56558fdc
    call 0x565561ad 0x565561e4 0xffffd1fc 0xffffd1d8 0x56558fdc
    add $0x4 %esp 0x565561e9 0xffffd1fc 0xffffd1d8 0xb
    mov -0x4(%ebp) %edx 0x565561ec 0xffffd1fc 0xffffd1dc 0xb
    add %edx %eax 0x565561ef 0xffffd1fc 0xffffd1dc 0xb
    leave 0x565561f1 0xffffd1fc 0xffffd1dc 0xd
    ret 0x565561f2 0xffffd1f8 0xffffd1f0 0xd
  • 相关阅读:
    装饰器
    返回函数
    用Token令牌维护微服务之间的通信安全的实现
    用Windbg来分析.Net程序的dump
    Windows下docker的安装,将ASP.NET Core程序部署在Linux和Docker中
    StackExchange.Redis学习笔记(五) 发布和订阅
    StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
    StackExchange.Redis学习笔记(三) 数据库及密码配置 GetServer函数
    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
    Task及Mvc的异步控制器 使用探索
  • 原文地址:https://www.cnblogs.com/ruier/p/15517685.html
Copyright © 2011-2022 走看看