SWING

WeChall Traning: LSB

오호츠크해 기단 2022. 8. 7. 14:23
728x90

http://www.wechall.net/challenge/training/stegano/LSB/index.php

색 변환 툴

https://stegonline.georgeom.net/upload

 

[WeChall] Training: LSB

Training: LSB - The least significant bit This is a very simple, yet spectacular trick. Can you see the hidden solution? Note: The solution is bound to your session ID and consists of twelve letters. Hidden Hint: http://wechall.blogspot.com/2007/11/stegana

www.wechall.net

 

문제 파일

플래그는 세션 ID에 바인딩되며 12자로 구성되어 있다고 한다. stegsolve.jar을 이용해서 풀면 더욱 빨리 풀 수 있지만 원리를 알아보기 위해서  파이썬 코드를 직접 짜서 문제를 해결할 것이다.

RGB 값을 파이썬의 Image 모듈을 이용해서 추출했다. Image 모듈을 사용하려면 파이썬 PIL(Pygthon Image Library)를 설치해야 한다.  cmd창을 열어서 PIL라이브러리를 설치해준다.

픽셀은 크게 두 가지의 정보를 가지고 있다.

1. 픽셀의 위치(X, Y)

2. 픽셀의 색깔(R, G, B)

 

size명령어를 통해 문제 이미지의 정확한 픽셀의 개수를 파악하고 for문으로 모든 픽셀에 대한 탐색을 할 것이다.

getpixel함수를 이용해서 각 위치에서 rgb값을 추출해준다.

from PIL import Image

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

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

Green의 여덟 번째 비트가 1인 경우는 0xFFFFFF(흰색), 0인 경우는 0x000000(검정색)을 r,g,b 변수에 저장하고

putpixel함수를 이용해서 그 값을 해당 위치의 픽셀에 넣었다.

#0xFFFFFF(흰색),  0x000000(검정색)
if g&8 != 0: #Green의 여덟 번째 비트가 1인 경우
	r,g,b = (0xFF,0xFF,0xFF) #흰색으로

else: #Green의 여덟 번째 비트가 0인 경우
	r,g,b = (0,0,0) #검정색으로

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

#이미지를 solved.png 파일로 저장
img.save("solved.png","png")

메인 코드

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

코드 전체

from PIL import Image

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

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

            #0xFFFFFF(흰색),  0x000000(검정색)
            if g&8 != 0: #Green의 여덟 번째 비트가 1인 경우
                r,g,b = (0xFF,0xFF,0xFF) #흰색으로

            else: #Green의 여덟 번째 비트가 0인 경우
                r,g,b = (0,0,0) #검정색으로

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

    #이미지를 solved.png 파일로 저장
    img.save("solved.png","png")

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

코드를 실행하면 solved.png 파일이 생긴다.

FLAG: OGBDECHFBGCI

참고:

https://blackperl-security.gitlab.io/blog/2016/12/04/2016-12-04-amalmot/

https://blog.naver.com/jsk6824/222004059178