[Dreamhack] Small Counter

chrmqgozj·2025년 2월 6일

DreamHack

목록 보기
16/39
  1. main
int __fastcall main(int argc, const char **argv, const char **envp)
{
  __int64 src[10]; // [rsp+0h] [rbp-F0h] BYREF
  char dest[72]; // [rsp+A0h] [rbp-50h] BYREF
  unsigned int i; // [rsp+ECh] [rbp-4h]

  puts("---Counter---");
  for ( i = 10; (int)i > 0; --i )
  {
    printf("%d\n", i);
    if ( i == 3 )
    {
      strcpy((char *)src, "IM{508889j32j87j9jg54650840428hjhi2ii08h74ihj538h543j7g6k5jk8jih22f}");
      memcpy(dest, src, 0x45uLL);
    }
  }
  puts("---END---");
  return 0;
}

이번 문제는 추가 함수가 main에 없다.

문제에서 flag_enc 함수를 실행시키라고 했으니 찾아보자.

  1. flag_enc
_BYTE *__fastcall flag_gen(const char *a1, __int64 a2, int a3)
{
  size_t v3; // rbx
  _BYTE *result; // rax
  char v6[64]; // [rsp+20h] [rbp-A0h]
  char v7[32]; // [rsp+60h] [rbp-60h] BYREF
  char v8[35]; // [rsp+80h] [rbp-40h] BYREF
  char v9; // [rsp+A3h] [rbp-1Dh]
  int j; // [rsp+A4h] [rbp-1Ch]
  int i; // [rsp+A8h] [rbp-18h]
  int v12; // [rsp+ACh] [rbp-14h]

  strcpy(v8, "abcdefghijklmnopqrstuvwxyz");
  strcpy(v7, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  for ( i = 0; i <= 25; ++i )
  {
    v6[(a3 + i) % 26 + 32] = v8[i];
    v6[(a3 + i) % 26] = v7[i];
  }
  v6[i + 32] = 0;
  v6[i] = 0;
  for ( j = 0; ; ++j )
  {
    v3 = j;
    if ( v3 >= strlen(a1) )
      break;
    v9 = a1[j];
    if ( ((*__ctype_b_loc())[v9] & 0x200) != 0 )
    {
      *(_BYTE *)(a2 + j) = v6[v9 - 65];
    }
    else if ( ((*__ctype_b_loc())[v9] & 0x100) != 0 )
    {
      *(_BYTE *)(a2 + j) = v6[v9 - 65];
    }
    else if ( ((*__ctype_b_loc())[v9] & 0x800) != 0 )
    {
      v12 = (a3 + 3) * v9 % 9;
      if ( v12 <= 7 || v12 > 9 )
        v12 += 50;
      else
        v12 += 40;
      *(_BYTE *)(j + a2) = v12;
    }
    else
    {
      *(_BYTE *)(a2 + j) = v9;
    }
  }
  result = (_BYTE *)(a2 + strlen(a1));
  *result = 0;
  return result;
}

flag_enc를 어디서 실행하는지 찾아보니

main에서 실행이 된다. 그런데 왜 디컴파일을 하면 c 코드에는 없을까?

var_4는 for문에서 i다. i가 0이 되면 for문을 빠져나오게 된다.
이후 5와 비교하여 5가 아니면 loc_15FE로 jmp하여 중간에 있는 코드(flag_enc 실행 코드)를 모두 건너뛰게 된다. 그러면 저 위치에서 i를 5로 바꿔주자.

  1. exploit

0개의 댓글