反汇编测试

1.汇编截图

2.使用gdb跟踪汇编代码

  • 使用gdb week1306指令打开gdb调试器

  • 使用break main指令在main函数处设置断点,再用r指令运行代码

  • 用disassemble指令获取汇编代码

  • 用i r指令查看各寄存器的值


    <__x86.get_pc_thunk.ax>的作用就是把esp的内容赋值给eax。
    简单来说call 0x11c5 <__x86.get_pc_thunk.ax>的意义就是为了获取下一条指令的地址。
    此时还没有调用函数,esp栈中元素为0

  • push $0x8分配4字节的栈空间,esp减4

  • call调用f,esp的值为8

  • 执行f函数,f初始化帧指针,将上一个函数的基址入栈,将当前%esp作为新基址

  • 分配栈空间,为传参做准备

  • 将%esp中的8存入栈中

  • call调用g

  • 执行g函数,g初始化栈指针

  • 分配栈空间

  • 将%esp中的8存入栈中

  • 将 %eax 与立即数 3 相加

  • pop %ebp在g结束前弹栈

  • ret返回g中call的调用位置,结束g函数

  • 将 %esp 与立即数 4 相加

  • leave返回准备栈

  • ret返回f中call的调用位置,结束f函数

  • 将 %eax 与立即数1相加

  • leave返回准备栈

  • ret结束main函数

原文地址:https://www.cnblogs.com/1208499954qzone/p/15517846.html