Wargame/pwnable.kr
[Pwnable.kr] collision 풀이 (3pt)
bjloed
2020. 7. 18. 22:08
풀이
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;
}
일단 인자의 개수가 2개 미만이어야 하고, argv[1]의 길이는 20자이다.
hashcode(0x21DD09EC)와 check_password(argv[1])이 같으면 flag를 출력하는 문제이다.
이 문제를 해결하기 위해서는, 이 부분을 잘 해석해야 한다.
int* ip = (int*)p;
입력 받는 타입은 char *이지만, int *로 강제 형변환을 시켜, 4byte씩 읽게 만든다.
그러므로 이 문제는, 특정 값을 5번 더한 값이 0x21DD09EC여야 하는 것이다.
0x21DD09EC를 정수화 한 값은 568,134,124 이다.
나는 왜 어려운 길을 선택했는지 모르겠지만.. +1 해주면 간단하게 5로 나뉘지만 나는 그냥 4를 빼고 문제를 풀었다.
113,626,824 * 4 + 113,626,828면 문제가 해결되지 않을까..?