Ctrl + Shift + ESC

[Pwnable.kr] collision 본문

Hacking/System

[Pwnable.kr] collision

단축키실행해보세요 2022. 5. 8. 19:11

문제

해당 포트에 접속한 다음에 그 안에 있는 파일을 바탕으로 flag를 구하면 되는 문제이다.

접속했다.

col, col.c, flag 파일이 존재한다.

flag 파일을 읽으려고 하니 권한이 없다고 퇴짜맞았다.

col.c 파일을 읽어보았다.

unsigned long hashcode = 0x21DD09EC;

	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;
	}

argv[1]은 20bytes의 값을 가져야 한다.

hashcode가 check_password를 통해 확인한 argv[1]의 값과 같다면 flag를 읽을 수 있다.

 

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;
}

20바이트 입력값을  4바이트씩 쪼개서 5개를 모두 더한다.

만약 입력값이 \x11112222333344445555 이라면 \x5555+\x4444+\x3333+\x2222+\x1111 = res가 된다.

 

res의 값이 0x21DD09EC 이 되면 flag를 읽을 수 있기 때문에 앞에 4 자리에는 0x01010101을, 그 외의 값에는 필요한 값을 넣어주어 조건을 충족시켰다.

0x21DD09EC - 0x01010101*4 = 1DD905E8 이므로 "\x01\x01\x01\x01"*4+"\xE8\x05\xD9\x1D"를 입력한다.

무사히 해결했다.