포렌식 문제
아주 어렵고 짜증나는 문제였다..
러시아의 마트료시카 인형처럼 풀어도 풀어도 계속 끊임없이 문제들이 계속 나왔다.
풀이가 너무 길어서 포스팅 두개로 나눠서 절반씩 올릴 예정이다.
문제파일로 주어지는건 matryoshka.png 파일이다.
뭐가 빽빽하게 그려져 있는데
확대해서 보면 이런 딸기 그림이다.
이게 무슨 의미인지 알아내는데 엄청나게 시간이 걸렸다..
자세히 보면 딸기의 종류가 두 개 이다.
두 딸기는 서로 다른 방향을 바라보고 있는데,
컴퓨터 관련된 문제이니 이 딸기가 0과 1 같은 의미일거라고 생각했다.
그래서 우선 이 0과 1 딸기들이 어떻게 배치되었는지 알아보기로 했다.
matryoshka.png 파일의 속성을 보면
가로 세로 각각 6050 픽셀인 것을 확인할 수 있다.
수작업으로는 절대 확인할 수 없는 분량이다.
이번 문제는 Python PIL 라이브러리를 이용해서 풀었다.
PIL은 Python Imaging Library의 약자로
파이썬으로 이미지 처리를 할 수 있도록 해주는 라이브러리이다.
pip install image
pip install pillow
두 명령어를 이용해서 다운로드 받아주면 된다.
from PIL import Image
img1 = Image.open('matryoshka.png').convert('RGB')
xlen = 6050
ylen = 1
for y in range(ylen):
for x in range(xlen):
r,g,b = img1.getpixel((x,y))
print(r,g,b)
가장 먼저 작성한 코드는 이런 형태였다.
matryoshka.png 의 맨 윗줄(ylen = 1) 만 가져와서 각 픽셀의 r,g,b 값을 확인해봤다.
맨 윗줄만 가져온 이유는 맨위에 있는 딸기들은 모두 오른쪽을 바라보고 있기 때문이다.
모두 같은 모양이니 픽셀 배치도 똑같은 부분이 반복될 것이고,
그럼 딸기 하나가 차지하는 픽셀이 얼마인지 알 수 있을 것이다.
출력된 결과를 보면 이렇게 나온다.
r, g, b 값이 0,0,0 인것은 검은색을 의미한다.
그리고 25,26 / 75,76 / 125,126 ....
이렇게 50번 마다 똑같은 r,g,b 값이 반복되는것이 보인다.
반복되는 rgb 값인 249 224 100 / 183 167 83 은 각각 이런 색상이다.
여기 보이는 딸기 줄기의 색상이 50픽셀마다 반복되어서 찍히고 있는 것이다.
그럼 이걸 통해서 딸기 하나의 크기는 50x50 픽셀인 것을 알게 되었다.
* matryoshka.png 파일의 크기가 6050x6050 이므로 딸기의 가로세로 크기는 같음
from PIL import Image
img1 = Image.open('matryoshka.png').convert('RGB')
for y in range(200,250):
for x in range(0,250,50):
r,g,b = img1.getpixel((x,y))
print(y, ": ", r,g,b)
그 다음에 사용한 코드는 위와 같다.
이렇게 작성한 이유는 특정 부분의 딸기가 왼쪽을 향하는지, 오른쪽을 향하는지 구분하기 위함이다.
matryoshka.png 파일을 열어봤을 때
맨 왼쪽 상단에 있는 딸기로부터 세로 4칸, 가로 3칸 떨어져 있는 딸기 두개를 이용했다.
해당 딸기 두개가 있는 라인의 딸기들을 구성하는 픽셀의 y 값은 200 ~ 250 사이인데,
딸기 두개가 좌우반전 되어있다면
y값이 똑같은 상태에서 x값만 50씩 증가시켜 픽셀의 r,g,b 값을 확인해보다 보면
앞의 4개와 다른 값이 5번째에서 나오는 부분이 있을것이기 때문이다.
말이 어려울것 같아 그림으로 표현하면 이런 느낌이다.
각 딸기 내에서 똑같은 지점의 rgb값을 확인하다보면
좌우반전된 딸기는 다른 값이 나오게 될것이다.
결과를 보면 y 값이 219 일때나 221 일때는 rgb 값이 모두 똑같은데,
y 값이 220 일때는 앞의 4개는 53 49 24 인 반면
마지막 1개는 50 46 23 인것을 확인할 수 있다.
이것을 기준으로 각 딸기가 어느 방향을 향했는지 구분할 수 있을 것이다.
from PIL import Image
img1 = Image.open('matryoshka.png').convert('RGB')
xlen = 6050
ylen = 6050
new = Image.new('RGB', (xlen,ylen), (0,0,0))
for y in range(20,ylen,50):
for x in range(0,xlen,50):
r,g,b = img1.getpixel((x,y))
if r == 53:
for j in range(y-20,y+30):
for i in range(x,x+50):
new.putpixel((i,j),(255,255,255))
new.save('output.png')
마지막으로 작성한 코드이다.
6050x6050 크기의 검은색 이미지를 하나 생성한 뒤,
matryoshka.png의 y값이 20인 픽셀부터 시작해서 50씩 증가시키고,
x값은 0부터 시작해서 50씩 증가시키면서 픽셀의 rgb 값을 불러운다.
해당 픽셀의 r 값이 53이라면,
해당 부분의 딸기가 차지하는 50x50 공간을 하얀색으로 칠해줬다.
코드를 실행시키면 output.png 라는 이름으로
이렇게 생긴 QR코드가 하나 생성된다!
생성된 QR코드를 온라인 바코드 리더를 이용해 읽어봤다.
(https://online-barcode-reader.inliteresearch.com/)
뭔가 알 수 없는 16진수 값이 나열되어있는게 보이는데
맨 앞이 1f 8b 08 로 시작하고 있다.
이렇게 시작하는 파일은 gz 파일이다.
해당 hex 값을 HxD에 복붙해서 .gz 확장자로 파일을 하나 만들어준다.
생성된 파일을 열어서 압축해제 프로그램으로 열어보면
qr 이라는 파일이 안에 들어있는것이 보인다.
여기부턴 다음 포스팅에 이어서 작성하도록 한다.
'CTF > 포렌식' 카테고리의 다른 글
[TeamH4C CTF] Find the flag - 포렌식 / HxD / Binwalk (67) | 2022.12.07 |
---|---|
[b0lers CTF] Matryoshka(2/2) - 포렌식 / PIL / HxD (50) | 2022.12.03 |
[b01lers CTF] Echoes of Reality / Zima Blue - 포렌식 / Stegsolve / Audacity (65) | 2022.11.30 |
[TastelessCTF] 7/11 - 포렌식 / Binwalk / dd (58) | 2022.11.22 |
[2020CCE] Ransomware infected system image analysis #1~3 - 포렌식 / Autopsy (55) | 2022.11.20 |