zoukankan      html  css  js  c++  java
  • wdb2020 signed

    参考的博客:https://www.cnblogs.com/jentleTao/p/12864523.html

    这道题我在写的时候,想用程序跑出来,但我没有注意的是,运算的先后顺序,导致跑出来的一直是错的,后面参考了一位师傅的博客https://www.cnblogs.com/jentleTao/p/12864523.html发现了自己的错误,并且复现了一遍

    首先用PE检查文件

     没有什么异常,所以打开ida看下源码

     qmemcpy用来拷贝unk_403040的数据

     但只要拷贝这些元素

     在进入vm_operad函数里看一下

    int __cdecl vm_operad(int *a1, int a2)
    {
      int result; // eax
      char v3[100]; // [esp+13h] [ebp-E5h]
      char v4[100]; // [esp+77h] [ebp-81h]
      char v5; // [esp+DBh] [ebp-1Dh]
      int v6; // [esp+DCh] [ebp-1Ch]
      int v7; // [esp+E0h] [ebp-18h]
      int v8; // [esp+E4h] [ebp-14h]
      int v9; // [esp+E8h] [ebp-10h]
      int v10; // [esp+ECh] [ebp-Ch]
    
      v10 = 0;
      v9 = 0;
      v8 = 0;
      v7 = 0;
      v6 = 0;
      while ( 1 )
      {
        result = v10;
        if ( v10 >= a2 )
          return result;
        switch ( a1[v10] )
        {
          case 1:
            v4[v7] = v5;
            ++v10;
            ++v7;
            ++v9;
            break;
          case 2:
            v5 = a1[v10 + 1] + v3[v9];
            v10 += 2;
            break;
          case 3:
            v5 = v3[v9] - LOBYTE(a1[v10 + 1]);
            v10 += 2;
            break;
          case 4:
            v5 = a1[v10 + 1] ^ v3[v9];
            v10 += 2;
            break;
          case 5:
            v5 = a1[v10 + 1] * v3[v9];
            v10 += 2;
            break;
          case 6:
            ++v10;
            break;
          case 7:
            if ( v4[v8] != a1[v10 + 1] )
            {
              printf("what a shame...");
              exit(0);
            }
            ++v8;
            v10 += 2;
            break;
          case 8:
            v3[v6] = v5;
            ++v10;
            ++v6;
            break;
          case 10:
            read(v3);
            ++v10;
            break;
          case 11:
            v5 = v3[v9] - 1;
            ++v10;
            break;
          case 12:
            v5 = v3[v9] + 1;
            ++v10;
            break;
          default:
            continue;
        }
      }
    }

    首先我们看case10,因为他拥有read函数,全局变量中第一个元素就是10

    然后我们再来看case 7是一个比较的事件,所以我们写出代码

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<Windows.h>
    int main()
    {
        ::std::vector<int> param_one(128); param_one= { 0x0A, 4, 0x10, 8, 3, 5, 1, 4, 0x20, 8, 5, 3, 1, 3, 2, 8 ,0x0B, 1, 0x0C, 8, 2 ,2,2,2, 1, 5, 3, 8, 3, 0x21, 1, 0xB ,8, 0xB, 1, 4, 9, 8, 3, 0x20, 1, 2, 0x51, 8, 4, 0x24, 1,
        0xC, 8, 0xB, 1, 5, 2, 8, 2, 0x25, 1, 2, 0x36, 8, 4, 0x41,1, 2, 0x20, 8, 5, 2 ,2, 5, 3, 8, 2, 0x25, 1, 4, 9,8, 3, 0x20, 1, 2, 0x41, 8, 0x0C, 1, 7, 0x22, 7, 0x3F, 7,0x34, 7, 0x32, 7, 0x72, 7, 0x33, 7, 0x18, 7, -89,
        7, 0x31, 7, -15, 7, 0x28, 7, -124, 7, -63 ,7, 0x1E, 7, 0x7A, 0xE };
    
    
        //::std::vector<char> array_one(100); array_one = { 34,63,52,50,114,51,24,-89,49,-15,40,-124,-63,30,122 };
        //::std::vector<char> array_two(100); 
    
    
        int index=0;char tmp=0;
        while (index < 114)
        {
            
            switch (param_one[index])
            {
            case 1:
                index++;break;
            case 2:
                index += 2;
                break;
            case 3:
                index += 2;
                break;
            case 4:
                index += 2;
                break;
            case 5:
                index += 2;
                break;
            case 6:
                index++;
                break;
            case 7:
          ::std::cout<<param_one[index+1];
    index += 2; break; case 8: index++;break; case 10: index++; break; case 11: index++; break; case 12: index++; break; default: continue; } }

    筛选出元素{ 34,63,52,50,114,51,24,-89,49,-15,40,-124,-63,30,122 },这一步后我一开始想用程序跑,但跑得一直不正确,后面看了前面所提到的师傅博客https://www.cnblogs.com/jentleTao/p/12864523.html发现了自己的问题,没有考虑到运算顺序!!!所以一直没跑出来,这里我没有程序,所以只能借用一下那位大佬博客写得一部分代码

    10h ^ input[1]-5 = 22h
    (20h ^input[2])*3=3Fh
    input[3]-2-1=34h
    (input[4]+1 )^4 =32 h
    input[5]*3-21h=72h
    input[6]-1-1=33h
    9^input[7]-20=18
    (51h +input[8])^24h=FA7
    input[9]+1-1=31h
    2*input[10]+25h=F1h
    (36h+input[11]) ^41h =28h
    (20h + input[12])*1=F84h
    3*input[13]+25h=C1h
    9^input[14]-20h=1E h
    41h + input[15] +1 =7A h

    转自https://www.cnblogs.com/jentleTao/p/12864523.html

    算出来input,就是我们所要的答案。

    757515121f3d478

    这个博客主要是让自己对所犯的错误做一个记录,加深印象,以便未来在犯。

    同时发现逆向还是得多用用动态分析像od这种的比较好,不然静态弄多了,遇到某些题目的时候,不方便发现自己的错误

  • 相关阅读:
    Library 的打包
    Webpack 的高级概念
    前端文件下载的几种方式
    Webpack 的核心概念
    vue框架目录结构
    前端工程化的理解
    this.$nextTick
    某面试题
    React Fiber是什么
    Ant Design 在回显数据的时候报错, Error: must set key for <rc-animate> children
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/12868094.html
Copyright © 2011-2022 走看看