이번 포스트에서는 Python Challenge의 Level 18 문제에 대해 다루겠다.
문제를 클릭하면 다음과 같은 페이지가 출력된다.
## 문제 해석 :
문제의 제목을 보면 "can you tell the difference?"라고 되어있다. 해당 사진의 차이는 바로 밝기(brightness)이다. brightness.html로 접속하면 진짜 문제가 보인다.
### 공격문 : http://www.pythonchallenge.com/pc/return/brightness.html
### 실행 결과 :
개발자 도구를 확인해보면 다음과 같이 deltas.gz라는 파일이 존재하는 것을 확인할 수 있다.
해당 파일을 다운로드해서 분석해보면 되는 것으로 보인다.
## 문제 풀이 :
gz파일을 압축해제하면 다음과 같아 좌우로 나뉜 16진수들이 출력된 것을 확인할 수 있다.
다운로드한 gz파일을 difflib라는 파이썬의 라이브러리를 통해 이 두개로 나뉜 16진수의 차이점을 구해보겠다.
### 공격 코드 :
import gzip
import difflib
data = gzip.open("deltas.gz")
d1, d2 = [], []
for line in data:
d1.append(line[:53].decode()+"\n")
d2.append(line[56:].decode())
compare = difflib.Differ().compare(d1, d2)
for i in compare:
print(i)
### 실행 결과 :
여기서 부호가 +인 것은 오른쪽만, -인 것은 왼쪽만, 부호가 없는 것은 공통의 파일이다. 해당 규칙을 활용하여 파일을 분류하여 출력해보겠다.
### 공격 코드 :
import gzip
import difflib
data = gzip.open("deltas.gz")
d1, d2 = [], []
for line in data:
d1.append(line[:53].decode()+"\n")
d2.append(line[56:].decode())
compare = difflib.Differ().compare(d1, d2)
f = open("f.png", "wb")
f1 = open("f1.png", "wb")
f2 = open("f2.png", "wb")
for line in compare:
bs = bytes([int(o, 16) for o in line[2:].strip().split(" ") if o])
if line[0] == '+':
f1.write(bs)
elif line[0] == '-':
f2.write(bs)
else:
f.write(bs)
### 실행 결과 :
위와 같이 3장의 사진이 출력된 것을 확인할 수 있다. f.png에 나온 주소에 접속해보겠다.
### 최종 공격문 : http://www.pythonchallenge.com/pc/hex/bin.html
### 실행 결과 :
Level 19로 넘어간 것을 확인할 수 있다. (여기서 사용자 이름과 비밀번호는 각각 butter와 fly이다.)
'Wargame > Python Challenge' 카테고리의 다른 글
Python Challenge (Level 20) (1) | 2022.09.19 |
---|---|
Python Challenge (Level 19) (0) | 2022.09.18 |
Python Challenge (Level 17) (0) | 2022.09.16 |
Python Challenge (Level 16) (0) | 2022.09.15 |
Python Challenge (Level 15) (0) | 2022.09.11 |