天天看點

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

1.查殼

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

 64bit

2.分析主函數調用的函數

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

進入主函數,先分析一下主函數調用的功能函數

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

這是一個歐幾裡得算法

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

重命名一下

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

兩個參數是bool類型,都是false的時候才能傳回true,就是一個或非運算

重命名

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數
[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

 這個調用了函數

快速寫一個腳本跑一下

#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;
}
           
[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

隻有兩個數字都是1的時候才會傳回1 ,說明都是true的時候傳回true,就是個與運算

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

重命名一下

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

這個運算是a1-a2

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

分析最後一個函數 

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

這是一個快速幂的算法(基礎數論算法),傳回a的b次方

[NPUCTF2020]Baby Obfuscation 題解1.查殼2.分析主函數調用的函數3.分析主函數

重命名

分析完畢

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)
           

繼續閱讀