암알못의 암호핥기 – 스테가노그래피

막내선원의 암알못 탈출기, 고전암호 마지막 챕터! 스테가노 그래피(Steganography)에 대해 알아봅니다 :)


이번 편에서는 고전 암호 중 스테가노그래피(Steganography)에 대해 알아보겠습니다.

스테가노그래피는 그리스어로 “감추어져있다”라는 뜻인 “stegano“와 그리스어로 “쓰다, 그리다”라는 뜻인 “graphos“의 합성어로, “감추어쓰다”라는 의미입니다.

사진, 음악, 동영상 등의 일반적인 파일 안에 데이터를 숨기는 기술을 말합니다.


1. 스테가노그래피 : 옛날

스테가노그래피가 최초로 사용된 것은 기워전 5세기로 알려져있습니다.

고대 그리스의 왕인 히스티에우스가 밀서를 전달하는 방법으로 노예의 머리를 깎고 머리에 메시지(문신)를 쓴 후 머리카락이 자라자 그 노예를 밀레투스로 보냈고, 받는 사람은 노예의 머리를 깎아 그 메시지를 읽었습니다.

메시지를 한 번 보낼 때 꽤 오랜 시간이 걸렸겠네요!

또 다른 방법으로는 투명 잉크를 사용하는 방법이 있었습니다.
과일 주스나 우유, 소변 등 자연원료를 이용하여 편지를 쓰고, 불에 그을리게 하거나 화학 반응을 통해 내용을 읽었습니다.

저희도 투명 잉크를 사용해 본 적이 있죠? :)
초등학교 시절 투명 볼펜이 한참 유행했었는데 생각 나시나요??
(투명한 잉크로 글 쓰고 뒤에 달린 보라색 형광펜으로 칠하면 글이 나타나는.. . 그 펜 뭐라고 부르지..)
레몬즙을 이용한 비밀 편지도 과학 교과서에서 한 번쯤 보셨을 것 같습니다.

[EBS 클립뱅크] 비밀편지 만들기

1. 소다수+페놀프탈레인 용액
2. 레몬즙으로 쓸 글씨+요오드팅크
3. 레몬즙으로 쓴 글씨+ 불

이역시 화학 반응을 이용한 비밀편지 입니다.

이 외에도 메시지가 적힌 비단을 첩자에게 삼키게 하는 등의 방법이 사용되었습니다.

조금 더 시간이 흘러서 기술이 발달하자 더 정교하고 감쪽같이 메시지를 숨기는 기술들이 등장했는데요, 어떤 방법들인지 아래에서 다루겠습니다:D


2. 스테가노그래피 : 이미지

이미지 스테가노그래피는 말 그대로 이미지 파일에 메시지를 숨기는 방법입니다.

숨기는 방법은 크게 두 가지로 구분되는데요.

삽입변조, 두 가지 방법을 알아보고 직접 해봅시다!


삽입

이미지에 데이터를 삽입하는 방법입니다.

JPEG, PNG, GIF 등의 파일에는 파일의 끝을 알리는 EOI(End of Image) 바이트가 존재하는데요,
JPEG의 경우 항상 FF D9 라는 시그니쳐로 끝나게 됩니다.

stegano01.JPG

EOI 바이트 뒤의 데이터는 무시되기 때문에 여기에 데이터를 숨길 수 있습니다.

stegano02.JPG

원본 이미지와 데이터를 숨긴 이미지를 비교해보면 차이가 없습니다.

원본

stegano03.JPG


스테가노그래피 이미지 1

stegano04.JPG

 

파일의 헤더에 데이터를 숨기는 방법도 있습니다.

파일의 헤더 중 이미지에 영향을 주지 않는 부분이 상당히 많은데, 이 영역에 데이터를 삽입합니다.

이번에도 JPEG 파일로 시험해봅시다.
JPEG의 경우 파일 세부 사항(만든이, 날짜 등등등)이 들어가는 APP0 ~ APP15 심볼의 시그니쳐(FF E0 ~ FF EF) 뒤부터 프레임의 시작(넓이, 높이 등)인 SOF0 심볼의 시그니쳐(FF DA) 전까지의 영역이 해당됩니다.stegano05.JPG

이 역시 원본 이미지와 보이는 모습은 똑같습니다.

스테가노그래피 이미지2

stegano06.JPG


 

변조

이번엔 이미지를 변조하여 데이터를 숨기는 방법입니다.

가장 일반적인 방법이 최하위 비트인 LSB를 변조하는 방법인데요, 주로 JPEG, BMP 같은 24비트 이미지파일에 적용됩니다.

실제 이미지에 영향을 주긴 하지만 24비트(빨강 8, 초록 8, 파랑 8)가 하나의 색을 표현하기 때문에 이미지가 변조되어도 사람의 눈으로 알아채기 힘듭니다.

편의상 BMP 파일을 대상으로 LSB를 수정해보겠습니다…라고 했는데, 워드프레스는 BMP 형식의 그림 업로드를 지원해주지 않네요ㅠ_ㅠ… 실제로 아래의 그림은 LSB를 일부 수정한 BMP 파일입니다. 업로드는 JPEG로!!

stegano07

여튼, 몇 개 바이트의 LSB를 수정했는데 눈으로 보기엔 부자연스러운 부분을 찾을 수 없습니다.

위의 이미지를 010Editor로 열어보겠습니다.

stegano08.JPG

흰색에 해당하는 0xFFFFFF와 하늘색에 해당하는 0x00B0F0을 볼 수 있는데요,
스크롤을 내리다보면 흰색 부분에 FE가 섞여있는 것을 볼 수 있습니다.
(그림에 흰색,검정,하늘색 밖에 사용하지 않았고 경계가 뚜렷하기 때문에 hex값을 보고 찾아낼 수 있는겁니다! 일반적인 경우, hex값을 보더라도 눈으로 찾기 어려워요!)

FE FF FE FE FE FE FF FE
FE FF FE FF FE FE FE FE
FE FF FE FF FE FE FF FF
FE FF FE FE FE FF FE FF
FE FF FE FE FE FE FF FF

이렇게 총 40 바이트를 가져왔습니다.
LSB를 따져보면 FE가 0, FF를 1로 생각할 수 있습니다.

이진수로 다시 나타내면 다음과 같습니다.

01000010
01010000
01010011
01000101
01000011

이것을 다시 ASCII 코드로 나타내면, “BPSEC“이 됩니다!


해보자!

이러한 방법들이 문제에는 어떻게 적용되고 어떻게 해독하는지, 문제풀이를 통해 알아봅시다.

[wechall] Training: Stegano I
This is the most basic image stegano I can think of.

점만한 bmp 파일을 줍니다. bmp 파일이면 LSB인가?? 에디터로 열어봅시다!

stegano09.JPG

앗!
회색 영역으로 표시된 54바이트의 영역비트맵 이미지의 헤더부분입니다.
그 뒤부터는 비트맵 이미지의 색상 정보(BGR 순)인데, 색상 정보 자체가 문자열이네요!
클리어ㅎ


너무 쉽게 풀려서 아쉬우니 빨리 다음 문제를 봅시다.

[wechall] Stegano Attachment

stegano10.jpg

이미지를 다운받으니 php파일이 다운받아졌는데요, 시그니쳐를 확인해보니 jpg 파일이어서 확장자를 바꿨습니다.

jpg 파일이면.. 우선 EOI 바이트를 확인합시다!!

stegano11.JPG

jpg 파일의 EOI 시그니쳐인 FF D9를 검색하니 일치하는 결과가 딱 하나 있었는데요,
바로 뒤에 압축 파일 시그니쳐PK(50 4B 03 04)가 보입니다! 추출추출!

stegano12.JPG

추출한 파일의 압축을 해제하니 solution.txt라는 파일이 나오고, 이 안에 플래그가 적혀있습니다 XD
파일의 끝에 또다른 파일을 숨긴 경우였네요!


삽입을 이용한 스테가노그래피 문제를 풀었으니 LSB 문제도 풀고 싶죠??

[wechall] Training: LSB

stegano13.png

LSB나 MSB를 이용하여 데이터를 숨긴다고 했었는데 꼭 최하위, 최상위 비트만 사용하는 것은 아닌가봅니다. 이 문제는 중간의 비트를 사용하여 데이터를 숨긴 경우더군요!

물론 이미지 스테가노그래피 풀어주는 좋은 툴들이 있지만! 저희는 원리를 알고싶은 거니까 코드를 짭니다!

파이썬 코드를 짜서 각 비트들을 확인한 결과, RGB 24bit 중 하나의 비트를 이용하여 데이터를 숨기고 있었습니다.

이 문제 역시 답이 계속 달라지는데요, 제가 푼 문제의 경우는 Red의 네 번째 비트를 사용했습니다.
Red의 네 번째 비트가 1인 경우는 0xFFFFFF(흰색), 0인 경우는 0x000000(검정색)으로 나타나도록 짰습니다.

다음은 그 파이썬 코드입니다.

'''
Image Steganography
Bit Solve Tool
'''

import Image

def bitSolve(img):
    img = Image.open(file)
    width, height = img.size

    for x in range(width):
        for y in range(height):
            curr_color = img.getpixel( (x,y) )
            r,g,b = curr_color

            if r&4 != 0:
                r,g,b = (0xFF, 0xFF, 0xFF)
            else:
                r,g,b = (0, 0, 0)

            img.putpixel( (x,y), (r,g,b) )

    img.save("solved.png","png")

if __name__ == '__main__':
    file = "DXvszyx7zAbjehgw.png"
    bitSolve(file)

RGB값을 어떻게 추출하나 막막했는데 다행히 Image라는 모듈이 있더라구요!
PIL(Pygthon Image Library) 설치 후 사용 가능합니다.

stegano14.png

해결 ㅎ
이렇게 보니 신기하네요!


마무리

이렇게 스테가노그래피에 대해 알아봤는데요, 이런 방법들 외에도 데이터를 숨기는 다양한 방법들이 존재합니다!

스테가노그래피가 실제로도 쓰이고 있는지 궁금한데요, 테러범들이 서로 소통할 때나 정부 첩보기관에서도 자주 사용되고 있는 기술이라고 하네요!

911테러 때 오사마 빈 라덴이 모나리자 그림에 비행기 도면을 숨겼고, 테러 집단 IS와 알카에다는 포르노 속에 비밀 사항을 숨겼고, 북한의 지령으로 국내에서 간첩 활동을 하던 왕재산도 문서에 지령을 숨기는 스테가노그래피 기법을 사용했다고 합니다.
주로 안 좋은 일에 많이 사용되는 것 같은 느낌이네요ㅠㅠ

범죄와 관련이 있다면 사진 하나, 동영상 하나도 가볍게 보고 넘어갈 수 없을것 같습니다.

다음 편에는 (고난이 예상되는) 현대암호편으로 돌아오겠습니다! :)

-written by rls1004

암알못의 암호핥기 – 스테가노그래피”의 3개의 생각

  1. 잘보고갑니다.

    좋아요

  2. 혹시 editor라고 하는 프로그램이 어떤 프로그램인가요? 궁금해서 찾아보긴 했는데 뭔질 모르겠네요..

    좋아요

송종인님에게 덧글 달기 응답 취소