Yozzang의 해킹일기 💻
article thumbnail
728x90

이번 포스트에서는 Python Challenge의 Level 24 문제에 대해 다루겠다.


문제를 클릭하면 다음과 같은 페이지가 출력된다.

Level 24

## 문제 해석 : 

미로 사진이 출력되어 있다. 우선 해당 미로의 시작과 끝을 찾은 다음에 미로를 풀면 되는 것으로 보인다.

## 문제 풀이 : 

우선 파이썬을 통해 미로의 시작점과 끝점을 알아내보겠다.

### 공격 코드 : 

from PIL import Image

maze = Image.open("maze.png")

w, h = maze.size

for i in range(w): # Top line
    print(maze.getpixel((i, 0)))

print("================= Top, Bottom 구별 선 =================")

for i in range(h): # Bottom line
    print(maze.getpixel((i, h-1)))

### 실행 결과 : 

출력 결과

출력 결과를 확인해보면 (255, 255, 255, 255)가 벽으로 보이며, 시작점이 (w - 2, 0), 끝점이 (1, h - 1)인 것을 알 수 있다.

 

이어서 해당 미로를 풀어야 하는데, 여기서는 너비 우선 탐색(BFS) 알고리즘을 활용해보겠다. 너비 우선 탐색 알고리즘에 관한 설명은 아래 포스트에 확인할 수 있다.

 

너비 우선 탐색(Breadth-First Search)

이번 포스트에서는 너비 우선 탐색(BFS) 알고리즘에 대해 다루도록 하겠습니다. 너비 우선 탐색(BFS)이란? : 루트 노드(혹은 임의의 노드)부터 시작해서 인접한 노드를 먼저 탐색하는 방법입니다.

jy05un.tistory.com

 

 

 

 

### 공격 코드 : 

from PIL import Image

maze = Image.open("maze.png")
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # 상하좌우
wall = (255, 255, 255, 255)
w, h = maze.size

next_step = {}

ent = (w-2, 0)  # 시작점
exit = (1, h-1)  # 끝점
queue = [exit]

while queue:
    pos = queue.pop(0)
    if pos == ent:
        break
    for d in directions:
        tmp = (pos[0] + d[0], pos[1] + d[1])
        # 경로 탐색
        if not tmp in next_step and 0 <= tmp[0] < w and 0 <= tmp[1] < h and maze.getpixel(tmp) != wall:
            next_step[tmp] = pos
            queue.append(tmp)

path = []
while pos != exit:
    path.append(maze.getpixel(pos)[0])
    pos = next_step[pos]

print(path[1::2])
open("maze.zip", "wb").write(bytes(path[1::2])) # zip파일 출력

### 실행 결과 : 

maze.zip

경로를 탐색하다 보면 픽셀, 즉 non-wall의 값은 (x, 0, 0, 255)로 이루어져 있다. 또한 해당 값이 PK(zip의 헤더)로 시작된다. zip파일을 출력하고 압축해제하면 lake라는 단어가 적힌 사진을 볼 수 있다. 

### 최종 공격문 : http://www.pythonchallenge.com/pc/hex/lake.html

### 실행 결과 : 

공격 성공

Level 25로 넘어간 것을 확인할 수 있다.

'Wargame > Python Challenge' 카테고리의 다른 글

Python Challenge (Level 23)  (1) 2022.09.22
Python Challenge (Level 22)  (0) 2022.09.21
Python Challenge (Level 21)  (1) 2022.09.20
Python Challenge (Level 20)  (1) 2022.09.19
Python Challenge (Level 19)  (0) 2022.09.18
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!