경계 검사 로직 분석
다음은 방향에 따라 지도 내 이동을 제한하는 조건문입니다. 이 코드는 특정 방향으로 계속 이동하다가 장애물이 있을 때까지 진행되며, 경계를 넘어서지 않도록 보장합니다.
while (!map[v2]) {
if (v4 == -1 && (v2 & 0xF) == 0) return 0LL; // 왼쪽 이동 시 왼쪽 경계 도달
if (v4 == 1 && v2 % 16 == 15) return 0LL; // 오른쪽 이동 시 오른쪽 경계 도달
if (v4 == 16 && (unsigned int)(v2 - 240) <= 0xF) return 0LL; // 아래로 이동 시 하단 경계
if (v4 == -16 && (unsigned int)(v2 + 15) <= 0x1E) return 0LL; // 위로 이동 시 상단 경계
v2 += v4;
}
각 조건의 의미
(v2 & 0xF) == 0: 현재 위치가 열 기준으로 0번 인덱스(좌측 가장자리)인지 확인.v2 % 16 == 0와 동일함.v2 % 16 == 15: 열 기준 15번째(우측 가장자리)인지를 판단. 이 경우 오른쪽으로 더 이상 이동 불가.v2 - 240 <= 15: 행 기준 15번째(하단) 위치인지 확인. 16×16 지도에서 최하단은 240~255 범위.v2 + 15 <= 30: 상단 경계 여부. 즉, 0~15 행에 있는지 검사. 만약 위로 이동하면 유효한 범위 밖.
지역 데이터 추출 방법
지정된 메모리 영역의 값을 출력하여 미로 구조를 복원할 수 있습니다. IDA Pro에서 다음 스크립트를 사용하면 간편하게 처리 가능합니다.
#include <idc.idc>
static main() {
Message("\nStart:--------------------------------------------------------------------------------\n");
auto addr = 0x201020;
auto i = 0;
for (i = addr; i < 0x201120; i++) {
Message("0x%02x,", Byte(i));
}
Message("\nEnd:-----------------------------------------------------------------------------\n");
}
미로 시각화 및 해독
해당 데이터를 파싱하여 16×16 그리드로 변환하면 다음과 같은 미로 구조가 나타납니다. 비어 있는 칸은 '0', 장애물은 '*', 출구('!')는 '#'로 표시됩니다.
0000*0000000****
000**000**000000
00000000**0**000
000*0**0**0**000
000*0**0**0*0000
00**0**0000*0000
00000**0000*0000
*000000000000000
000000000000*000
000000***000*000
0000000***0000**
000*0*0*0*0000*0
00000000000000**
****0*0*0*0000*0
0*0*0*0*0*0000*0
0*0*0*0*0*#000**
출발점과 탐색 순서
초기 위치는 v2 = 0이며, 탐색 순서는 상 → 좌 → 하 → 우로 시도됩니다. 이는 각 방향에 대해 실패 시 다음 방향으로 전환하는 백트래킹 전략을 의미합니다.
최종 플래그는 주어진 미로를 기반으로 추론하여 생성됩니다. 출구는 '!'이며, 그 주변의 패턴을 분석하면 정답을 도출할 수 있습니다.
결과: flag{MEWEMEWJMEWJM}