쉬는시간/pwnable.kr

[pwnable.kr]Toddler - collision 풀이

happy-nut 2017. 5. 25. 14:01

pwanble.kr의 Toddler카테고리에 있는 문제 가운데 하나인 collision입니다.

아빠가 멋진 MD5 해쉬 collision을 이야기 해주어서 자신도 그 비슷한 걸 해보고 싶다는 내용입니다.

우선 pwanble.kr에 포트 2222번으로 접속을 해봐야 할 것 같습니다. 접속 툴로는 putty를 사용했습니다.

접속하자 마자 ls로 디렉토리 내용을 살펴보니 flag파일이 바로 보입니다. 하지만 col_pwn 의 소유자 권한과 그룹 권한만 읽을 수 있도록 권한이 세팅되어 있습니다.

즉 flag파일을 열려면 col_pwn권한을 얻어야 한다는 뜻인데, 방법은 간단합니다. col이라는 프로그램에 setuid가 붙어있기 때문입니다. setuid가 붙은 프로그램의 경우 실행 시 파일 소유자의 권한으로 권한이 승격됩니다. 

따라서 col이라는 프로그램을 익스플로잇해서 쉘을 얻거나 flag파일을 출력하도록 하면 되겠습니다.

문제에서 다행히 col.c라는 소스코드를 힌트로 주었기 때문에 잘 활용해 봅니다.

일면 복잡해 보이지만, 요약하자면 "Hashcode 0x21DD09EC로 주어질 때, 입력 받은 문자열을 4바이트씩 잘라서 더한 값과 hashcode가 일치하면 flag를 보여주겠다." 정도가 되겠습니다.

4바이트인 이유는 당연히 *ip 가 4바이트 자료형인 int여서 그렇습니다.

처음에 아무 생각없이 다음과 같이 입력을 해보고는 금방 실수를 깨달았습니다.

\x00은 널 문자이기 때문에 strlen을 거치자 마자 결과값으로 0을 반환하기 때문에 passcode length should be 20 bytes 라는 결과를 뱉은 겁니다.

그래서 \x00 말고 \x01을 사용하기로 했습니다. 

4바이트씩 자른 후에 더하므로 0x21DD09EC에서 0x01010101 * 4를 뺸 값을 넣어줘야 결과값이 그대로 0x21DD09EC가 나오게 될 겁니다.

즉, 0x01010101 + 0x01010101 + 0x01010101 + 0x01010101 + 0x1DD905e8 = 0x21DD09EC 이기 때문입니다.

따라서 다음과 같이 넣어줘야 합니다.

flag 내용이 출력된 것으로 보아 문제가 잘 풀린 모양입니다.