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면 문제가 해결되지 않을까..?