
문제 파일인 chall1.exe 파일을 IDA에서 실행해보겠습니다.
아래는 main 함수를 디컴파일한 코드입니다.
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_1400013E0("Input : ", argv, envp);
sub_140001440("%256s", v4);
if ( (unsigned int)sub_140001000(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
앞의 rev-basic-0과 동일하게 sub_1400013E0은 printf, sub_140001440은 scanf 함수입니다.
if문의 조건인 sub_140001000 함수를 살펴보겠습니다.
_BOOL8 __fastcall sub_140001000(_BYTE *a1)
{
if ( *a1 != 67 )
return 0LL;
if ( a1[1] != 111 )
return 0LL;
if ( a1[2] != 109 )
return 0LL;
if ( a1[3] != 112 )
return 0LL;
if ( a1[4] != 97 )
return 0LL;
if ( a1[5] != 114 )
return 0LL;
if ( a1[6] != 51 )
return 0LL;
if ( a1[7] != 95 )
return 0LL;
if ( a1[8] != 116 )
return 0LL;
if ( a1[9] != 104 )
return 0LL;
if ( a1[10] != 101 )
return 0LL;
if ( a1[11] != 95 )
return 0LL;
if ( a1[12] != 99 )
return 0LL;
if ( a1[13] != 104 )
return 0LL;
if ( a1[14] != 52 )
return 0LL;
if ( a1[15] != 114 )
return 0LL;
if ( a1[16] != 97 )
return 0LL;
if ( a1[17] != 99 )
return 0LL;
if ( a1[18] != 116 )
return 0LL;
if ( a1[19] != 51 )
return 0LL;
if ( a1[20] == 114 )
return a1[21] == 0;
return 0LL;
}
a1[0]부터 a1[20]까지의 데이터가 정해진 데이터와 같은지 비교해서 같으면 true를 리턴하는 함수입니다. 코드에서는 10진수로 주어져 있으므로 이를 아스키 코드로 변환하면 플래그를 구할 수 있습니다. IDA에서 숫자를 클릭한 후 r 키를 누르면 숫자를 문자로 변환할 수 있습니다.
아래는 문자로 변환한 화면입니다.

연결해보면 플래그가 Compar3_the_ch4ract3r 임을 알 수 있습니다.