[드림핵 리버싱] Wargame : rev-basic-0

asdf·2025년 1월 28일

reversing

목록 보기
2/5

문제


풀이


문제를 IDA를 사용하여 분석해 보겠습니다.
아래는 chall0.exe를 IDA로 실행한 화면입니다.

화면 좌측에 있는 함수 리스트에서 main 함수를 찾아 클릭 후 f5를 눌러 디컴파일 해보겠습니다.

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char v4[256]; // [rsp+20h] [rbp-118h] BYREF

  memset(v4, 0, sizeof(v4));
  sub_140001190((__int64)"Input : ", argv, envp);
  sub_1400011F0("%256s", v4);
  if ( sub_140001000(v4) )
    puts("Correct");
  else
    puts("Wrong");
  return 0;
}

sub_140001190 함수부터 살펴보겠습니다.

__int64 sub_140001190(__int64 a1, ...)
{
  FILE *v1; // rax
  va_list va; // [rsp+48h] [rbp+10h] BYREF

  va_start(va, a1);
  v1 = _acrt_iob_func(1u);
  return (unsigned int)sub_140001060(v1, a1, 0LL, (__int64 *)va);
}

va_start 함수와 _acrt_iob_func(1) 함수가 사용되는 것으로 보아 printf 함수임을 알 수 있습니다.

다음은 sub_1400011F0 함수입니다.

__int64 sub_1400011F0(const char *a1, ...)
{
  FILE *v1; // rax
  va_list va; // [rsp+48h] [rbp+10h] BYREF

  va_start(va, a1);
  v1 = _acrt_iob_func(0);
  return (unsigned int)sub_1400010B0(v1, a1, 0LL, (__int64 *)va);
}

va_start 함수와 _acrt_iob_func(0) 함수가 사용되었으므로 scanf 함수임을 알 수 있습니다.

이제 if문 내부 조건인 sub_140001000 함수를 살펴보겠습니다.

_BOOL8 __fastcall sub_140001000(const char *a1)
{
  return strcmp(a1, "Compar3_the_str1ng") == 0;
}

Compar3_the_str1ng 과 a1이 일치하면 1을 true를 반환한다는 것을 알 수 있습니다.

sub_140001000가 true를 반환할 때 프로그램에서 Correct를 출력하므로 Compar3_the_str1ng이 문제의 플래그입니다.

profile
Rainy Waltz(a_hisa)

0개의 댓글