ssoL2 TISTORY

pwnable.kr [collision] 본문

challenge/pwn

pwnable.kr [collision]

ssoL2 2019. 7. 8. 18:03

Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!

 

 

Message-Digest algorithm 5

임의의 길이의 값을 입력받아서 128비트 길이의 해시값을 출력하는 알고리즘이다. 1991년 설계되었다.
MD5는 단방향 암호화이기 때문에 출력값에서 입력값을 복원하는 것은 할 수 없다. 같은 입력값이면 항상 같은 출력값이 나오고, 서로 다른 입력값에서 같은 출력값이 나올 확률은 극히 낮다(0은 아니며 발생할 수 있다.)

단방향 암호화이기 때문에 MD5 해시값에서 원래의 데이터를 찾아내는것은 불가능하며(원문을 해시 계산 과정에서 비트 단위로 박살내버린다), 크래커들은 "같은 MD5를 갖는 문자열", 즉 "충돌"(Collision)을 찾아내는 데 주력한다. 어쨌든 MD5값이 같으면 같은 문자열이라고 판단하기 때문이며 이는 모든 단방향 암호화에 통용되는 기법이다

 

 

 

 

 

#include 
#include 
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;
}
~  

 

 

 

 

main

1. argc <2 >> 인자 1개 필요

2. 그 인자는 20byte여야해 

3. argv[1]을 인자로 하는 check함수의 return값이 hashcode와 같으면 돼

4. check 함수를 보면

char 형으로 받은 거를 int형으로 변환해

그니까 a를 20byte하면 aaaaaaaaaaaaaaaaaaaa 이렇게 a가 20개인 20byte char형을

aaaa aaaa aaaa aaaa aaaa 이렇게 a가 4개인 4byte int형으로 5개로 쪼개지게 한다 이말인겨

5. for문에서 5번을 걸쳐서

쪼갠 int형을 5번 더한다는 걸 보면

내가 예상한대로 맞아 떨어진다는 걸 알수있음

그리고 이렇게 5번 더한게 hashcode와 같으면 돼

6. 따라서 hashcode를 5번 나눠봐

0x21DD09EC / 5 = 0x6C5 CEC8‬ 

0x6C5 CEC8 * 5 =‬ 21DD 09E8‬

위 둘이 맞지 않아 

EC가 E8보다 크니까

4개를 0x6C5 CEC8‬으로 하고 나머지 하나를 0x6C5 CEC8‬+(EC-E8)=6C5 CECC‬ 로 하면 되지 않을까

더해보자

0x6C5 CEC8 * 4 + 0x6C5 CECC = 21DD 09EC

맞음 ㅊㅊ

 

그러면은 총 5개의 int가

0x6C5 CEC8 

0x6C5 CEC8 

0x6C5 CEC8 

0x6C5 CEC8 

0x6C5 CECC 

 

막 ./col 뒤에 인자로

어떻게 저걸 넣어야 하나 고민했는데

도저히 생각 x

순간적으로 아 이문제는 pyhton payload로 딱 해서 해야겠구나

 

 

 

했더니 끝

 

 

 

 

col@prowl:~$ ./col `python -c 'print "\xC8\xCE\xC5\x06"*4+"\xCC\xCE\xC5\x06"'`
daddy! I just managed to create a hash collision :)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처

https://namu.wiki/w/MD5

 

MD5 - 나무위키

최근 수정 시각: 2019-03-23 17:16:51 1. 개요2. 관련 항목MD5("The quick brown fox jumps over the lazy dog") = 9e107d9d372bb6826bd81d3542a419d6 MD5("The quick brown fox jumps over the lazy dog.") = e4d909c290d0fb1ca068ffaddf22cbd0Message-Digest algorithm 5임의의 길이의 값을 입력받아

namu.wiki

 

'challenge > pwn' 카테고리의 다른 글

pwnable.kr [flag]  (0) 2019.07.09
pwnable.kr [bof]  (0) 2019.07.08
pwnable.kr [fd]  (0) 2019.07.08
lob [Level2] gremlin > cobolt (1)  (6) 2018.11.04
lob [Level1] gate > gremlin  (4) 2018.11.03
Comments