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

    反汇编测试

    1.实验准备

    1.1函数源代码

    int g(int x){
        return x+3;
    }
    int f(int x){
         int i = 27;
        return g(x)+i;
    }
    int main(void){
        return f(8)+1;
    }
    

    1.2设置环境

    • 使用指令sudo apt-get install libc6-dev-i386sudo apt-get install gcc-multilibsudo apt-get install g++-multilib,安装一个库,使编译64位Linux版本32位的二进制文件:

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


    2.过程分析

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

    • 可知基序列位0xffffd168

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

    • call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:

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

    • 先为传参做准备:

    • f函数的汇编代码:

    • 实参入栈:

    • 主函数汇编代码:

    截图:

  • 相关阅读:
    c++之运算符
    C++开源库,欢迎补充。
    C++ 图像处理类库
    C++开源代码项目汇总
    视频会议及流媒体十大开源项目
    多媒体的框架
    C++开发资源汇总
    Juce之旅-第一个例子(图形窗口)
    Juce-强大的开源类库
    图像处理库的比较:OpenCV,FreeImage,CImg,CxImage
  • 原文地址:https://www.cnblogs.com/tzy20191327/p/15477686.html
Copyright © 2011-2022 走看看