Yozzang의 해킹일기 💻
article thumbnail
728x90

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


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

Level 18

## 문제 해석 : 

문제의 제목을 보면 "can you tell the difference?"라고 되어있다. 해당 사진의 차이는 바로 밝기(brightness)이다. brightness.html로 접속하면 진짜 문제가 보인다.

### 공격문 : http://www.pythonchallenge.com/pc/return/brightness.html

### 실행 결과 : 

brightness.html

개발자 도구를 확인해보면 다음과 같이 deltas.gz라는 파일이 존재하는 것을 확인할 수 있다.

개발자 도구

해당 파일을 다운로드해서 분석해보면 되는 것으로 보인다.

## 문제 풀이 : 

gz파일을 압축해제하면 다음과 같아 좌우로 나뉜 16진수들이 출력된 것을 확인할 수 있다.

delta.txt

다운로드한 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)

### 실행 결과 : 

f.png
f1.png
f2.png

위와 같이 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
profile

Yozzang의 해킹일기 💻

@요짱

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