ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0x01.pwnable.kr - collision
    0x.Wargame/pwnable.kr 2018. 7. 1. 16:29

    0x01.pwnable.kr - collision


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

    sshcol@pwnable.kr-p2222(pw:guest)


    이 문제는 MD5 hash collision과 관련된 문제인 것 같아서 먼저 google에서 MD5 hash collision을 검색해보았다.

    MD5 는 128비트 암호화 해시 함수인데 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑해준다. 해시 함수의 가장 큰 특징은 같은 입력값의 경우 같은 출력 값을 가지게 되는 것인데, 이를 통해 해시 값이 다르면 원래의 데이터가 다르다는 것을 의미하기에 무결성 검사에 자주 사용된다.

    하지만 해시 충돌이 발생할 수 있는데, 이는 입력 값이 다르지만 동일한 출력 결과가 나타나는 현상이다. 즉, 해시 값은 같지만 두 파일이 같은 파일이 아닌 경우가 발생하는 것이다.


    ssh로 원격 접속해보니 3개의 파일이 존재한다. col.c를 확인해보았다.

    hashcode의 값으로 0x21DD09EC가 선언되어 있다. Main 함수 부분을 먼저 살펴보니 사용자로 부터 입력 값을 받는데 그 값의 길이는 20바이트여야 하고 만약 이 값이 hashcode의 값과 일치한다면 flag를 볼 수 있는데, 내가 입력한 값은 check_password() 함수를 거친 다음에 hashcode와 비교되기 때문에 서브 함수 부분이 핵심인 것 같다.

    check_password()에서는 사용자가 입력한 값이 for문을 5번 도는 과정에서 res에 더해지게 된다. 즉 res에는 ip[0], ip[1], ip[2], ip[3], ip[4]의 값이 더해지게 되는데, 이 값이 0x21DD09EC가 되어야 flag값을 볼 수 있다. 즉, 적절한 값을 나누어 넣어서 5번 더한 결과 값이 0x21DD09EC가 되게 하면 될 것 같다.


    0x21DD09EC를 10진수로 변경해보면 568134124라는 값이 나오는데 이 값은 113626824 * 4 + 113626828한 값이다. 이 값을 다시 16진수로 변경하면 0x6c5cec8 * 4 + 0x6c5cecc가 된다. 16진수 형태로 넣기 위해 liitle endian 방식을 사용하여 다음과 같이 입력하였다.

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


    결과를 확인해 보니 'daddy! I just managed to create a hash collision :)' 이라는 flag 값을 확인할 수 있었다.

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

    0x03.pwnable.kr - flag  (0) 2018.07.02
    0x02.pwnable.kr - bof  (0) 2018.07.01
    0x00.pwnable.kr - fd  (0) 2018.07.01
    0x15.pwnable.kr - uaf  (0) 2017.10.27
    0x14.pwnable.kr - cmd2  (0) 2017.10.26

    댓글

Designed by Tistory.