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這種的比較好,不然靜態弄多了,遇到某些題目的時候,不方便發現自己的錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM