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函数中寄存器和堆栈值的变化情况

  • 相关阅读:
    extern--C#调用C++等其他非托管代码
    unhandledException详细介绍
    MySql如何安装?
    Mindoc搭建流程
    反射_IsDefined判断方法上有自定义的标签
    WebApi_返回Post格式数据
    编码
    IP地址与MAC地址
    Tcp/Ip:Telnet指令
    create-react-app使用的问题
  • 原文地址:https://www.cnblogs.com/2902480848sy/p/15521700.html
Copyright © 2011-2022 走看看