-
4팀_박윤진 write-ups (ctf-d_d4rth는 더러운 방법을...)2021/Write-Ups 2022. 1. 4. 23:59
아니나 다를까 육안으로 보기엔 다른 점이 없다.
우선 두 장의 이미지가 굳이 주어진 걸 보면 스테가노그래피는 아닌 것 같고,
노네임드 누가 진짜일까?문제 처럼 다른 Hex값에 숨겨뒀을거라 생각하고
kali에서 cmp를 돌려본다.
cmp -l -b original.png encrypted.png
너무 길어서 잘리기도 했고, 그냥 딱 봐도 유의미해보이진 않는다.
이 방안이 아닌 단서를 찾자면 특정 Hex값이 다른 것이라면 크기는 일단 같아야 하는데
크기부터가 다르다
(윈도우: 파일 속성 / 리눅스: exiftool)
우선 diff와 함께 두 이미지를 비교할 때 사용할 수 있는 명령어 "compare"를 사용하고자 한다.
compare를 사용하기 위해서는 sudo apt-get install imagemagick 를 설치한다.
(오류가 발생한다면 sudo apt-get update 후 재설치)
+윈도우에서 diffimg 툴을 사용할 수도 있다.
ImageMagick는 다양한 포맷의 이미지를 만들고, 편집하고, 구성하고, 변환할 수 있다.
(convert, resize, flip, mirror, rotate, distort, shear, transform, apply collor, draw text, lines, polygons, ...)
exec 함수를 통해 php, 웹 서버 백엔드에서도 사용할 수 있다.
compare에 대한 자세한 설명은 https://imagemagick.org/script/compare.php 에서 확인 가능
가장 기본 커맨드인 compare original.png encrypted.png diff.png 를 사용한다.
다른 픽셀에 대하여 빨간색 픽셀로 바뀌어 출력되게 된다.
결과물로 산출된 diff 파일을 살펴보면 바로 전에 풀었던 "브리타니아의 원더랜드" 문제와 유사한 것을 알 수 있다.
일반 뷰어로 보면 깨지나, 포토샵으로 확인하면 더 명확하게 확인할 수 있다. (49x7)
method1 이를 포토샵으로 잘라서 사용하여 브리타니아의 원더랜드 문제의 코드를 수정하여 사용한다.
확대함 red 값이 (255, 0, 0)이 아닌 (193, 0, 24)이어야 한다.
또한 기존 문제의 경우 7x200, 세로 이미지였으나 현재 문제는 가로 이미지이다.
접근 방법은 브리타니아와 동일하다 (00~7F 표현 - 텍스트 데이터)
만약 red, gray가 모두 다른 색이었다면 이 방법은 사용하지 못한다.
단일화되어 있는 red 값을 사용하려고 한다.
from PIL import Image pic = Image.open("../pythonProject/diff2.png") data = pic.load() width, height = pic.size red = (193, 0, 24) binary_lines = [] text = "" for x in range(width): binary_line = [] for y in range(height): # height = 7이므로, 7마다 하나의 line이 된다. 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([hex(int(''.join(i),2))]) 기존 코드는 hex값이 출력됨 text += ''.join(chr(int(''.join(i),2))) # 리뉴얼하여 바로 ASCII값이 출력되도록 print(text)
그런데 단일화되었다고 믿었던 red값이 차이가 있었는지 이상한 값이 출력된다.
method2 두 이미지를 python에서 그대로 사용하여 (compare는 그냥 개념 확인용으로)
49x7 위치의 픽셀만 비교하도록 하여 두 픽셀의 값이 같으면 0, 다르면 1로 붙이고
한 줄(7비트)가 완성되면 chr를 통해 문자열로 만든다.
from PIL import Image img1 = Image.open("original.png") img2 = Image.open("encrypted.png") str = '' for x in range(49): data = '' for y in range(7): p_img1 = img1.getpixel((x, y)) p_img2 = img2.getpixel((x, y)) if p_img1 == p_img2: data += '0' else: data += '1' str += chr(int(data,2)) print(str)
정답은 d1ff1cul7_t0_f0cu5,wa5n't_i7? 를 SHA256 적용한
bdfa42fd05bfa808e9bcb63786ed3983353ac7f6874c37046722ab5944c79f0d
BDFA42FD05BFA808E9BCB63786ED3983353AC7F6874C37046722AB5944C79F0D
이다(대문자여야 한다...)
'2021 > Write-Ups' 카테고리의 다른 글
2팀_장지은_Write_Ups (HackCTF_나는 해귀다) (0) 2022.01.05 2팀_장지은_Write_Ups (HackCTF_세상에서 잊혀진 날 찾아줘!) (0) 2022.01.05 3팀_김소희_Write-Ups (HackCTF-잔상) (0) 2022.01.04 2팀_송설연 Write_Ups (Suninatas_1) (0) 2022.01.04 3팀_이은경 write-ups(Suninatas_14) (0) 2022.01.04