- 문제
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 |