zoukankan      html  css  js  c++  java
  • 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)的值和栈的变化情况
  • 相关阅读:
    [洛谷P2783]有机化学之神偶尔会做作弊
    %你赛题解
    TCP协议中的三次握手和四次挥手(图解)
    堆,栈,内存
    java原生数据类型和引用类型
    XHTML 是以 XML 格式编写的 HTML
    TCP和UDP?
    HTTP和HTTPS的区别?
    <!DOCTYPE> 声明
    ASCII和万国码
  • 原文地址:https://www.cnblogs.com/dongjiashuai/p/15516676.html
Copyright © 2011-2022 走看看