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