Buuctf - oruga 지도 경계 처리 문제 분석

경계 검사 로직 분석

다음은 방향에 따라 지도 내 이동을 제한하는 조건문입니다. 이 코드는 특정 방향으로 계속 이동하다가 장애물이 있을 때까지 진행되며, 경계를 넘어서지 않도록 보장합니다.

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}

태그: IDAPython Reverse Engineering CTF maze solving boundary check

6월 5일 21:51에 게시됨