본문 바로가기
CTF, 워게임 문제 풀이/CTF-d

[Multimedia] 9. 브리타니아의 원더랜드... 문제풀이

by secumark 2021. 12. 26.
728x90

 

 

 

 

브리타니아의 원더랜드에는 적룡과 흑룡이 있다. Master Zero는 흑룡의 지휘관이며 모든 흑룡이 그를 지원한다. 적룡의 지휘관 Amiya는 적룡과 흑룡중에서 적룡이 최고라고 생각한다. 그래서 그는 흑룡들에게 교훈을 가르치려고 한다. 그들은 이 이미지에서 메시지를 인코딩한 후 메시지를 디코딩하도록 요청했다. 메시지를 볼 수 있는가?

 

 

 

헉 맞춘 사람이 별로 없다...!

 

 

 

 

png 파일은 이렇게 생겼다

 

일단 저장..

 

메시지를 인코딩해놨으니 디코딩하라는데..

 

고민 고민하다가 절대 안 풀릴거 같아서 해답보면서 풀이했다.

 

역시나 파이썬 코드를 활용해야만 했다.

 

지금 이 사진에 색깔이 빨간색, 검정색으로 2개가 있으니까 문제에 나와있는대로 예측해보면 검정색은 이진수 0으로, 빨간색은 이진수 1로 변환해서 풀면 될 것 같다. 그 다음에 이진수값을 아스키코드로 변환하면 될듯.

 

 

 

컴공과가 아니라 어쩔 수 없이 코드를 봐야만 했다..

 

from PIL import Image

img = Image.open("color.png")
data = img.load()
red = (255, 0, 0)

text = ""

binary_lines = []
width, height = img.size

for x in range(height):
    binary_line = []
    for y in range(width):
        pixel = data[y,x]
        if pixel == red:
            binary_line.append('1')
        else:
            binary_line.append('0')
    binary_lines.append(binary_line)

for x in binary_lines:
    text += ''.join([chr(int(''.join(x),2))])

print(text)

 

 

여기서 파이썬 PIL이란?

Python Imaging Library은 파이썬 인터프리터에 다양한 이미지 파일 형식을 지원하고 강력한 이미지 처리와 그래픽 기능을 제공하는 자유-오픈 소스 소프트웨어 라이브러리이다. 줄여서 PIL이라고 부른다. 윈도우와 맥 오에스 엑스, 리눅스를 지원한다.

 

pip install image

pip install pillow를 

cmd 창에서 해주었다. 환경변수도 추가해줌.

 

 

나는 IDLE(PYTHON 3.9)을 사용 중이라 다시 재시작해서 실행해줬더니 플래그 값이 출력됐다.

 

 

 

from PIL import Image -> image 라이브러리에서 PIL 불러옴

img = Image.open("color.png") -> color.png 파일을 연다는 뜻

여기서 Image는 다 I에 대문자를 붙이나보다.


data = img.load() -> load 함수를 쓰는 이유는 픽셀 값에 접근하기 위해서라고 한다. 그걸 data라는 변수에 저장
red = (255, 0, 0) -> RGB 색상 기준 255, 0, 0은 빨간색을 의미한다.

text = ""

binary_lines = [] -> 내가 파이썬을 잘 몰라서.. []는 아마 리스트를 나타내는게 아닐까?
width, height = img.size -> img.size는 (가로,세로)를 나타냄

for x in range(height):
    binary_line = []
    for y in range(width):
        pixel = data[y,x]
        if pixel == red:
            binary_line.append('1')
        else:
            binary_line.append('0')
    binary_lines.append(binary_line)
-> for문을 사용함. 

 

for x in range(height)라는게 height가 될 때까지 binary_line에 .. 추가한다는건가?

그리고 for y in range(width)에 pixel=data[y,x] 부분에 x,y 값도 넣어주고..

append는 내가 알기로 추가한다는건데 pixel==red가 나오면 binary_lines.append(binary_line)을 출력하나보다

여기서 pixel == red는 255,0,0이고, data[y,x]가 pixel==red 값을 충족시켜주면 되겠다.

 


for x in binary_lines:
    text += ''.join([chr(int(''.join(x),2))])

 

-> 근데 이 부분은 무슨 소리인지 전혀 모르겠음..


print(text)

 

 

파이썬 공부 좀 해야겠다 ,,^^ 검색해보니까 다들 write up 참고해서 푸신듯.. 어려웠다.

 

 

 

flag 값: 3xXKkFstTUpsG2IFDirE6xDrcAF8DSx4iWxd5f9IQ9T205izN8lS2MQUlsF11gT4TFXHHlLHVHprNTtrh6lURfdUW7Lpuzgu1VKzwb1bg1oq6Ae3GnykkLZZsnze3HVLxHlfCYtzyrcV2Oxp0Gb0Z2ELphR4Oxo7TyvHCuWKWlN8t8KIfHysZK7jBNPu6wRVEUPIwVra

 

 

 

 

 

나중에 꼭 다시 풀어보기

 

 

 

 

728x90

댓글