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

    反汇编测试

    任务代码

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

    任务过程

    • 使用gcc -g -no-pie -fno-pic -m32 test.c -o test指令在64位的机器上产生32位汇编并去除<__x86.get_pc_thunk.ax>,然后使用gdb test指令进入gdb调试,设置main函数b main断点并运行 

    使用disass指令获取汇编代码,用i r指令查看所有寄存器的值:

     

     使用display指令查看各寄存器中的值,以及当前$eip中存储地址所对应的指令

     main函数将FP压栈push %ebp,让FP指向保存的FPmov %esp, %ebp,同时将即将调用函数f的参数x = 8推送到堆栈中

     调用函数f  push eip ; jump 0x8049185

     f函数中获取汇编代码

     验证调用函数地址是否为期望函数endbr32

     f函数将FP压栈push %ebp,让FP指向保存的FPmov %esp, %ebp

     向下移动SP为自动局部变量i =13分配空间,同时分配临时工作空间tempsub $0x10,%esp

    将自动局部变量 i = 13存入栈中movl $0xd,-0x4(%ebp),并将所获得参数x作为下一个调用函数的参数继续传递

     调用函数gpush eip ; jump 0x8049176

     g函数中获取汇编代码

     

    g函数将FP压栈push %ebp,让FP指向保存的FPmov %esp, %ebp

     将参数x = 8放入%eax中mov 0x8(%ebp),%eax,运算x + 8add $0x3,%eax

     将FP复制到SP中,弹出堆栈到FPpop %ebp,返回调用f

    main函数中

    1.清除堆栈参数恢复原始状态add $0x4, %esp

     2.计算24 + 1add $0x1,%eax

     3.将FP复制到SP中,弹出堆栈到FPleave,返回调用ctr0 ret

    f函数中寄存器和堆栈值的变化情况

  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/2902480848sy/p/15521700.html
Copyright © 2011-2022 走看看