
문제를 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이 문제의 플래그입니다.