

올바른 값을 입력해야 플래그값이 나올 것 같다. ida를 통해 살펴보겠다.

디컴파일힌 코드 결과
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_7FF6D1FB11C0("Input : ", argv, envp);
sub_7FF6D1FB1220("%256s", v4);
if ( (unsigned int)sub_7FF6D1FB1000((__int64)v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
위 코드를 살펴보니 'Correct' 문구가 나오게 하도록 하는 방법은 'sub_7FF6D1FB1000'함수 조건이 참이면 'Correct' 문구가 나온다는 것을 알 수 있다. 때문에 'sub_7FF6D1FB1000'함수 관련 코드도 확인해봐야 할 것 같다.
sub_7FF6D1FB1000 함수 관련 코드 결과
__int64 __fastcall sub_7FF6D1FB1000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x18; ++i )
{
if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_7FF6D1FB3000[i] )
return 0LL;
}
return 1LL;
}

로직
0x18(16) = 24(10) - 24번 반복
byte_140003000 한글자씩 비교하여 성공 여부 결정
return 0LL : 0 반환 = 실패
return 1LL : 1 반환 = 성공
계산되는 방식
al[0x1] + al[0x0] = byte_140003000[0x0] = 0xAD
al[0x2] + al[0x1] = byte_140003000[0x1] = 0xD8
...
al[0x16] + al[0x17] = byte_140003000[0x16] = 0x4C
al[0x17] + al[0x18] = byte_140003000[0x17] = 0x0
=> al[0x17], al[0x18] = 0x0
끝에 0x17과 0x18의 값을 알기 때문에 거꾸로 계산하면서 복호화를 진행하여 플래그값을 확인하면 된다.
복호화 코드
a = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00]
str = 0
flag = []
for i in range(len(a), -1, -1):
latest = a[i] - str
flag.append(chr(str))
flag.reverse()
print(flag)
[Reference]
https://esyeonge.tistory.com/74
https://velog.io/@helenason/dreamhack-wargame-rev-basic-5
https://ye0ngjae.tistory.com/99