zoukankan      html  css  js  c++  java
  • 攻防世界 reverse seven

    seven  hctf2018

     这是一个驱动文件

     ida载入,查找字符串

     根据字符串来到函数:sub_1400012F0

    __int64 __fastcall sub_1400012F0(__int64 a1, __int64 a2)
    {
      __int64 v2; // rbx
      _KEYBOARD_INPUT_DATA *KEYBOARD_input; // rsi
      unsigned __int64 v4; // rdx
      int index; // ecx
      __int16 *k_ipt; // rdi
      __int64 v7; // rbp
      __int16 k; // dx
      char next_c; // dl
      CHAR *v10; // rcx
    
      v2 = a2;
      if ( *(_DWORD *)(a2 + 48) >= 0 )
      {
        KEYBOARD_input = *(_KEYBOARD_INPUT_DATA **)(a2 + 24);
        v4 = (unsigned __int64)(*(unsigned __int64 *)(a2 + 56) * (unsigned __int128)0xAAAAAAAAAAAAAAABui64 >> 64) >> 3;
        if ( (_DWORD)v4 )
        {
          index = dword_1400030E4;
          k_ipt = (__int16 *)&KEYBOARD_input->MakeCode;
          v7 = (unsigned int)v4;
          while ( KEYBOARD_input->Flags )
          {
    LABEL_30:
            k_ipt += 6;
            if ( !--v7 )
              goto LABEL_31;
          }
          aO[index] = '.';
          k = *k_ipt;
          if ( *k_ipt == 17 )//对应按键w
          {
            if ( index & 0xFFFFFFF0 )               // 大于等于16
            {
              index -= 16;                          // 向上移动
              goto LABEL_13;
            }
            index += 208;
            dword_1400030E4 = index;
          }
          if ( k != 31 )//对应按键s
            goto LABEL_14;
          if ( (index & 0xFFFFFFF0) == 208 )
            index -= 208;
          else
            index += 16;                            // 向下移动
    LABEL_13:
          dword_1400030E4 = index;
    LABEL_14:
          if ( k == 30 )//对应按键a
          {
            if ( index & 0xF )
              --index;                              // 向左
            else
              index += 15;                          // 最右端0位置时,+15,向左移动到最右端
            dword_1400030E4 = index;
          }
          if ( k == 32 )//对应按键d
          {
            if ( (index & 0xF) == 15 )              // 右,一行0-15,16个,在最右端时,移到0位置
              index -= 15;
            else
              ++index;                              //
            dword_1400030E4 = index;
          }
          next_c = aO[index];
          if ( next_c == '*' )
          {
            v10 = "-1s
    ";
          }
          else
          {
            if ( next_c != '7' )
            {
    LABEL_29:
              aO[index] = 'o';
              goto LABEL_30;
            }
            v10 = "The input is the flag!
    ";
          }
          dword_1400030E4 = 16;
          DbgPrint(v10);
          index = dword_1400030E4;
          goto LABEL_29;
        }
      }
    LABEL_31:
      if ( *(_BYTE *)(v2 + 65) )
        *(_BYTE *)(*(_QWORD *)(v2 + 184) + 3i64) |= 1u;
      return *(unsigned int *)(v2 + 48);
    }

    简单的迷宫题,输入是通过KEYBOARD_INPUT_DATA结构体,其第二项表示按键的扫描码

    17-->w; 31-->s; 30-->a; 32-->d

    分别对应上,下,左,右。

    迷宫:

     对应输入:ddddddddddddddssaasasasasasasasasas

    hctf{ddddddddddddddssaasasasasasasasasas}

  • 相关阅读:
    Java简单游戏开发之碰撞检测
    Android应用程序在新的进程中启动新的Activity的方法和过程分析
    Android应用程序组件Content Provider的共享数据更新通知机制分析
    Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
    VS2005检查内存泄露的简单方法
    iOS如何让xcode自动检查内存泄露
    wf
    VC++ListBox控件的使用
    textoverflow:ellipsis溢出文本显示省略号的详细方法
    VC编写代码生成GUID并转换为CString字符串
  • 原文地址:https://www.cnblogs.com/DirWang/p/12272367.html
Copyright © 2011-2022 走看看