드림핵 사이트의 워게임 rev-basic-2 문제 풀이 진행하겠습니다.
https://dreamhack.io/wargame/challenges/16/
문제 유형을 파악하기 위해 Windows의 PowerShell을 이용하여 프로그램을 실행시켜줍니다. 아래와 같이 임의의 문자열을 입력하면 'Wrong'이 출력됩니다.
이를 통해 오답 시 'Wrong', 정답 시 'Correct'가 출력됨을 예측할 수 있습니다.
main 함수를 디컴파일합니다. (단축키 F5)
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4));
sub_1400011B0("Input : ", argv, envp);
sub_140001210("%256s", v4);
if ( (unsigned int)sub_140001000((__int64)v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
sub_140001000 함수를 더블클릭하여 함수 내용을 확인합니다.
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x12; ++i )
{
if ( *(_DWORD *)&aC[4 * i] != *(unsigned __int8 *)(a1 + i) )
return 0i64;
}
return 1i64;
}
배열 aC는 한 번에 4바이트를 건너뛰어 접근합니다.
우리가 알고자 하는 배열 a1 중 한 글자라도 aC와 같지 않으면 0을 리턴하여 함수를 끝내버립니다. 따라서 a1은 aC와 동일해야 1을 리턴하여 main 함수에서 'Correct'를 출력할 수 있습니다.
배열 aC를 더블클릭하여 메모리 주소를 확인한 후
Hex View에서 해당 주소에 저장되어있는 문자들을 확인합니다.
Comp4re_the_arr4y