ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pwnkr] Collision Write-up
    표튜터와 함께하는 Pwnable/Pwnable.kr Write-up 2019. 3. 26. 00:32

    이번에 풀어볼 문제는 Collision이다.

    문제를 먼저 보았더니 힌트로 추정되는 문장이 보였다.


    MD5 hash collision?? MD5는 단방향 암호화이기 때문에 출력값으로부터 입력값을 복원할 수 없다.

    같은 값을 입력값이면 항상 같은 출력값이 나오며 서로 다른 값을 입력할 경우 같은 출력값이

    나올 확률을 매우 낮지만 같은 값이 나올 가능성은 존재한다. 

    예를 들어 "ABCD"와 "EFGH"를 MD5 했는데 해시값이 똑같을 수도 있다는 것이다.


    이러한 가능성을 이용하여 MD5로 암호화했을 때 같은 MD5 해시값을 갖는 문자열이

    발생하는 상황을 바로 MD5 hash collsion이라고 한다.

     


    소스코드를 보도록 하자!!

    코드를 보게되면 hashcode라는 값을 주어줬고 우리가 넘기는 인자의 길이가

    20byte가 되지않을 경우 프로그램이 종료된다. 또한 check_password 함수의

    return값이 hashcode와 같아야만 우리가 원하는 Flag를 볼 수 있도록 되어있었다.


    check_password 함수의 내용을 보면 입력받은 문자열 argv[1]을

    int형 포인터 변수로 가리키고 아래의 for문을 보면 res에 ip를

    배열로 더해주고 있는데 자료형이 int이므로 4byte씩 잘라서

    더하겠다는 의미가 된다. 이해가 안된다면 아래의 예시를 보도록 하자




    < 예시 >

    즉, 이런 식으로 "12345678"을 만약 입력하게된다면 

    "1234"->0x34333231 = 875770417이되는 것이고

    "5678" -> 0x38373635 = 943142453이 되는 것이다.

    (만약 int형 포인터 변수가 아니라 short였다면 2byte씩 잘랐을 것이다)




    그러므로 우리가 더한 합으로 나와야 하는 값은 바로 0x21DD09EC이므로

    0x21DD09EC를 5번 나누면 총 20byte가 될 것이고 이를 문자열로 쭉 넣어주면

    flag가 나올 것이다. 하지만 0x21DD09EC는 5로 딱 나누어 떨어지지않고

    0x06C5CEC8 4개 0x6C5CECC가 나온다. 그러므로 그대로 문자열로 입력해주면된다.



    이 문제의 힌트는 결국 Hashcode 0x21DD09EC와 동일한 값을 입력하게 만들라는 의미였다.




    해당 hex로 된 문자열은 그냥 입력할 수 없으므로 Python을 이용하자!!

    깰꼼하게 Flag를 볼 수 있었다.




    반응형

    '표튜터와 함께하는 Pwnable > Pwnable.kr Write-up' 카테고리의 다른 글

    [Pwnkr] Passcode Write-up  (0) 2019.03.31
    [Pwnkr] Horcruxes -> Write-up  (0) 2019.03.29
    [Pwnkr] Flag Write-up  (0) 2019.03.28
    [Pwnkr] Bof Write-up  (0) 2019.03.26
    [Pwnkr] Fd Write-up  (0) 2019.03.25

    댓글

Designed by Tistory.