CTF | wargame

sCTF16 - Verticode (png픽셀 추출 & 연산)

nopdata 2016. 4. 14. 09:43

 

문제가 길다. 하지만 읽어보면 그다지 어렵지 않다.

파일은 3개가 주어지는데 1,2번은 예시 파일이고 3번째 파일이 문제의 파일이다.

1번 예시를 보면


 

이 사진이 주어지는데 검은색 부분은 1이고 흰색 부분은 0이다. 이를 토대로 보면

1000001이 된다. 이 값은 아스키값으로 'A'가 된다.

이런식으로 사진에서 검은색과 흰색을 판별하여 문자열을 추출하면 된다.



 




2번 예시를 보면 약간의 조건이 붙었다.

1000001이지만 앞서 나온 색이 특정 색일 경우에 값을 더해주어야 한다.


 

조건은 이와 같다. 여기서는 1000001 이므로 일단 'A'를 알 수 있고 여기에 보라색이므로 +1을 해주어 결과적으로 'B'가 된다.


 


문제의 코드를 보면 이게 엄청 길다.

고로 사람이 직접 할 수는 없다는 것이다.


이번 문제를 풀기 위해서 파이썬과 파이썬에서 이미지를 다루는 Image모듈을 사용하였다.

http://www.pythonware.com/products/pil/


 


문제를 풀기 위해 만든 소스이다.

문제에서 제공된 대로 더하기 위해 rgb테이블과 흑과 백을 이용, 0,1을 판별하기 위해 zero_one 테이블을 만든다.


그림의 형식을 보면 표현되는 하나의 크기는 12x12pixel이다. 따라서 12씩 증가시키며 확인하면 되고 처음 x의 시작점은 72로 잡았다. 

그 이유는 문제의 사진을 보면 필요한것은 앞의 색이 무엇인지이다. 따라서 한번만 확인하면 되기 때문에 앞부분은 그냥 패스 하도록 하고 한번만 색을 확인한다. 이처럼 만들고 프로그램을 구동시키면?

 


...? 뭐가 문제가 있나해서 한참 생각을 해보다가 rgb테이블에 해당하는 값을 더하지 않고 빼 보았더니 



 

영어 문구처럼 보인다.

이 문자열을 대강 문법에 맞게 띄어쓰기를 하고 구글링을 해 보면


 


같은 문장이 씌어져 있는 페이지를 찾을 수 있다. (https://www.wattpad.com/72172589-now-i-see-you-phones)


문장에 맞게 띄어쓰기를 따라가다 보면

 


일부가 짤려버렸다. 그리고 이 이후에는 문장이 제대로 맞지 않는다.

'i am the flag all lowercase no joke' 장난이 아니고 진짜 flag라고 하길래 넣어봤더니 이게 flag였다.


sctf{i am the flag all lowercase no joke}