반응형

Daddy told me about cool MD5 hash collision today.

I wanna do something like that too!


ssh col@pwnable.kr -p2222 (pw:guest)


###################################################################



아빠가 오늘 멋진 MD5 해시 충돌에 대해 말해줬어.

나도 그런 거 하고 싶어!



ssh col@pwnable.kr -p2222(pw:guest)



##############################################################################


MD5해시 충돌에 관한 문제일거 같다 들어가보자



col@prowl:~$ ls -l

total 16

-r-sr-x--- 1 col_pwn col     7341 Jun 11  2014 col

-rw-r--r-- 1 root    root     555 Jun 12  2014 col.c

-r--r----- 1 col_pwn col_pwn   52 Jun 11  2014 flag


역시 c언어 소스파일과 실행파일 flag가 나와있고

flag에는 권한이 없으며 col.c는 읽기권한이 col은 sticky bit setuid가 설정되있어 실행시 col_pwn의 권한으로 실행된다 


col@prowl:~$ cat 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;

}



cat을 통해 col.c를 확인해보자


unsigned long

https://www.arduino.cc/reference/ko/language/variables/data-types/unsignedlong/



const char*

https://igotit.tistory.com/entry/char-const-char-char-const


hashcode라는 변수에 16진수값으로 설정해주고 잇다.

long check_password 함수는 하나의 문자열을 받아 ip라는 int형 포인터를 생성한다.

이때 char(1byte)를 int(4byte)에 담기 위해서 4글자씩 짤라서 5번째까지 더하고 그값을 리턴한다.


메인함수에서는 인자가 없을시 파일명 [passcode]라는 출력이 뜨면서 종료된다.

만약 첫번째 인자가 길이가 20이 아니면 종료되며 입력값을 처리한 값이 hashcode와 같으면 

flag를 볼수 있을것이다.

즉 20자의 문자를 받아 4글자씩 잘라서 더한값이 0x21DD09EC이면 된다는것이다.

16글자는 모두 0으로 채우고 마지막만 21DD09EC면 되지않을까?

되지 않는다. 이유는 0x00은 space를 의미한다.

이외에도 문자가 출력되지 않는 16진수를 피해 문자를 완성해줘야할거같다.


0x01 16개와 21DD09EC-04040404를 해준 1dd905e8

리틀엔디안 방식으로 넣어준다.


python -c 은 컴파일 없이 바로 실행시키는 옵션

https://docs.python.org/ko/3/using/cmdline.html


./col 'python -c 'print "\x01"*16+"\xe8\x05\xd9\x1d"''

이런식으로 만들어서 넣어줬지만 20글자가 아니라고 뜬다. 왜?

각문자를 확인했지만 널문자는 없었다.



다른 방법으로 이렇게 만들었다.

21DD09EC/5 4개와 21DD09EC/5+21DD09EC%5

(06c5cec8)*4+(06c5cecc)


./col 'python -c 'print "\xc8\xce\xc5\c06"*4+"\xcc\xce\xc5\x06"''


이것도 안된다.


이렇게 `(백틱)사용해줘야한다...


./col `python -c 'print "\xc8\xce\xc5\c06"*4+"\xcc\xce\xc5\x06"'`


아래  `(백틱)에 대한 설명을 참조하였습니다. 


https://hunnitt.tistory.com/entry/Pwnable-1-02-collision

 





반응형

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

pwnable.kr random  (0) 2020.03.03
pwnable.kr passcode  (0) 2020.01.30
pwnable.kr flag  (0) 2020.01.30
pwnable.kr bof  (0) 2020.01.30
pwnable.kr fd  (1) 2019.12.11
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기