无壳,32位
进去直接f5看main函数
我们注意到
这个把ssd的地址给了we
地址存储的数据被异或了
写ida的idc进行异或
ida的idcpy可以写
我这里用的是idc
我们要找函数尾巴
pop ebx,pop esi,pop ebp retn 这些标志函数结尾
直接限定给出定义函数到这个函数尾,有些看不懂的数据直接,按c强行转换成汇编指令
全部转换后可以回到ssd,这个时候可以看f5看伪代码
函数加载出来了
#include<string.h>
#include<stdio.h>
int main()
{
char enflag[20];
char Str[20];
char v4[]= "REVERSE";
enflag[0] = 81;
enflag[1] = -72;
enflag[2] = 90;
enflag[3] = 18;
enflag[4] = 16;
enflag[5] = -6;
enflag[6] = 13;
enflag[7] = 35;
enflag[8] = 1;
enflag[9] = 23;
enflag[10] = 8;
enflag[11] = 9;
enflag[12] = 27;
enflag[13] = 0;
enflag[14] = 18;
enflag[15] = 44;
enflag[16] = -14;
enflag[17] = 18;
enflag[18] = 17;
enflag[19] = 14;
int v1; int v2;
int len = 20;
//v4被运算了要先处理,然后步骤都逆向就行
for (int k = 0; ; ++k )
{
v1 = k;
if ( v1 >=strlen(v4) )
break;
v4[k] %= 64;
}
for (int n = 0; n < 20; ++n )
{
if ( (v4[n % 7] & 1) != 0 )
v2 = enflag[n] - 2;
else
v2 = enflag[n] -1;
enflag[n] = v2;
}
for ( int m = 0; len / 2 > m; ++m )
{ int v5;
v5 =enflag[len - m - 1] ;
enflag[len - m - 1] = enflag[m];
enflag[m] = v5;
}
for ( int l = 0; l < len; ++l )
enflag[l] -= v4[l % 7];
for ( int j = 18; j >=0; --j )
enflag[j] += enflag[j + 1];
for ( int i = 0; i < len; ++i )
enflag[i] += 64;
enflag[len]='\0';
puts(enflag);
}