ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • level 17. 풀이
    System hacking training/Hackerschool F.T.Z 2017. 12. 3. 19:03

    저는 해커스쿨 f.t.z를 풀이할때 한가지 습관이 있는데요.


    문제 비밀번호를 획득하면 바로 풀어보는 습관입니다. (다들 그러실듯하지만..)


    level 16을 풀이하고 바로 level 17을 풀이하였는데 우연히 풀게 되어서 풀이를 작성하게 되었습니다.


    기존에 나와있는 풀이와는 다를것으로 예상이 되고, 출제 의도와는 다르게 푼거같아서 어떨떨합니다만... ㅎㅅㅎ


    풀이를 시작하겠습니다.



    로그인 후 힌트파일을 열어본 결과입니다.


    역시 함수 포인터로 printit() 의 시작 주소를 담고 있는것을 확인 할 수 있습니다.


    하지만 이전의 문제와는 다르게 shell() 가 보이지 않네요.


    대신 main()에 level 18의 권한을 주는것이 보이는데요.


    풀이를 하기 위해 취약점을 찾아야겠죠?


    이제는 바로 보일것같습니다.


    fgets()의 버퍼오버플로우 취약점을 이용하면 되겠죠?


    "하지만 쉘을 어떻게 띄울것인가" 가 이 문제를 다시보게 만드는데요.


    저는 환경변수를 이용하기로 했습니다.


    쉘을 띄우는 환경변수를 만들고, 그 환경변수의 주소를 이용하여 함수 포인터인 call에 환경변수 주소를 넣어주면..!


    level 18의 권한을 가진 쉘을 띄울수 있을것같습니다.


    이에 착안하여 gdb를 이용하여 attackme를 디스어셈블 해보았습니다.



    역시 버퍼의 총 크기는 56 byte 이고, ebp-16의 위치에 printit()의 주소를 넣어줌을 확인할 수 있습니다.



    확실하게 disas printit을 통해 0x08048490 주소가 printit() 임을 확인하였고,



    환경변수의 주소를 구해줄 ad 프로그램을 하나 만들어줍니다.


    ad.c 에서 getenv() 에는 인자로 제가 만들 fkillrra 라는 이름의 환경변수를 넣어줌으로서 환경변수의 주소가 출력되도록 하였습니다.



    그리고 이와같이 export 명령으로 쉘을 띄워주는 환경변수를 만들어 주고



    ad라는 환경변수 주소를 구하는 프로그램을 실행시켜 0xbffffc17 이라는 주소를 출력해냈습니다.


    이제 페이로드 부분을 보시면 이전과 같이 A를 40개 넣어주고, 마지막에 리틀엔디언으로 환경변수의 주소를 넣어주면


    위 사진과 같이 level 18의 권한으로 쉘을 띄운것을 볼 수 있습니다.


    정말 쉽게 level 18의 password를 알게되었네요 ㅎㅎㅎㅎ


    level 18의 password 는 "why did you do it" 입니다.


    이상 풀이를 마칩니다.


    /* 제 풀이에 대한 질문이 있으신분들은 댓글로 질문해주시면 감사하겠습니다. (피드백 부탁드립니당)*/



    반응형

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

    level 19. 풀이  (0) 2018.01.06
    level 18. 풀이  (0) 2017.12.24
    level 16. 풀이  (0) 2017.12.03
    level 15. 풀이  (2) 2017.11.26
    level 14. 풀이  (0) 2017.11.12
Designed by Tistory.