WarGame/DigitalForensic with CTF

[DigitalForensic] with CTF 이 그림에는 뭔가 좀 수상한…

사진을 다운로드 받으면 별로 차이나지않는 두개의 사진이 보인다.

아마도 LSB방식을 통한 steganography가 사용된거 같다. 우선 bit 차이가 있는 곳을 알아보기 위해서 다음의 코드를 사용했다.

 

from PIL import Image

if __name__=="__main__" :
    
    B = (0,0,0)
    W = (255,255,255)

    im1 = Image.open("original.png")
    im2 = Image.open("encrypted.png")
    im3 = Image.new(im1.mode,im1.size)    

    width,height = im1.size

    for x in range(width) :
        for y in range(height) :
            if(im1.getpixel((x,y))==im2.getpixel((x,y))) :
                im3.putpixel((x,y),W)
            else:
                im3.putpixel((x,y),B)

    im3.save("asdf.png")

다음의 사진을 얻을 수 있었다.

검사를 해보니 차이가 나는 저 좌측 상단은 49*7이다. height가 7인것을 보아하니 HSB를 0으로 바이트 처리하기 너무너무 좋은 거 같다. 

from PIL import Image

if __name__=="__main__" :
    
    new_x = 49
    new_y =7
    B = (0,0,0)
    W = (255,255,255)
    NB = (0,0,0,255)
    NW = (255,255,255,255)

    im1 = Image.open("original.png")
    im2 = Image.open("encrypted.png")
    im3 = Image.new(im1.mode,(new_x,new_y))    

    width,height = im1.size

    for x in range(new_x) :
        for y in range(new_y) :
            if(im1.getpixel((x,y))==im2.getpixel((x,y))) :
                im3.putpixel((x,y),W)
            else:
                im3.putpixel((x,y),B)
                
    im1.close()
    im2.close()

    ans = ""

    for x in range(new_x) :
        byte = ""
        for y in range(new_y) :
            if(im3.getpixel((x,y))==NB) :
                byte+="1"
            elif(im3.getpixel((x,y))==NW):
                byte+="0"
        ans+=chr(int(byte,2))
    print(ans)

아까 쓴 코드에 이어서 쓴다고 조금은 더러운데, 결론은 검정색을 1로, 하얀색을 0으로 읽고 byte열로 처리해본거다. 다음과 같은 문자열을 얻을 수 있다.

다음 문자열을 SHA256처리하라고 한다.

?? 아 대문자다