관리 메뉴

Dork's port

Pwnable.kr col 풀이 본문

Pwnable.kr

Pwnable.kr col 풀이

Dork94 2018. 5. 29. 01:40

col 풀이를 시작하도록 하겠습니다.


소스코드를 보도록 하죠 

#include <stdio.h>
#include <string.h>
unsigned long hashcode = 0x21DD09EC; //결과 값 비교를 위한 hashcode
unsigned long check_password(const char* p){
	int* ip = (int*)p; //인자 값 p를 포인터 변수 ip에 저장
	int i;
	int res=0;
	for(i=0; i<5; i++){ //5번의 루프를 돌며 res에 누산 후 값을 res에 저장
		res += ip[i];
	}
	return res; // res 리턴 이때 이 값이 hashcode와 같아야 함
}

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] )){ //hashcode 변수와 check_password의 retrun value 비교 후 같을 시 flag 출력
		system("/bin/cat flag");
		return 0;
	}
	else
		printf("wrong passcode.\n");
	return 0;
}


주석과 같이 해석할 수 있겠습니다.

그렇다면 5번 더한 값이 0x21DD09EC와 같아야 하는데 간단하게 하기 위해선 5로 나누면 되겠죠?

하지만 이때 저 값이 5의 배수가 아니므로 (끝자리가 24입니다) 1을 더한 후 5로 나눈 값에 마지막 파라미터 값을 1을 빼준 값을 인자로 전달하였습니다.

코드로는 아래와 같이 적을 수 있겠네요!

짜잔~ 끝났습니다.


확실히 코드를 해석하는 능력이 중요한 것 같아요 :)



'Pwnable.kr' 카테고리의 다른 글

pwnable.kr flag 풀이  (0) 2018.08.24
Pwnable.kr bof풀이  (0) 2018.08.21
Pwnable.kr col 풀이  (0) 2018.05.29
Pwnable.kr fd 풀이  (0) 2018.05.29
0 Comments
댓글쓰기 폼