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这种的比较好,不然静态弄多了,遇到某些题目的时候,不方便发现自己的错误

  • 相关阅读:
    bzoj2431[HAOI2009]逆序对数列
    wikioi1082【线段树练习 3 】
    bzoj1715[Usaco2006 Dec]Wormholes 虫洞
    bzoj1676[Usaco2005 Feb]Feed Accounting 饲料计算
    bzoj1677[Usaco2005 Jan]Sumsets 求和
    bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼声
    bzoj1680[Usaco2005 Mar]Yogurt factory
    bzoj1681[Usaco2005 Mar]Checking an Alibi 不在场的证明
    bzoj2705[SDOI2012]Longge的问题
    bzoj1627[Usaco2007 Dec]穿越泥地
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/12868094.html
Copyright © 2011-2022 走看看