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