ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0x04.pwnable.kr - passcode
    0x.Wargame/pwnable.kr 2018. 7. 2. 15:43

    0x04.pwnable.kr - passcode



    Mommy told me to make a passcode based login system.
    My initial C code was compiled without any error!
    Well, there was some compiler warning, but who cares about that?

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


    힌트를 보면 compile을 할 수는 있지만 compiler warning이 발생한다고 한다. 이를 통해 format string과 같은 버그가 존재할 것이라고 생각하였다.


    원격으로 서버에 접속해보니 passcode.c가 보였다.


    해당 소스코드에 대하여 살펴보았다.


    첫 줄부터 살펴보았더니, 평소에 자주하는 실수인 scanf의 변수에 &를 붙히지 않은 것을 확인할 수 있었다. 일단 전체적인 프로그램의 흐름을 살펴보면 100자리의 name을 입력받고, passcode1,2를 입력받은 뒤에 각각이 338150과 13371337이면 flag를 확인할 수 있다. 흐름을 관찰하면서 본 건데, 주석으로 vulnerable to brute forcing이라는 힌트가 주어져있다.

    scanf("%d", passcode1) 부분을 통해 passcode1의 주소값을 덮어씌울 수 있기 때문에 해당 값의 변조를 통하여 GOT_overwrite를 수행할 수 있지 않을까라는 생각이 들었다.

    진단을 위해 프로그램에 몇가지 입력값을 넣어보았다. 숫자 1234를 넣으니 Segmentation fault가 발생하였고, 문자를 넣으니 Login Failed!가 뜨면서 종료되었다.

    Brute forcing이 가능한지를 확인하기 위해 A를 주입해 보았다.

    이름 부분에서 100개가 조금 더 되는 A를 주입하였더니, passcode1, 2을 입력받지 않고 종료하였다. 이를 통해 name에 일정이상의 값을 넣으면 특정 값이 변조된다는 사실을 알 수 있다.


    name에 대한 값은 [ebp-0x70] 부분부터 입력을 받고, 


    passcode1은 [ebp-0x10] 부분과 연관이 있었다. name을 입력 받는 과정에서 ebp-0x10에 있는 값이 변조가 되어서 이런 결과가 뜬다고 생각을 하였고 이 부분을 확인하기 위해서 프로그램을 실행시켜 값을 확인해 보았다.


    passcode1을 scanf하기 직전에 bp를 걸고, A를 100개 집어넣었더니 passcode1의 주소값이 AAAA로 변조되었다.


    이를 통해 name입력 부분에서 overflow을 통하여 passcode1의 주소값을 변조할 수 있다는 사실을 알 수 있었다. 이제 got_overwrite를 진행할 것인데, passcode1을 덮어씌우면 passcode2부분이 정상적으로 실행되지 않기 때문에 fflush 부분으로 passcode1의 주소값을 변조한 다음에 scanf("%d", fflush)를 통하여 fflush가 가지는 got값을 "cat /bin/flag"로 변조를 하도록 할 것이다. 이렇게 변조가 되면 fflush 대신 cat /bin/flag가 실행되어서 flag를 딸 수 있을 것 같았다.


    fflush의 got를 확인해보니 0x804a004라는 것을 알 수 있었고,


    system 함수가 실행되기 전 라인을 보니 esp에 0x80487af를 mov하는데 해당 값을 확인해 보았더니,


    /bin/cat flag 부분인 것을 확인할 수 있었다.


    예상한 방법대로 페이로드를 실행해보니 'Sorry mom.. I got confused about scanf usage :(' 라는 flag를 확인할 수 있었다.




    http://horo90.tistory.com/37



    위 블로그를 꼭 참고하길!!


    간단하게 나만의 언어로 설명하자면 프로그램이 함수를 호출 할 때 plt는 로컬 주소 got는 글로벌 주소로, 먼저 plt의 값을 확인하게 되는데 이 값으로 got의 주소값이 포인터 형식으로 들어가있다. 그 포인터 값을 참고하여 실제 함수가 실행이 되는 것이다.


    즉, 어떤 함수를 호출하는 과정은 함수호출 -> plt -> got 순서로 진행이 되고, 그 뒤의 진행사항은 위의 블로그에 자세히 설명되어 있으니 생략한다.



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

    0x06.pwnable.kr - input  (0) 2018.07.02
    0x05.pwnable.kr - random  (0) 2018.07.02
    0x03.pwnable.kr - flag  (0) 2018.07.02
    0x02.pwnable.kr - bof  (0) 2018.07.01
    0x01.pwnable.kr - collision  (0) 2018.07.01

    댓글

Designed by Tistory.