Sqix

Pwnable.kr - Toddler's Bottle : Hash Collision 본문

Wargame/Pwnable.kr

Pwnable.kr - Toddler's Bottle : Hash Collision

Sqix_ow 2017. 9. 4. 15:11


ssh col@pwnable.kr -p2222 / guest 를 입력하여 문제 서버에 접속한다.


이번 Hash Collision 문제풀이를 시작해 보겠습니다. 문제를 간단하게 요약하면, col.c에 있는 hashcode를 이용해서 알맞은 passcode를 찾아내는 것입니다.

먼저 hashcode가 적혀있는 소스코드를 보도록 하겠습니다.



arvg1에 passcode를 가져오고, 이를 check_password 함수의 인자로 넣어서 hashcode와 비교한 후, 만약 그 값이 같다면 flag에 있는 flag를 가져오도록 syscall을 합니다. 틀리다면 wrong password라고 출력을 합니다.

password를 보면, 우리가 입력한 문자열을 int * 타입으로 캐스팅하여 5개의 배열인 것 처럼 만들어 버립니다. strlen(argv[1]) != 20의 조건이 걸린 if문에서 20바이트 문자열만 들어올 수 있도록 필터링을 하기 때문에, int* ip는 입력한 문자열 20바이트를 4바이트씩 총 5개의 int값으로 나눕니다. 이렇게 나누어진 값을 res에서 더하고, 이를 리턴합니다. 이제 그 값과 hashcode의 값을 비교하여 값이 맞다면 flag를, 틀리다면 wrong passcode를 출력하게 됩니다.


못하는 ASCII Art를 해보려니까.. 저런식으로 나뉜다고 보시면 될 것 같네요

그러므로, flag를 얻기 위해서는 5개의 substr(?)의 int값으로의 캐스팅 이후의 값을 전부 더했을 때, hashcode가 나오게 하는 20bytes의 문자열을 집어 넣으면 됩니다. 즉, 여러 경우의 수가 나온다는 것이죠. 저같은 경우에는 5로 나눈 값인 6c5cec8를 4개,  6c5cecc를 1개 넣습니다(나눗셈을 하면 4의 오차가 생깁니다. 이를 보정하기 위함).

저는 python으로 값을 넣어 주었습니다. 바이트 오더링 때문에 값을 역순으로 넣어 주셔야 합니다.





Comments