ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4팀_박윤진 write-ups (ctf-d_브리타니아의 원더랜드...)
    2021/Write-Ups 2021. 11. 16. 23:58

     

    color.png 파일을 다운받으면 아래와 같이 확인할 수 있다.

    기본적인 파일 정보를 확인해보면, 7x200픽셀에, 크기도 특별하게 크지 않고,

    HxD로 열어본 결과 특별하게 다른 파일 시그니처를 확인할 수 없었으므로 스테가노 그래피도 아니다.

    Photoshop으로 열어보면 딱 1픽셀 단위로, 두 가지 색으로만 찍혀있는 것을 확인할 수 있으며,

    (R: ff0000, 255 0 0 / B: ffffff, 255 255 255)

    이러한 특성으로 미루어보아 이진수, 이진 코드(binary code)를 생각할 수 있다.

    (즉, 어떤 데이터를 binary code로 변환한 뒤 0을 검은색, 1을 빨간색...이런 식으로 변환하였다 생각 가능)

     

    굳이 색이 아니더라도 어떤 특성이 명확하게 두 가지로 나뉘어진다면, 이진수를 생각해보는 것이 좋다.

    이 때 원본이라 말할 수 있는 "어떤 데이터"는 바로 flag 텍스트가 될 수도,

    또 다른 파일 데이터가 될 수도 있다.

     

    1) 텍스트 데이터일 경우(마지막에 chr로 변환)

    from PIL import Image
    
    pic = Image.open("../pythonProject/color.png")
    data = pic.load()
    
    width, height = pic.size
    
    red = (255, 0, 0)
    black = (255, 255, 255)
    
    binary_lines = []
    text = ""
    
    for y in range(height): # height = 7이므로, 7마다 하나의 line이 된다.
        binary_line = []
        for x in range(width):
            pixel = data[x, y]
    
            if pixel == red:
                binary_line.append('1')
            else:
                binary_line.append('0')
    
        print(binary_line)
        # 결과적으로 [0,1,0,1,0,0,0] 이런 식으로 하나의 line이 완성된다.
    
        binary_lines.append(binary_line) # line을 하나씩 저장한다.
    
    for i in binary_lines: # 아까 저장한 line을 하나씩 꺼내서
        # join(리스트): 리스트에 있는 인자를 하나의 문자열로 합쳐준다
        ## [0,1,0,1,0,0,0] → 0101000
        # int(값, 진수): '값'은 '진수'임을 명시, 이것을 십진수로 변환해준다.
        ## 0101000 → 40
        # chr(정수): ASCII코드표에 의해 정수를 문자로 변환한다
        text += ''.join([chr(int(''.join(i),2))])
    
    print(text)

    2) 파일 데이터일 경우(마지막에 hex로 변환)

    *현재 가로가 7픽셀이라 HEX가 00~FF이 아니라 00~7F까지밖에 표현이 되지 않기 때문에,

    2)보다는 1)이 유력함을 유추할 수 있다*

    text += ''.join([hex(int(''.join(i),2))])

    결과로 나온 text를 메모장에서 0x를 없애면,

    3378584b6b4673745455707347324946446972453678447263414638445378346957786435663949513954323035697a4e386c53324d51556c7346313167543454465848486c4c48564870724e54747268366c555266645557374c70757a677531564b7a7762316267316f7136416533476e796b6b4c5a5a736e7a653348564c78486c664359747a79726356324f7870304762305a32454c706852344f786f37547976484375574b576c4e3874384b49664879735a4b376a424e5075367752564555504977567261

    이 나오고, 정상적인 파일 형태는 아님을 알 수 있다.

     

     

    + 또한 빨강과 검정, 둘 중 어느 것이 0이고 1인지 모르니 두 경우 모두 시도해봐야 한다

    A) black 1 / red 0

    B) red 1 / black 0

     

    사실 1) 도 크게 플래그같지는 않지만, 일단 정상적인 문자열로 나왔으니 flag로 제출해본다.