Easy Crack은 간단한 비밀번호를 물어보는 프로그램입니다. 비밀번호를 맞출 경우 Congratulation 이라는 글자를 출력하며, 틀렸을 경우 Incorrect라는 문자를 출력합니다.

문제 접근

해당 프로그램에서 Congratulation이라는 글자가 나오는 비밀번호를 찾는것이 핵심이므로, 어떤 경우에서 Congratulation이라는 글자가 나오는지 알기 위해서 Ghidra의 문자열 검색을 통해 해당 문자가 출력되는 코드의 위치를 알아보곘습니다.

다음과 같은 영역에 해당 문자열이 저장되어 있었으며, 해당 문자열을 호출하는 곳을 따라가 보곘습니다.

다음과 같이 references > show references to address 를 통해서 해당 문자열이 어디서 호출되는지 찾을수 있습니다. 이 경우 MessageBoxA() 라는 함수를 통해서 호출되고 화면에 보여지고 있었습니다.

이제는 해당 MessageBoxA() 함수가 실행되기 전의 조건문 코드를 보면서 어떤 조건에서 해당 Congratulation 문자가 출력되는지 알아보곘습니다.

void __cdecl FUN_00401080(HWND param_1) {
  byte bVar1;
  byte *pbVar2;
  int iVar3;
  char *pcVar4;
  bool bVar5;
  CHAR local_64;
  char local_63;
  char local_62;
  char acStack_61 [97];
  
  local_64 = '\0';
  pcVar4 = &local_63;
  for (iVar3 = 0x18; iVar3 != 0; iVar3 = iVar3 + -1) {
    pcVar4[0] = '\0';
    pcVar4[1] = '\0';
    pcVar4[2] = '\0';
    pcVar4[3] = '\0';
    pcVar4 = pcVar4 + 4;
  }
  pcVar4[0] = '\0';
  pcVar4[1] = '\0';
  pcVar4[2] = '\0';
  GetDlgItemTextA(param_1,1000,&local_64,100);
  if (local_63 == 'a') {
    iVar3 = _strncmp(&local_62,&DAT_00406078,2);
    if (iVar3 == 0) {
      pcVar4 = s_AGR3versing_0040606a;
      pbVar2 = (byte *)(acStack_61 + 1);
      do {
        pcVar4 = pcVar4 + 2;
        bVar1 = *pbVar2;
        bVar5 = bVar1 < (byte)*pcVar4;
        if (bVar1 != *pcVar4) {
LAB_00401102:
          iVar3 = (1 - (uint)bVar5) - (uint)(bVar5 != 0);
          goto LAB_00401107;
        }
        if (bVar1 == 0) break;
        bVar1 = pbVar2[1];
        bVar5 = bVar1 < (byte)pcVar4[1];
        if (bVar1 != pcVar4[1]) goto LAB_00401102;
        pbVar2 = pbVar2 + 2;
      } while (bVar1 != 0);
      iVar3 = 0;
LAB_00401107:
      if ((iVar3 == 0) && (local_64 == 'E')) {
        MessageBoxA(param_1,s_Congratulation_!!_00406044,s_EasyCrackMe_00406058,0x40); // Congratulation 호출 코드
        EndDialog(param_1,0);
        return;
      }
    }
  }
  MessageBoxA(param_1,s_Incorrect_Password_00406030,s_EasyCrackMe_00406058,0x10);
  return;
}

전체 코드는 다음과 같습니다.

47번 줄의 코드를 보면 local_64의 변수에 값이 ‘E’인지 확인하는 조건문이 있습니다. 이를 통해서 첫글자가 ‘E’라는 사실을 알 수 있습니다. 25번 줄의 local_63 변수의 조건문을 볼 경우 ‘a’와 비교하는 조건문을 볼수 있었습니다. 이를 통해서 두번째 글자가 ‘a’라는 사실을 알 수 있습니다. 26번 줄과28번 줄은 각각 특정 문자열을 저장하는 문자열 변수 입니다 이를 통해서 남은 글자들을 찾을수 있었으며 이를 전부 조합하면 다음과 같은 정답이 나옵니다.

  • 정답 : Eas5yR3versing