ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • level 15. 풀이
    System hacking training/Hackerschool F.T.Z 2017. 11. 26. 23:24

    F.T.Z level 15를 풀이해 보았습니다.



    로그인 후 힌트를 확인해보니 level14의 소스코드와 유사합니다.


    하지만 포인터 변수를 사용한 점이 다른것을 알 수 있습니다.


    즉, check이 가리키는 값이 0xdeadbeef 와 일치해야 쉘을 띄어주는 것을 확인할 수 있습니다.

    또 이전의 문제와 같이 fgets함수의 입력길이가 잘못되었으므로 버퍼오버플로우 공격을 하면 쉘을 띄울 수 있을것으로 보입니다.


    level15의 디렉토리에서 gdb사용이 제한되므로


    공격해야할 attackme 라는 파일을 cp 명령어로 tmp 파일로 복사를 해줍니다.



    이렇게 복사한 파일을 gdb를 통해 확인해 봅니다.



    lea eax, [ebp-56] 한 다음 eax를 push 해주는 것으로 보아


    버퍼의 시작임을 알 수 있습니다.


    또 ebp-16 을 eax에 저장하고, 이 eax 와 0xdeadbeef를 cmp 하는 부분을 보아 이 부분에 0xdeadbeef가 들어있어야


    밑의 jne에 의해 점프하지 않고 setreuid() 와 system() 를 실행시켜 쉘을 띄울 수 있는것으로 보입니다.


    이러한 점을 이용하여 공격 시나리오를 짜보았습니다.


    [시나리오]

    문자 A를 버퍼의 시작위치 ebp-56부터 덮어 씌운다. 

    하지만 ebp-16의 위치에서 cmp로 0xdeadbeef 와 비교하니 이 위치에는 0xdeadbeef 를 가리키는 주소를 넣어줘야겠다.

    주소를 넣는 이유는 포인터 변수이기 때문이죠.


    자, 그럼 이 시나리오대로 공격을 해보겠습니다.


    [Think 1] 공격을 하려는데 0xdeadbeef 의 주소를 모른다.


    저는 이 문제를 gdb를 이용하여 해결할 수 있었는데요.



    이처럼 x(설명해라!) / x(16진수로!) main+32(cmp부분)


    이런식으로 해주면 당연히 소스코드상 if(*check == 0xdeadbeef) 부분이 있는데..


    0xdeadbeef를 담고 있는 주소가 당연히 나옵니다.

    (하드코딩을 했기 때문이죠)


    이렇게 0x80484b2 즉 0xdeadbeef 를 가리키는 주소를 알게되었습니다.


    그럼 전과 비슷하게 페이로드를 작성해보면


    (python -c 'print "A"*40+"\xb2\x84\x04\x08"';cat)|./attackme


    이와 같이 작성해주면 될것같습니다.



    이처럼 쉘을 띄우고 id를 확인해 보니 level16의 uid로 실행된것을 확인할 수 있었습니다.


    level16의 password는 "about to cause mass" 네요. ㅎㅎ


    이상 level 15 풀이를 마칩니다.








     






    반응형

    'System hacking training > Hackerschool F.T.Z' 카테고리의 다른 글

    level 17. 풀이  (0) 2017.12.03
    level 16. 풀이  (0) 2017.12.03
    level 14. 풀이  (0) 2017.11.12
    level13. 풀이  (0) 2017.11.05
    level12. 풀이  (0) 2017.10.23
Designed by Tistory.