드림핵 사이트의 워게임 rev-basic-1 문제 풀이 진행하겠습니다.
https://dreamhack.io/wargame/challenges/15/
문제 유형을 파악하기 위해 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_7FF6DDFF13E0("Input : ", argv, envp);
sub_7FF6DDFF1440("%256s", v4);
if ( sub_7FF6DDFF1000(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
sub_7FF6DDFF1000 함수를 더블클릭하여 함수 내용을 확인합니다.
_BOOL8 __fastcall sub_7FF6DDFF1000(_BYTE *a1)
{
if ( *a1 != 67 )
return 0i64;
if ( a1[1] != 111 )
return 0i64;
if ( a1[2] != 109 )
return 0i64;
if ( a1[3] != 112 )
return 0i64;
if ( a1[4] != 97 )
return 0i64;
if ( a1[5] != 114 )
return 0i64;
if ( a1[6] != 51 )
return 0i64;
if ( a1[7] != 95 )
return 0i64;
if ( a1[8] != 116 )
return 0i64;
if ( a1[9] != 104 )
return 0i64;
if ( a1[10] != 101 )
return 0i64;
if ( a1[11] != 95 )
return 0i64;
if ( a1[12] != 99 )
return 0i64;
if ( a1[13] != 104 )
return 0i64;
if ( a1[14] != 52 )
return 0i64;
if ( a1[15] != 114 )
return 0i64;
if ( a1[16] != 97 )
return 0i64;
if ( a1[17] != 99 )
return 0i64;
if ( a1[18] != 116 )
return 0i64;
if ( a1[19] != 51 )
return 0i64;
if ( a1[20] == 114 )
return a1[21] == 0;
return 0i64;
}
구하고자 하는 a1은
각 if절마다 주어진 숫자를 문자로 변환한 것과 일치해야합니다.
그래야 1을 리턴하여 main 함수에서 'Correct'를 출력합니다.
두 가지 방법
a. IDA 에서 단축키 'r' 이용해 아스키코드 변환
b. python으로 숫자를 문자로 변환하는 코드 작성
방법 b를 사용하여 코드를 작성해보겠습니다.
nums = [67, 111, 109, 112, 97, 114, 51, 95, 116, 104, 101, 95, 99, 104, 52, 114, 97, 99, 116, 51, 114, 0]
for i in range(len(nums)) :
print(chr(nums[i]), end='')
위 코드로 출력된 문자열이 정답입니다.
정답 : Compar3_the_ch4ract3r