50점 문제


    아이다로 열어서 main 함수를 보면

    Base64Decode 함수를 거쳐서 그 글자가 12글자를 넘지 않았을 때, memcpy 함수와 auth 함수를 실행할 수 있다.


    auth 함수를 보면

    위에 calc_md5 함수가 있고 f87cd601aa7fedca99018a8be88eda34가 있으니 base64decode과 calc_md5를 거친 문자열이 저 해쉬값과 같게 하면 문제가 풀릴 것 같다.


    낚일뻔


    마지막으로 correct 함수를 보면

    offset input에 있는 값이 0xdeadbeef면 문제를 풀 수 있다.


    input의 크기가 12바이트여서 12바이트에 맞게 AAAABBBBCCCC를 인코드한 문자열을 입력하면 segmentation fault가 뜬다.


    확인해보면 12바이트 중 마지막 4바이트의 값대로 ebp가 변조되어있다. 처음 4바이트 값은 0xdeadbeef로 놔둬야하고, 가운데 4바이트가 남게 되는데 여기에는 correct 함수의 주소를, 마지막 4바이트는 바로 가운데 4바이트가 있는 주소를 가리키도록 하면 된다. 12바이트가 있는 input의 주소는 0x0811eb40이고, correct 함수의 주소는 0x0804925f다. 주의해야할 점이 가운데 4바이트의 주소가 0x0811eb44라고 해서, ebp 값을 0x0811eb44로 변조하면 0x0811eb40이 가리키는 주소, 즉 자신이 있는 주소로 점프하게 된다.


    이렇게 input 영역을 실행하려고 하다가 segmentation fault를 뿜는다.


    풀이

    (python -c "import base64;print base64.encodestring('\xef\xbe\xad\xde'+'\x5f\x92\x04\x08'+'\x40\xeb\x11\x08')"; cat) | nc pwnable.kr 9003


    Posted by 코요

    • 2016.06.22 16:19

      비밀댓글입니다

      • BlogIcon 코요
        2016.07.04 13:48 신고

        우와 모두 푸셨네요. 짱이시다

    • zg
      2016.11.14 16:07 신고

      무슨 디스어셈블러를 사용하시는지 알수 있을까요?

티스토리 툴바