CTFlearn의 쉰세번째 문제
이번엔 처음으로 나온 프로그래밍 카테고리의 문제이다.
사실 여기서 분류는 프로그래밍으로 했지만 거의 포렌식 문제라고 생각한다.
간만에 CTFlearn에서 생각해볼 만한 문제가 나와서 재미있었다.
문제 설명을 읽어보면
누군가가 사진의 픽셀을 가져와 재구성했다고
이걸 PIL 모듈을 이용해 복원할 수 있냐고 물어본다.
이미지가 변경되기 전 Width는 304라는 힌트도 주어진다.
이것이 문제에서 주어지는 out copy.jpg 파일이다.
아무것도 없는것 처럼 보이는데 사실은 그게 아니다.
이미지를 우클릭해 속성을 보면
너비가 27968, 높이가 1인 것을 볼 수 있다.
아까 문제 설명에서 본대로
누군가가 이미지의 픽셀을 일렬로 쭉 늘어놓은 것이다.
일단 원래의 높이를 구해준다.
27968에서 아까 원래 너비로 언급했던 304를 나눠주면 된다.
원본 이미지의 크기는 304*92 이다.
from PIL import Image
img = Image.open('out copy.jpg').convert('RGB')
xlen = 92
ylen = 304
outlen = 27968
new = Image.new('RGB',(xlen,ylen),(255,255,255))
x = 0
y = -1
for o in range(outlen):
r,g,b = img.getpixel((o,0))
x = (o % 92)
if (o % 92) == 0:
y = y + 1
new.putpixel((x,y),(r,g,b))
new.save('new.jpg')
문제푸는 코드는 위와 같다.
문제에서 언급한 대로 PIL 모듈을 이용했다.
out copy.jpg 파일을 열어 RGB 형태로 바꿔준다.
92*304 사이즈의 새로운 이미지를 하나 생성하고,
out copy.jpg의 첫번째 픽셀부터 27968번째 픽셀까지 차례대로 읽어
새로운 이미지의 92*304 칸에 맞춰서 순서대로 채워넣는 것이다.
여기서 시간이 꽤 오래걸렸는데..
사실은 이 단계에서 복구하는 이미지의 너비가 304가 아닌 92 였기 때문이다.
출제자는 분명 너비가 304라고 언급했는데..
다음 단계를 보면 왜 그런지 이해가 된다.
이게 바로 위 코드를 실행했을 때 복구되는 이미지이다.
알파벳 모양으로 보면 이미지가 회전, 반전되어있다는 것을 알 수 있다.
다시 원래 모양대로 회전, 반전시켜주면 플래그가 제대로 보인다.
이 상태의 이미지가 304*92 사이즈이다.
그래서 너비가 304라고 언급했던것이다.
'워게임 > CTFlearn' 카테고리의 다른 글
[CTFlearn] The Credit Card Fraudster - 프로그래밍 / Python (48) | 2023.01.11 |
---|---|
[CTFlearn] Simple bof - 포너블 / 버퍼오버플로우 (79) | 2023.01.09 |
[CTFlearn] Encryption Master - 암호학 / Base64 (64) | 2023.01.02 |
[CTFlearn] Minions - 포렌식 / HxD / Binwalk / Base64 (69) | 2023.01.01 |
[CTFlearn] Corrupted File - 포렌식 / HxD / Base64 (67) | 2022.12.30 |