签到

int __fastcall __noreturn main(int argc, const char **argv, const char **envp)
{
  __pid_t v3; // eax
  size_t v4; // rax
  ssize_t v5; // rbx
  bool v6; // al
  bool bCheckPtrace; // [rsp+13h] [rbp-1BDh]
  ssize_t numRead; // [rsp+18h] [rbp-1B8h]
  ssize_t numReada; // [rsp+18h] [rbp-1B8h]
  char bufWrite[208]; // [rsp+20h] [rbp-1B0h] BYREF
  char bufParentRead[200]; // [rsp+F0h] [rbp-E0h] BYREF
  unsigned __int64 v12; // [rsp+1B8h] [rbp-18h]

  v12 = __readfsqword(0x28u);
  bCheckPtrace = detectDebugging();
  if ( pipe(pParentWrite) == -1 )
    exit(1);
  if ( pipe(pParentRead) == -1 )
    exit(1);
  v3 = fork();
  if ( v3 != -1 )
  {
    if ( v3 )
    {
      close(pParentWrite[0]);
      close(pParentRead[1]);
      while ( 1 )
      {
        printf("Input key : ");
        memset(bufWrite, 0, 0xC8u);
        gets(bufWrite);
        v4 = strlen(bufWrite);
        v5 = write(pParentWrite[1], bufWrite, v4);
        if ( v5 != strlen(bufWrite) )
          printf("parent - partial/failed write");
        do
        {
          memset(bufParentRead, 0, sizeof(bufParentRead));
          numReada = read(pParentRead[0], bufParentRead, 0xC8u);
          v6 = bCheckPtrace || checkDebuggerProcessRunning();
          if ( !v6 && checkStringIsNumber(bufParentRead) && atoi(bufParentRead) )
          {
            puts("True");
            if ( close(pParentWrite[1]) == -1 )
              exit(1);
            exit(0);
          }
          puts("Wrong !!!\n");
        }
        while ( numReada == -1 );
      }
    }
    close(pParentWrite[1]);
    close(pParentRead[0]);
    while ( 1 )
    {
      memset(bufParentRead, 0, sizeof(bufParentRead));
      numRead = read(pParentWrite[0], bufParentRead, 0xC8u);
      if ( numRead == -1 )
        break;
      if ( numRead )
      {
        if ( !childCheckDebugResult()
          && bufParentRead[0] == 123
          && strlen(bufParentRead) == 42
          && !strncmp(&bufParentRead[1], "53fc275d81", 0xAu)
          && bufParentRead[strlen(bufParentRead) - 1] == '}'
          && !strncmp(&bufParentRead[31], "4938ae4efd", 0xAu)
          && confuseKey(bufParentRead, 42)
          && !strncmp(bufParentRead, "{daf29f59034938ae4efd53fc275d81053ed5be8c}", 0x2Au) )
        {
          responseTrue();
        }
        else
        {
          responseFalse();
        }
      }
    }
    exit(1);
  }
  exit(1);
}

能发现下面就是一个判断 第一个判断是否为{开头

第二 判断第一段是否为 53fc275d81

第三 判断最后是否为 }结尾

第四 判断最后一段是否为 4938ae4efd

第五进行一个操作之后 进行比对是否为 {daf29f59034938ae4efd53fc275d81053ed5be8c}

那么好 我们知道第一段 最后一段 与比对查看 发现就是比对的flag 只是换了一段

那么我们看

bool __cdecl confuseKey(char *szKey, int iKeyLength)
{
  char szPart1[16]; // [rsp+10h] [rbp-50h] BYREF
  char szPart2[16]; // [rsp+20h] [rbp-40h] BYREF
  char szPart3[16]; // [rsp+30h] [rbp-30h] BYREF
  char szPart4[24]; // [rsp+40h] [rbp-20h] BYREF
  unsigned __int64 v7; // [rsp+58h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  memset(szPart1, 0, 15);
  memset(szPart2, 0, 15);
  memset(szPart3, 0, 15);
  memset(szPart4, 0, 15);
  if ( iKeyLength != 42 )
    return 0;
  if ( !szKey )
    return 0;
  if ( strlen(szKey) != 42 )
    return 0;
  if ( *szKey != 123 )
    return 0;
  strncpy(szPart1, szKey + 1, 0xAu);
  strncpy(szPart2, szKey + 11, 0xAu);
  strncpy(szPart3, szKey + 21, 0xAu);
  strncpy(szPart4, szKey + 31, 0xAu);
  memset(szKey, 0, 0x2Au);
  *szKey = 123;
  strcat(szKey, szPart3);
  strcat(szKey, szPart4);
  strcat(szKey, szPart1);
  strcat(szKey, szPart2);
  szKey[41] = 125;
  return 1;
}

能看到确实是切换位置了

是这样的 confuseKey 会把输入的四个 10 字节分组

{A B C D}

重排成

{C D A B}

目标重排结果是

{daf29f5903 4938ae4efd 53fc275d81 053ed5be8c}

所以原始输入为

{53fc275d81 053ed5be8c daf29f5903 4938ae4efd}

最终 flag

{53fc275d81053ed5be8cdaf29f59034938ae4efd}

然后交

53fc275d81053ed5be8cdaf29f59034938ae4efd