2024. 7. 19. 01:14ㆍsecurity/Forensics
문제 파일을 다운받았더니 아래와 같은 이미지파일이 하나 있었다.
문제를 읽어보니 이 이미지 파일을 원래의 이미지 파일로 복구하면 플래그가 나온다는 것을 알 수 있다.
이미지 파일의 속성을 확인해보니 가로, 세로가 512, 256인 것을 알 수 있고, 세로를 다시 512로 돌리면 된다고 생각했다.
우선 이미지 파일을 Hxd에 올려보았다.
이렇게 16진수들이 나열되어있는데, 이미지 파일에 대한 정보를 담고 있을 것이므로 파일 크기에 대한 정보도 가지고 있을 것이라고 생각했다. 512와 256을 16진수로 표현하면 0x200, 0x100이므로 이게 써진 곳의 위치를 찾아보았더니 0x12와 0x16에 써진 것을 찾을 수 있었다. 0x16에 있는 0x01을 0x02로 바꿔보았다. 이미지 파일을 열어보았더니
플래그를 얻을 수 있었다...
Hxd에서 나온 숫자들의 의미를 알기 위해서 png 파일 구조에 대한 공부를 더 해보았다.
png 파일은 첫 8바이트를 file signature로 가지게 된다. 즉, png파일이라면 첫 8바이트는 모두 동일하게 다음과 같은 값을 가진다.
이를 Decoded text로 보면 PNG라는 문자가 있기 때문에 이를 통해서도 쉽게 PNG파일임을 확인할 수 있다.
그리고 png 파일은 청크들로 구성된다. 청크(chunk)는 덩어리라는 뜻으로 그냥 하나의 단위라고 생각하면 쉬울 것 같다.
청크의 구조는 다음과 같다.
{
Length(4byte),
Chunk Type(4byte),
Chunk Data(length byte),
CRC(4byte)
}
청크는 여러 종류가 있지만 png 파일에서 필수적으로 포함되어야 하는 청크가 존재한다. IHDR, IDAT, IEND 이렇게 3개이다.
IDHR
IDHR은 ImageHeader의 줄임말이다. Header인 만큼 청크 중에서 가장 앞에 존재하게 된다. PNG 이미지의 크기, 필터링 방식, 압축 방식 등을 알려준다.
{
00 00 00 0D(13) #Length
49 48 44 52(IHDR) #Chunk Type
{
Width(4byte),
Height(4byte),
Bit depth(1byte),
Color Type(1byte),
Compression method(1byte),
Filter method(1byte),
Interlace method(1byte)
}
CRC(4byte)
}
이렇게 이루어졌고, 헥사 값으로 써놓은 부분은 모든 IHDR에서 같은 값을 가진다. 즉 IHDR의 데이터는 13byte로 고정이라는 것도 알 수 있다. 그렇다면 이를 토대로 드림핵에서의 문제를 다시 봐보겠다. IHDR 청크에서 이미지의 Width와 Height를 정해주는 부분이 있다. Offset을 계산했을 때, 0x10부터 4byte가 Width이고, 0x14부터 4byte가 Height를 정해준다는 것을 알 수 있다. 문제를 풀 때, 예측했던 것과 거의 일치하다.
문제 이미지 파일로 확인해보면 청크 크기는 0x0D이고 IHDR이 써져있는 것을 확인할 수 있다. 그리고 0x10에서 Width가 0x200(512), 0x14에서 Height가 0x200(512)인 것을 확인할 수 있다. 문제를 푼 후 패치된 상태이기 때문에 사진의 실제 정보와 일치하는 것을 볼 수 있다. 이외에 Compression method의 경우엔 압축 방식에 대해 알려주는 값인데, 현재 PNG에서 표준으로 정의된 압축 방식은 0(DEFLATE) 한 가지이다.
IDAT
IDAT 청크는 실제로 이미지 데이터가 들어가는 부분이다. 이미지의 원본 픽셀 데이터가 필터링과 압축을 거쳐 IDAT 청크에 저장된다. png 파일은 여러 개의 IDAT 청크를 가질 수 있다. 일반적으로 하나의 IDAT 청크는 65536byte의 데이터 크기를 가진다. 그리고 하나의 IDAT 청크가 이미지의 특정 부분을 나타내는 것이 아니고, 데이터를 압축한 후 IDAT 청크에 나눠 담기 때문에 하나의 IDAT 청크라도 없다면 압축된 이미지를 디코딩 할 수 없다.
IEND
{
00 00 00 00(0), #Length
49 45 4E 44(IEND), #Chunk Type
CRC
}
IEND 청크는 이미지의 맨 뒤에 위치하는 청크이고, png 파일의 끝을 나타낸다. Length가 0이므로 청크 데이터는 존재하지 않는다.
참고
'security > Forensics' 카테고리의 다른 글
Puzzle #3: Ann's AppleTV (0) | 2024.08.01 |
---|---|
Puzzle #2: Ann Skips Bail (0) | 2024.07.31 |
Puzzle #1: Ann's Bad AIM (0) | 2024.07.31 |
프로토콜 개념 정리(TCP, UDP, IP, HTTP 등) (0) | 2024.07.26 |
zip 파일 구조 분석, zipper 문제풀이 (2) | 2024.07.20 |