이번 포스트에서는 Python Challenge의 Level 21 문제에 대해 다루겠다.
문제를 클릭하면 다음과 같은 페이지가 출력된다.
## 문제 해석 :
파일을 HexEditor로 실행하면 다음과 같다.
헤더의 시작부분은 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 |