tmxklab

[pwnable.kr] collison 본문

War Game/pwnable.kr

[pwnable.kr] collison

tmxk4221 2020. 11. 20. 17:36

1. 문제 확인

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 = 0x21dd09ec이며 check_password(argv[1])의 리턴 값이 같으면 flag값이 출력된다.

 

 


2. 접근 방법

 

check_password를 자세히 살펴보자

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

파라미터 p의 데이터 타입은 char형(1byte)이지만 ip로 강제형변환할 떄 ip의 데이터 타입은 int형(4byte)이다. 따라서 만약에 "11112222~~"으로 입력했으면 ip[0]는 "1111"이다. 그리고 아스키코드표 값에 따라 최종적으로

ip[0] = 825,307,441(0x31313131)이다.

 

이 점을 유의해서 20byte값의 합이 0x21dd09ec(hashcode)로 만들면 된다.


3. 문제 풀이

 

0x21dd09ec / 5 = 0x06c5cec8 인데 나머지가 4임

따라서 0x06c5cec9 * 4 + 0x06c5cec8을 파라미터로 주면 될듯

 


4. 몰랐던 개념

'War Game > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] random  (0) 2020.11.20
[pwnable.kr] passcode  (0) 2020.11.20
[pwnable.kr] flag  (0) 2020.11.20
[pwnable.kr] bof  (0) 2020.11.20
[pwnable.kr] fd  (0) 2020.11.20
Comments