zoukankan      html  css  js  c++  java
  • 2020 "第五空间"智能安全大赛 Re nop

    测试文件:https://wwa.lanzous.com/is4hte2ulfc

     

    代码处理

     

    这道题是花指令相关题目,利用int 80h做中断。

    首先将包含int 80h中断的sub_804857Bsub_80485C4函数和反调试函数sub_804865B全部nop掉。

    接着,将

    push 地址
    ...
    pop ebx
    jmp ebx

    这种形式的代码,都修改为

    jmp 地址

    这样在反编译后能够看到跳转的函数

    void __cdecl main(int a1, char **a2)
    {
      char *v2; // eax
      int savedregs; // [esp+8h] [ebp+0h]
    
      v2 = *a2;
      puts("input your flag");
      __isoc99_scanf("%d", &dword_804A038);
      ++dword_804A038;
      ++dword_804A038;
      dword_804A038 -= 0x33333334;
      ++dword_804A038;
      sub_8048751((int)&savedregs);
    }

    代码分析

    第一部分

    第9~13行代码,对输入num+3-0x33333334

    第二部分

    进入sub_8048751函数

    int __usercall sub_8048753@<eax>(int a1@<ebp>)
    {
      _BYTE *v1; // eax
      int result; // eax
      int v3; // ecx
    
      v1 = sub_8048691((_BYTE *)dword_804A038);
      sub_8048691(v1 + 1);
      puts("Wrong!");
      result = 0;
      v3 = *(_DWORD *)(a1 - 4);
      return result;
    }

    打开sub_8048691函数

    _BYTE *__usercall sub_8048691@<eax>(_BYTE *result@<eax>)
    {
      *result = 0x90u;
      return result;
    }

    这个函数实际上就是在对num地址进行nop(0x90)操作,转到前面的汇编代码

    我们可以看到,这条指令是直接跳转到Wrong处,那么我们只需要将这个跳转指令(两个字节)nop掉,那么就能输出Right。

    因此num+3-0x33333334=0x8048965需要成立,则num=993507990,这样就得到了flag。

    get flag!

    flag{993507990}

  • 相关阅读:
    Servlet简介
    Tomcat服务器(一)
    Java对象的serialVersion序列化和反序列化
    MySQL中不允许使用列别名作为查询条件
    IF函数
    IFNULL函数
    用Java取指定时区的时间 北京时间,纽约时间,班加罗尔时间
    一个CSV文件解析类
    Java中取两位小数
    JS传中文到后台需要的处理
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/13198286.html
Copyright © 2011-2022 走看看