본문 바로가기

#Digital Forensic with CTF/CTF-d_Multimedia

CTF-d_Multimedia #32 d4rth는 더러운 방법을...

반응형

출처) http://www.ctf-d.com/

 

[DigitalForensic] with CTF

 

www.ctf-d.com

 

[문제]

 

 

[original.png, encrypted.png]

 

  • 주어진 파일은 겉보기엔 같은 파일이다. 

 

[속성]

 

  • 하지만 속성을 확인해 보면 파일 크기가 다르다.

 

[compare]

 

  • sudo apt-get install imagemagick
  • compare명령어로 각 파일을 비교한다.
  • display명령어로 둘의 다른 부분을 diff.png로 저장하였다.

 

[diff.png]

 

  • 왼쪽 상단에 빨간 픽셀이 보인다.
  • 빨간색과 아닌 부분을 0과 1로 구분하여 바이너리로 표현한 후 문자열로 바꾸면 될 것 같다.

 

from PIL import Image

f=Image.open("E:/forensics/CTF-d/Multimedia/32/diff.png")

for i in range(f.size[0]):
    for j in range(f.size[1]):
        pixel=f.getpixel((0,0))
        
 print(pixel)        
    

 

  • (0,0) 좌표의 픽셀값을 뽑아보니 (193,0,24,255)가 나왔다.
  • 이것과 같은 픽셀을 가진 위치를 뽑으면 구간을 알 수 있을 것 같다.

 

from PIL import Image

f=Image.open("E:/forensics/CTF-d/Multimedia/32/diff.png")

for i in range(f.size[0]):
    for j in range(f.size[1]):
        pixel=f.getpixel((i,j))
        
        if pixel == (193,0,24,255):
            print(i,j,pixel)   

[결과]

 

  • 출력결과가 살짝 이상하다.......
  • 너비는 48까지이고, 높이는 6까지 인 것 같은데 마지막 결과에서 높이가 1로 끝난다.....;;;;

 

from PIL import Image

f=Image.open("E:/forensics/CTF-d/Multimedia/32/diff.png")

result=""


for i in range(49):
    byte=""
    for j in range(7):
        pixel=f.getpixel((i,j))
        print("[%d,%d] %s"%(i,j,pixel))

[빨간색 픽셀좌표]

 

  • 오우......빨간색 픽셀이 하나가 아니였다.....
  • 미세하게 다르다........
  • 그냥 이미지 두개를 비교하여 틀린부분을 바이너리로 바꿔야 할 것 같다.

 

from PIL import Image

img1=Image.open("E:/DaJung/forensics/CTF-d/Multimedia/32/original.png")
img2=Image.open("E:/DaJung/forensics/CTF-d/Multimedia/32/encrypted.png")
result = ""

for x in range(49):
    byte = ""
    for y in range(7):
        pixel_img1 = img1.getpixel((x,y))
        pixel_img2= img2.getpixel((x,y))
            
        if pixel_img1 != pixel_img2:
            byte += '1'
                 
        else:
            byte += '0'
                
        #print(byte)
    result += chr(int(byte,2)) # byte를 원래 문자로 변환 

print(result)

 

[flag가 아니네]

 

  • 출력값 중에 { }안의 값을 SHA256으로 해쉬값을 생성하면 플래그가 나온다.

 

[flag]

 

  • Flag : BDFA42FD05BFA808E9BCB63786ED3983353AC7F6874C37046722AB5944C79F0D

 

반응형