• 20191302反汇编测试


    反汇编测试

    测试代码

    #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在64位机器上编译一个32位的程序,遇到报错

    • 解决办法:安装multilib库
      sudo apt-get install gcc-multilib
      sudo apt-get install g++-multilib

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

    在main函数设置断点,再run一下,使用disassemble指令获取汇编代码,用i r指令查看各寄存器的值:


    可见此时主函数的栈基址为0xffffd108,用x查看其值为0。

    使用指令display /i $pc,单步执行并显示%esp和%ebp的值。


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

    使用si命令,进入f函数

    单步运行汇编代码

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


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


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

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


    f函数的汇编代码

    • 在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况
  • 相关阅读:
    快速幂求模
    elasticSearch入门
    springboot 停止
    gson
    jetty 入门
    redis工具
    oracle数据库操作
    Spring事务控制和回滚
    SPI
    PLSQLDeveloper_免安装自带client
  • 原文地址:https://www.cnblogs.com/dongjiashuai/p/15516676.html
Copyright © 2020-2023  润新知