본문으로 바로가기

- 문제

PNG Uncorrupt (150 pts)

We received this PNG file, but we're a bit concerned the transmission may have not quite been perfect.


PNG파일을 pngcheck tool을 이용하여 error 체크


DOS 형식에서 Unix 형식을 변경된 것을 확인할 수 있으며 이때 가장 큰 차이는 DOS에서는 개행을 \r\n(0x0D 0x0A)로 표현하지만 unix에서는 \n(0x0A)로 표현한다. 


파일을 수정하기 위하여 PNG 파일을 Hxd로 열어보면 처음 signature가 잘못되어 있는 것을 알 수 있다.

PNG 파일의 signature는 89 50 4E 47 0D 0A 1A 0A 이지만 확인한 파일은 0D가 빠져있다.

Signature를 맞춰주기 위하여 0D를 삽입 후 다시 pngcheck를 이용하여 확인해보면 IDAT가 잘못되어 있는 것을 알 수 있다.


PNG파일 구조는 signature + Chunks로 되어 있으며 Chunks는 length(4 bytes) + Chunk type(4 bytes) + Chunk data + CRC(4 bytes)로 구성되어 있다.

length : Chunk data 길이 (길이가 0이면 Chunk data는 존재하지 않는다)

Chunk type : Chunk 이름

Chunk data : 실제 data

CRC : Chunk type + Chunk data의 crc 값


이 PNG파일은 총 10개의 IDAT를 갖고 있으며 error가 발생한 Chunk는 IDAT 이기 때문에 어느 부분이 잘못되어 있는지 hxd를 이용하여 확인

첫 번째 IDAT의 길이는 0x20000으로 표현되어 있지만 실제 길이를 계산해보면 0x1FFFF인 것을 확인할 수 있다. 1 byte가 사라진 것을 확인할 수 있으며 사라진 1byte는 위에서 확인했던 DOS 와 Unix의 차이점으로 확인

Data 부분에 0x0A가 있는 것을 찾아 0x0A -> 0x0D 0x0A로 수정하여야 하는데 수정 후 crc 값을 확인했을 때 입력되어 있는 crc 값과 같아야 한다.

두 번째 IDAT도 확인하면 길이가 0x20000으로 표현되어 있지만 실제 길이는 0x1FFFD인 것을 확인할 수 있다. 이번엔 2bytes가 사라졌으며 이것은 0x0A를 두개 찾고 값을 변경해야 한다.

이렇게 10개의 IDAT를 수정하면 PNG파일을 열 수 있고 flag 값을 확인할 수 있다.

코드로 작성하면 편하게 했을텐데.. 우리는 노가다로 하나씩 변경해가며 값을 확인......


flag{have_a_wonderful_starcrafts}

'CTF > Hacking Defense Contest' 카테고리의 다른 글

[Plaid CTF 2015] Pwnable - EBP  (0) 2015.04.21
[Plaid CTF 2015] Reversing - RE GEX  (0) 2015.04.21
[Plaid CTF 2015] Crypto - Curious  (0) 2015.04.21
[Plaid CTF 2015] Reversing - Clifford  (0) 2015.04.21
[Plaid CTF 2015] Misc - Sawed  (0) 2015.04.21