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

    基础操作

    编译为32位代码

    先使用指令sudo apt-get install libc6-dev-i386安装必备库。
    然后可以使用gcc - g example.c -o example -m32来将C代码编译为32位可执行程序。

    gdb

    b main在主函数设置断点。
    disassemble反汇编当前函数的机器码。
    i rinfo registers查看当前寄存器的值。
    si汇编级的指令,步入下一条(进入函数)汇编代码。
    ni汇编级的指令,继续下一条(不进入函数)汇编代码。
    display /i $pc通过PC的值指向是下一条机器码的原理,实现显示当前执行的指令。

    基础知识

    汇编指令和程序帧等知识,查阅参考了博客:
    https://www.cnblogs.com/tongongV/p/13713210.html
    https://blog.csdn.net/liu_if_else/article/details/72794199
    一般而言,eax存的就是返回值。

    反汇编测试

    编译代码

    首先对老师的代码进行了编译,同时通过gcc得到了汇编代码。

    测试

    首先进入调试,并进行反汇编。

    查看寄存器的值,并查看对应的内存中的值。

    可见,还没有调用函数的时候,SP栈中的元素还是0。
    先ni跳过不明白的系统调用,我们继续向后执行。
    这里出现向栈中压入数据8,这是因为调用f函数时,8是作为参数传入的。查看对应的ebp,esp,发现esp减了4,说明压入了一个整数,正是传入的参数8。通过查看堆栈的方法查看,确实是的。

    继续使用si进入f函数内部进行调试观察。
    进入函数f后先观察其汇编代码内容:

    发现,首先进行的操作是将现在的ebp压入栈中,然后再把esp中的值赋给了ebp。这是关键的一步,第一步将ebp入栈其实就是保存了主函数的返回值,将主函数的返回值存到了栈中。然后,将ebp设置为现在的esp,就是相当于在现在的函数中,栈就是空的了,ebp以后的内容都是主函数的栈的内容。这也就是函数调用和返回的原理。

    这里继续执行,然后要调用g函数了。
    进入g函数后:

    最后可以发现,代码在经过多次对堆栈的操作之后,将计算的结果放在eax中,两层调用返回了最终的结果。

    堆栈分析

  • 相关阅读:
    去除inline-block出现间距的几种方法
    vscode插件和快捷键
    es6三个点运算符
    jq返回顶部
    jq版轮播图
    js动态操作DOM
    js中的闭包
    es6之箭头函数
    in和hasOwnProperty的区别
    改变this指向的三种方法
  • 原文地址:https://www.cnblogs.com/Ressurection-20191320/p/15508917.html
Copyright © 2011-2022 走看看