动调

题目給了三个附件 两个elf 一个exe 能看到main函数就 一个赋值 一个判断进入函数

int __fastcall main(int argc, const char **argv, const char **envp)
{
  void *v3; // rsp
  const char **v5; // [rsp+0h] [rbp-60h] BYREF
  int v6; // [rsp+Ch] [rbp-54h]
  _BYTE v7[28]; // [rsp+1Ch] [rbp-44h] BYREF
  __int64 v8; // [rsp+38h] [rbp-28h]
  const char ***v9; // [rsp+40h] [rbp-20h]
  unsigned __int64 v10; // [rsp+48h] [rbp-18h]

  v6 = argc;
  v5 = argv;
  v10 = __readfsqword(0x28u);
  v7[0] = 84;
  v7[1] = -56;
  v7[2] = 126;
  v7[3] = -29;
  v7[4] = 100;
  v7[5] = -57;
  v7[6] = 22;
  v7[7] = -102;
  v7[8] = -51;
  v7[9] = 17;
  v7[10] = 101;
  v7[11] = 50;
  v7[12] = 45;
  v7[13] = -29;
  v7[14] = -45;
  v7[15] = 67;
  v7[16] = -110;
  v7[17] = -87;
  v7[18] = -99;
  v7[19] = -46;
  v7[20] = -26;
  v7[21] = 109;
  v7[22] = 44;
  v7[23] = -45;
  v7[24] = -74;
  v7[25] = -67;
  v7[26] = -2;
  v7[27] = 106;
  v8 = 19;
  v3 = alloca(32);
  v9 = &v5;
  printf("Key: ");
  __isoc99_scanf("%s", v9);
  if ( (unsigned int)check_key(v9) )
    interesting_function(v7);
  else
    puts("Wrong");
  return 0;
}

check_key 函数 获取key 然后进行操作 但是不影响下面函数

_BOOL8 __fastcall check_key(__int64 a1)
{
  int v2; // [rsp+8h] [rbp-10h]
  int i; // [rsp+Ch] [rbp-Ch]

  v2 = 0;
  for ( i = 0; i <= 4; ++i )
    v2 += *(_DWORD *)(4LL * i + a1);
  return v2 == -559038737;
}

interesting_function 能看到上面check_key函数的操作对下面的 没有影响 我输入什么都不影响 我们只需要进去 然后他自动会输出

int __fastcall interesting_function(__int64 a1)
{
  unsigned int *v1; // rax
  unsigned int v3; // [rsp+1Ch] [rbp-24h] BYREF
  int i; // [rsp+20h] [rbp-20h]
  int j; // [rsp+24h] [rbp-1Ch]
  __int64 v6; // [rsp+28h] [rbp-18h]
  unsigned int *v7; // [rsp+30h] [rbp-10h]
  unsigned __int64 v8; // [rsp+38h] [rbp-8h]

  v8 = __readfsqword(0x28u);
  LODWORD(v1) = a1;
  v6 = a1;
  for ( i = 0; i <= 6; ++i )
  {
    v3 = *(_DWORD *)(4LL * i + v6) ^ 0xDEADBEEF;
    v1 = &v3;
    v7 = &v3;
    for ( j = 3; j >= 0; --j )
      LODWORD(v1) = putchar((char)(*((_BYTE *)v7 + j) ^ flag_data[4 * i + j]));
  }
  return (int)v1;
}

exe输出有问题 所以我们换成elf

image

我们只需要修改这个eax值就可以了

image

image

同样我们也可以提取数据来解密flag

数据

fd = [0xdc,0x17,0xbf,0x5b,0xd4,0x0a,0xd2,0x1b,0x7d,0xda,0xa7,0x95,0xb5,0x32,0x10,0xf6,0x1c,0x65,0x53,0x53,0x67,0xba,0xea,0x6e,0x78,0x22,0x72,0xd3]
d = [84,-56,126,-29,100,-57,22,-102,-51,17,101,50,45,-29,-45,67,-110,-87,-99,-46,-26,109,44,-45,-74,-67,-2,106]

exp

fd = [0xdc,0x17,0xbf,0x5b,0xd4,0x0a,0xd2,0x1b,0x7d,0xda,0xa7,0x95,0xb5,0x32,0x10,0xf6,0x1c,0x65,0x53,0x53,0x67,0xba,0xea,0x6e,0x78,0x22,0x72,0xd3]
d = [84,-56,126,-29,100,-57,22,-102,-51,17,101,50,45,-29,-45,67,-110,-87,-99,-46,-26,109,44,-45,-74,-67,-2,106]

d = bytes(x & 0xff for x in d)

for i in range(7):
    x = int.from_bytes(d[i*4:i*4+4], "little") ^ 0xDEADBEEF
    b = x.to_bytes(4, "little")

    for j in range(3, -1, -1):
        print(chr(b[j] ^ fd[4*i+j]), end="")

flag

flag_is_you_know_cracking!!!