ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddlers's Bottle] collision
    Wargame/pwnable.kr Challenge 2019. 1. 17. 19:20

    → 문제는 아래와 같다.





    → 로그인 후 파일 확인.






    → col.c 소스코드 확인.




    → 문제 해결을 위해선, hashcode == check_password(artv[1])의 값이 참으로 만들어야 한다. 이 때, hashcode 값은 0x21DD09EC이고, check_password(argv[1])의 값이랑 비교한다.


    → check_password 함수를 살펴보면, 인자 값으로 argv[1] 값을 받고 이를 ip 배열로 받아 더하여 리턴한다.


    → 두번째 분기문에서 strlen(argv[1]) != 20 에 의해 실행 인자 값은 반드시 20바이트이여야 한다.


    → 결국 20바이트의 passcode 인자 값을 통해 check_password 함수 연산 결과와 0x21DD09EC의 값이 동일하게 만드는 문제이다.


    → check_password 함수를 자세히 살펴보면, 인자값 p는 char* 형으로 선언되었으나, 함수 내부에선 int* 형으로 캐스팅되어 연산에 사용된다. int는 4바이트이다.


    → 그리고 for문에 의해서 입력한 20바이트를 4바이트 단위로 5번씩 읽어 res에 넣는 작업을 진행한다.


    for(i=0;i<5;i++)

    {

    res+= ip[i];

    }


    → 즉, res 값을 0x21DD09EC로 만들어야 하는데, 이를 5번에 걸쳐 더해야 하므로 값을 5로 나눈다.


    → 0x21DD09EC / 0x5 = 0x6c5cec8 이지만, 역으로 계산하여 0x6c5cec8 * 0x5 = 0x21dd09e8이 나온다. 기존의 만드려는 값끼리 빼면 0x21dd09ec-0x21dd09e8 = 0x4가 나온다. 즉 5로 나눈 나머지의 값이 0x4이다.


    → 이제 그냥 해당 값을 넣어주면 된다.


    → 나머지가 없다면 인자 값으로 0x6c5cec8*0x5 한 값을 넣으면 되지만, 나머지 0x4가 존재하므로 마지막 값에는 0x4를 더한 값을 넣는다.


    → 파이썬을 통해 인자값을 구성한다.


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


    → 5번에 걸쳐넣는 작업을 4번만 곱해서 넣은 후, 마지막에 한번 더할 때, 나머지 값인 0x4를 더하여 넣는다. 0x6c5cec8+0x4 = 0ㅌ6c5cecc인 값이다. 


    -> 공격을 수행하면 다음과 같이 해결된다.


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

    [Toddler's Bottle] random  (0) 2019.02.19
    [Toddler's Bottle] flag  (0) 2019.02.14
    [Toddler's Bottle] bof  (0) 2019.01.22
    [Toddlers's Bottle] fd  (0) 2019.01.10

    댓글

Designed by Tistory.