SMC + XOR

main函数 能看到她进行了一个xor 但是根据下方的判断flag长度应该是14位 跟181差太多 所以是进行了代码自加密 那都是自加密了 那肯定能自解密呀 所以有两个方法来解这个SMC 恢复她真实的加密代码

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char s[24]; // [rsp+0h] [rbp-20h] BYREF
  int v5; // [rsp+18h] [rbp-8h]
  int i; // [rsp+1Ch] [rbp-4h]

  for ( i = 0; i <= 181; ++i )
    judge[i] ^= 12u;
  printf("Please input flag:");
  __isoc99_scanf("%20s", s);
  v5 = strlen(s);
  if ( v5 == 14 && (*(unsigned int (__fastcall **)(char *))judge)(s) )
    puts("Right!");
  else
    puts("Wrong!");
  return 0;
}
  1. ida patch

通过idapython shift+F2 来执行脚本恢复他的原本代码 执行后按u+p即可恢复

s = 0x600B00
for i in range(182):
    b = get_wide_byte(s+i)
    patch_byte(s+i,b ^ 0xc)
  1. 动态自解密

在此处下断点 然后点击judge函数 u+p恢复

image

加密逻辑

__int64 __fastcall judge(__int64 a1)
{
  _BYTE v2[5]; // [rsp+8h] [rbp-20h] BYREF
  _BYTE v3[9]; // [rsp+Dh] [rbp-1Bh] BYREF
  int i; // [rsp+24h] [rbp-4h]

  qmemcpy(v2, "fmcd", 4);
  v2[4] = 127;
  qmemcpy(v3, "k7d;V`;np", sizeof(v3));
  for ( i = 0; i <= 13; ++i )
    *(_BYTE *)(i + a1) ^= i;
  for ( i = 0; i <= 13; ++i )
  {
    if ( *(_BYTE *)(i + a1) != v2[i] )
      return 0;
  }
  return 1;
}

exp

target = b"fmcd\x7fk7d;V`;np"
flag = bytes(value ^ index for index, value in enumerate(target))
print(flag.decode())

flag

flag{n1c3_j0b}

一把梭

image