Yozzang의 해킹일기 💻
article thumbnail
728x90

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


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

Level 21

## 문제 해석 : 

파일을 HexEditor로 실행하면 다음과 같다.

package.pack

헤더의 시작부분은 78 9c이다. 이는 zlib의 확장자이므로 해당 파일을 확장자별로 압축 해제하면 되는 것으로 보인다.

## 문제 풀이 : 

파이썬을 통해 해당 파일안의 모든 확장자를 하나씩 확인해보겠다.

### 공격 코드 :

import zlib

with open("package.pack", "rb") as f:
    data = f.read()

    while 1:
        try:
            data = zlib.decompress(data)
            print(data[0:2])
        except:
            break

### 실행 결과 : 

출력 결과

x9c는 zlib, BZ는 bz2의 확장자이다. 이어서 확장자를 계속 찾아보겠다.

### 공격 코드 : 

import urllib.request
import base64

request = urllib.request.Request(
    "http://www.pythonchallenge.com/pc/hex/unreal.jpg")
vertify = base64.b64encode(b"butter:fly")
request.add_header("Authorization", f"Basic {vertify.decode()}")

request.headers["Range"] = "bytes=%i-" % (int(2123456789) + 1)
response = urllib.request.urlopen(request)
print(response.headers)
print(response.read().decode())

### 실행 결과 : 

출력 결과

80 8d로 시작하는 확장자는 없다. 여기서는 readme의 "I look backwards"라는 힌트를 봐야 한다. 이는 거꾸로 보라는 뜻이다. 즉, 파일이 뒤집어져 있다. 따라서 헤더의 시작 부분이 아닌 끝 부분을 통해 해당 파일의 확장자를 알아낼 수 있을 것이다. 확인해본 결과 마지막 파일도 zlib 파일이다.

 

그럼 이어서 모든 파일을 압축 해제하고 데이터를 출력해보겠다.

### 공격 코드 : 

import bz2
import zlib

with open("package.pack", "rb") as f:
    data = f.read()

    while 1:
        if data.startswith(b"x\x9c"):
            data = zlib.decompress(data)
        elif data.startswith(b"BZ"):
            data = bz2.decompress(data)
        elif data.endswith(b"\x9cx"):
            data = data[::-1]  # 데이터 뒤집기
        else:
            break

    print(data)

### 실행 결과 : 

출력 결과

거꾸로 하면 "look at your logs"라는 문장이 된다. 즉 로그를 추가하면 되는 것으로 보인다.

### 공격 코드 : 

import bz2
import zlib

rst = ""

with open("package.pack", "rb") as f:
    data = f.read()

    while 1:
        if data.startswith(b"x\x9c"):
            data = zlib.decompress(data)
            rst += " "
        elif data.startswith(b"BZ"):
            data = bz2.decompress(data)
            rst += "@"
        elif data.endswith(b"\x9cx"):
            data = data[::-1]  # 데이터 뒤집기
            rst += "\n"
        else:
            break

    print(rst)

### 실행 결과 : 

출력 결과

copper라는 단어가 출력된 것을 확인할 수 있다.

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

### 실행 결과 : 

공격 성공

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

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

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

Yozzang의 해킹일기 💻

@요짱

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