1.查殼
64bit
2.分析主函數調用的函數
進入主函數,先分析一下主函數調用的功能函數
這是一個歐幾裡得算法
重命名一下
兩個參數是bool類型,都是false的時候才能傳回true,就是一個或非運算
重命名
這個調用了函數
快速寫一個腳本跑一下
#include<iostream>
using namespace std;
bool AND(bool a, bool b)
{
return a == b && !a;
}
bool __cdecl F0X3(bool a, bool b)
{
bool v2; // bl
bool v3; // al
v2 = AND(b, b);
v3 = AND(a, a);
return AND(v3, v2);
}
int main(){
int a,b;
for(int i=0;i<=0b11;i++){
a=i&1;
b=i>>1&1;
int c=F0X3(a,b);
cout <<a<<' '<<b<<' '<<"return_value:"<<c<<endl;
}
return 0;
}
隻有兩個數字都是1的時候才會傳回1 ,說明都是true的時候傳回true,就是個與運算
重命名一下
這個運算是a1-a2
分析最後一個函數
這是一個快速幂的算法(基礎數論算法),傳回a的b次方
重命名
分析完畢
3.分析主函數
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // eax
int v4; // ebx
int v5; // esi
int v6; // ebx
int v7; // ebx
int v8; // esi
int v9; // ebx
int v10; // ebx
int v11; // ebx
int v12; // esi
int v13; // eax
int v14; // ebx
int v15; // esi
int v16; // ebx
int v17; // eax
bool v18; // bl
int v19; // eax
int v20; // esi
int v21; // ebx
int v22; // ebx
int v23; // eax
int v24; // eax
int v25; // eax
int v26; // ebx
int A0X3[65]; // [rsp+20h] [rbp-60h] BYREF
char Input[1001]; // [rsp+130h] [rbp+B0h] BYREF
int A0X1[1001]; // [rsp+520h] [rbp+4A0h] BYREF
int A0X5[4]; // [rsp+14D0h] [rbp+1450h]
int A0X4[4]; // [rsp+14E0h] [rbp+1460h]
int V0X1; // [rsp+14F0h] [rbp+1470h]
int i_1; // [rsp+14F4h] [rbp+1474h]
int i_0; // [rsp+14F8h] [rbp+1478h]
int i; // [rsp+14FCh] [rbp+147Ch]
_main();
memset(A0X1, 0, 0xFA0ui64);
A0X1[1000] = 0;
memset(A0X3, 0, 0x100ui64);
A0X3[64] = 0;
for ( i = 0; i <= 64; ++i )
A0X3[i] = i + 1;
A0X4[0] = 2;
A0X4[1] = 3;
A0X4[2] = 4;
A0X4[3] = 5;
A0X5[0] = 2;
A0X5[1] = 3;
A0X5[2] = 4;
A0X5[3] = 5;
puts("WHERE IS MY KEY!?");
scanf("%32s", Input);
V0X1 = strlen(Input);
v3 = gcd(A0X3[i_0], A0X3[i_0]);
for ( i_0 = v3 / A0X3[i_0]; i_0 <= V0X1; ++i_0 )
{
v4 = (A0X3[i_0] + A0X3[i_0 + 1]) * (A0X3[i_0] + A0X3[i_0 + 1]);
if ( v4 >= pow(2, 2) * A0X3[i_0] * A0X3[i_0 + 1] )
{
v5 = ~Input[SUB(i_0, 1)];
v6 = SUB(i_0, 1);
A0X1[i_0] = ~(v5 + A0X4[v6 % pow(2, 2)]);
}
v7 = gcd(A0X3[i_0], A0X3[i_0 + 1]);
if ( v7 > gcd(A0X3[i_0 + 1], ~(~A0X3[i_0 + 1] + A0X3[i_0])) )
{
v8 = A0X1[i_0];
v9 = SUB(i_0, 1);
A0X1[i_0] = ~(~v8 + A0X3[v9 % pow(2, 2)]) * v8;
}
v10 = A0X3[i_0 + 1];
v11 = pow(2, 1) * v10;
v12 = A0X3[i_0];
v13 = pow(2, 1);
v14 = gcd(v12 * v13, v11);
v15 = pow(2, 1);
if ( v14 == v15 * gcd(A0X3[i_0], A0X3[i_0 + 1]) )
{
v16 = SUB(i_0, 1);
A0X1[i_0] ^= A0X4[v16 % pow(2, 2)];
}
v17 = pow(V0X3, A0X3[i_0]);
v18 = v17 < A0X3[i_0] + 1;
v19 = pow(2, 4);
if ( NOR(v19 >= i_0, v18) )
{
v20 = ~Input[SUB(i_0, 1)];
v21 = SUB(i_0, 1);
A0X1[i_0] ^= ~(v20 + A0X4[v21 % pow(2, 2)]);
}
v22 = pow(2, 3);
v23 = gcd(A0X3[i_0], A0X3[i_0]);
A0X1[i_0] *= v22 + pow(2, v23 / A0X3[i_0]);
}
v24 = pow(2, 4);
if ( SUB(v24, 1) != V0X1 )
goto LABEL_23;
v25 = gcd(A0X3[i_1], A0X3[i_1]);
for ( i_1 = v25 / A0X3[i_1]; i_1 <= V0X1; ++i_1 )
{
v26 = A0X1[i_1];
if ( v26 == SUB(A0X6[i_1], 1) / 10 )
++V0X2;
}
if ( V0X2 == V0X1 )
puts("\nPASS");
else
LABEL_23:
puts("\nDENIED");
return 0;
}
分析主函數編寫wp
text=[0x0, 0x1E79, 0x1E79, 0x2135, 0x170D, 0x1F41,0x1901, 0x2CED,0x11F9, 0x2649, 0x2581,0x2DB5, 0x14B5, 0x25E5, 0x2A31, 0x30D5,0x0,0x0,0x415770,0x0,0x0,0x0,0x0,0x0]
flag=''
v31=[2,3,4,5]
for j in range(1,len(text)):
text[j]//=100
text[j]^=v31[(j-1)%4]
text[j]+=v31[(j-1)%4]
flag+=chr(text[j])
print(flag)