DongDD's IT

[pwnable.kr] collision 본문

Wargame/pwnable.kr

[pwnable.kr] collision

DongDD 2018. 3. 2. 14:51

[pwnable.kr] collision



Problem



문제에서 MD5 Hash 충돌에 대해서 들었다고 되어있고 자신 또한 그런 것을 하고 싶다라고 적혀있었다.

MD5 Hash에 관련된 문제인 것 같았다.

먼저 ssh로 접속해보았다.



col 실행 파일과 col.c 소스 코드 파일과 flag파일이 있었다. 먼저 소스 코드를 확인해보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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;
}
 
cs

먼저 argv를 받아 argc가 2보다 작은지 확인한다. 그 후에 argv[1]의 길이가 20인지 확인해 20이 아니라면 프로그램을 종료시킨다. 

그 후에 hashcode(0x21DD09EC)값과 입력한 argv[1]을 인자로 하여 check_password() 함수를 실행해 반환하는 값이 같다면 if문으로 들어가 system("/bin/cat flag")를 실행해 flag를 띄어주는 방식으로 되어있다.


check_password()함수에서는 20bytes길이의 argv[1]을 인자로 받아 int* ip에 형변환하여 넣어준다.

즉, 4 bytes크기를 가진 int형 값 5개를 갖는 배열이 되는 것과 같다고 볼 수 있다.

그 후에 ip배열에 들어있는 5개의 값을 더해 이 값을 return한다. 

이 값과 hashcode 값이 같다면 flag를 띄어주는 형식으로 되어있다.



Solution



이 문제는 단순한 16진수, 10진수 계산만 해주어 무난히 통과할 수 있었다.


0x21dd09ec의 16진수 값을 10진수로 바꾸어 계산했다.



0x21dd09ec를 10진수로 바꾸면 568134124가 나온다. 입력한 것을 5개의 int형으로 나누어 더해주기 때문에 이 값을 5로 나누면 된다. 

하지만 568134124는 5로 정확히 나누어 떨어지지 않고 나머지 4가 남는다.

즉, 5개로 나누되 한개에는 4를 더하면 568134124의 값을 맞출 수 있다.

568134124를 5로 나누면 113626824가 나오고 이 값을 다시 16진수로 바꿔주면 0x6c5cec8로 나타내진다.


4개의 0x6c5cec8과 나머지 4를 더한 0x6c5cecc 1개를 payload에 입력해주면 int형으로 변환된 5개의 값이 더해져 0x21dd09ec값과 일치하여 flag를 볼 수 있을 것이다.











**************     Answer & Flag     **************




Payload = "\xc8\xce\xc5\x06"*4 + "\xcc\xce\xc5\x06"




flag : daddy! I just managed to create a hash collision :)

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

[pwnable.kr] flag  (0) 2018.03.09
[pwnable.kr] bof  (0) 2018.03.07
[pwnable.kr] fd  (0) 2018.03.01
[pwnable.kr] lotto 문제 풀이  (0) 2017.08.27
[pwnable.kr] cmd1 문제 풀이  (0) 2017.08.12
Comments