Pwnable.kr [Toddler's Bottle]의 두번째 문제인 collision입니다.

여전히 귀여운 일러스트
col.c.파일이 있네요

col의 C코드 파일이 있네요, 한번 읽어보겠습니다.

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC;
unsigned long check_password(const char* p){
	int* ip = (int*)p;
	int i;
	int res=0;
	for(i=0; i<5; i++){
		res += ip[i];
	}
	return res;
}

int main(int argc, char* argv[]){
	if(argc<2){
		printf("usage : %s [passcode]\n", argv[0]);
		return 0;
	}
	if(strlen(argv[1]) != 20){
		printf("passcode length should be 20 bytes\n");
		return 0;
	}

	if(hashcode == check_password( argv[1] )){
		system("/bin/cat flag");
		return 0;
	}
	else
		printf("wrong passcode.\n");
	return 0;
}

여기서 hashcode == check_password(argv[1]) 이것이 Flag값을 알아내기 위한 핵심 조건문 같은데요.

 

main()함수의 전달인자를 1개 이상 주어야하는 조건과 argv[]이 20바이트라는 조건과 같이 모두 만족이 되어야

 

실행이 되는 것 같습니다.  

 

간단하게 해석하자면 

 

Hashcode가 0x21DD09EC로 주어질 때 문자열을 4바이트씩 잘라서 더한 값이 해시코드와 일치해야지 정답을 보여줍니다.

 

0x21DD09EC - 0X01010101 * 4 =0x1DD095e8

 

0x1DD095e8이라는 값을 리틀 에디안으로 변환시킨 후 파이썬을 이용하여 exploit 코드를 짜봅시다.

 

./col `python -c 'print "\x01"*16+"\xe8\x05\xd9\x1d"'`

 

익스플로잇!

정상적으로 flag가 출력 된것을 확인 할 수 있습니다.

 

 

FLAG: daddy! I just managed to create a hash collision :)

 

 

반응형
복사했습니다!