SECCON 2019 CTF write up
Sandstorm
62솔브나 났는데 결국 못푼 문제..
한번 풀이를 해보겠습니다.
일단 문제 설명에 Mr. Smith 와 문제의 Adam 을 합치면 Adam Smith 라는 이름이 된다.
여러 스테가노 그래피 방법을 적용해서 문제를 풀고자 했지만 결과가 좋지 않았습니다
exiftool 명령어를 이용해서 데이터를 확인해 보면 아래와 같습니다.
Interlace를 확인해 보면 Adam7 Interlace 라고 적혀 있습니다.
Adam7 algorithm 이라는 알고리즘이 있는 것으로 확인이 됩니다.
Adam7 Algotithm : PNG 이미지에서 사용하는 Interlacing 알고리즘으로 Interlace 된 이미지가 7개의 sub image로 나뉘게 된다 라고 설명합니다.
위의 사진 처럼 각각의 픽셀을 차례대로 출력을 해서 결국 7번째 sub image가 되었을때 100%인 온전한 사진이 됩니다.
해당 작업은 1개의 IDAT chunk당 한번씩의 루틴을 도는 것을 확인 하였습니다.
그렇기 때문에 IDAT chunk가 많아질 수록 사진의 밀집도가 커지고, 픽셀이 꼼꼼하게 출력됩니다.
그렇다면 이제 해당 문제에서 적용된 Adam7 algorithm을 확인해 보겠습니다.
010 editor로 열어보면 원본 사진에 IDAT chunk가 8개로 7개는 0x2000의 크기 와 나머지 1개는 0x177C 입니다.
chunk 1개 늘어날때마다 루틴이 1번씩 돌기 때문에 chunk 1 ~ 8까지 해서 chunk 개수를 조정해 보겠습니다.
Size를 0x2000 -> 0x1FFF 로 변경해서 그다음 chunk가 이어 지지 않도록 조정해 보겠습니다.
chunk 1 ~ 8.png 를 전부 확인해 보겠습니다. (chunk 뒤의 숫자는 IDAT chunk의 개수를 의미합니다.)
데이터를 수정하면 매우 희미하게 보이지만 크롬으로 열어서 보면 선명하게 확인 할 수 있습니다.
1. chunk 1.png
2. chunk 2.png
3. chunk 3.png
4. chunk 4.png
5. chunk 5.png
6. chunk 6.png
7. chunk 7.png
8. chunk 8.png(원본)
위와 같이 IDAT chunk 개수가 늘어나면서 점점 선명해 지는 것을 확인 할 수 있습니다.
IDAT가 1개(0x2000)면 다음과 같은 내용을 볼수 있습니다.
해당 사진을 보고 chunk 1.png 에서 IDAT chunk 사이즈가 0x2000보다 작으면 픽셀이 덜 찍혔을 것이고, QRcode 를 확인 할 수 있을 것 같았습니다.
그래서 0x2000 -> 0x1000으로 변경을 해보았습니다.
QR code 모양이 나왔기에 크롬으로 열어서 확인 해 봤습니다.
너무 많이 데이터가 출력된 뒤였습니다. 그렇기 때문에 더 줄여야 할것 같습니다.
0x1000 -> 0x500 으로 변경해서 크롬으로 확인해 보겠습니다.
QRcode가 완벽히 나옵니다.
인식이 되는 QRCode 이지만 위쪽이 좀더 출력된 모습이 보입니다.
0x4B0 으로 변경하면 완전한 QRCode를 확인 하실 수 있습니다.
qrcode를 인식해 보면 아래와 같습니다.
Flag : SECCON{p0nlMpzlCQ5AHol6}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ