ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LEVEL 10 skeleton write-up
    System hacking training/Hackerschool LOB 2018. 4. 11. 16:58

    vampire -> skeleton


    [문제]



    조건들이 많다.


    하나씩 살펴보면 이러하다.


    먼저 인자는 두개 이상 줘야하고 egghunter에 의해서 eggshell을 사용하여 익스플로잇할 수 없다.

    그리고 ret 주소의 마지막 바이트에는 \xbf가 들어가 있어야한다. 이 말은 즉 스택에 쉘코드가 있어야한다는 것으로 생각이 된다.

    그리고 argv[1] (첫 번째 인자)의 길이가 48이상이면 안된다.

    마지막으로 buffer와 argv[N]의 모든 값들을 0으로 초기화하며 종료한다.


    그리하여 이전까지 넣어줬던 공간 argv, 환경변수, buffer가 모두 0이된다.




    [삽질 - 풀이와 무관함]


    그리하여 살질을 하였는데..


    생각해낸 방법이 argc를 integer overflow하여 int의 범위를 넘어서 음수 혹은 0으로 조작하면 ultra argv hunter 부분의 for문이 제대로 작동하지 않아서

    ultra argv hunter를 우회하고 argv[]의 값이 모두 지워지지 않아 익스플로잇을 할 수 있을것이다.


    라고 생각을 했다...


    진짜로 바뀌는지 확인해보기 위해 프로그램을 만들어보았다.



    간단하게 argc의 값을 출력해주는 프로그램이다.


    이제 인자로 int 형의 범위를 벗어나도록 입력해주고 확인해보았다.



    이 처럼 A라는 인자값을 2147438647개를 넣어보았다.


    하지만 에러를 뱉어낸다.


    main() 의 인자를 몇개 줄 수 있는지 찾아보니 제한은 없단다..


    일단 안되니 넘어갔다...




    다시 문제로 돌아와서 integer overflow 는 하지 못하였고 스택 공간 어딘가로 return 해야하기 때문에 gdb로 분석해보았다.


    ebp 부터 높은주소로 가면서 문자열로 확인을 해보았다.



    그랬더니 스택에 이런 바이너리의 경로가 들어있는것을 발견했다.


    왜 argv[0]를 0으로 세팅해줬는데 남아있지..? 라는 생각을 했지만

    이건 argv[0] 가 아니라는것을 금방 알 수 있었다.


    argv[0]에는 당연히 ./skeleton 가 들어간다.


    그리고 지금 위에서 확인한 것은 바이너리의 경로이다.


    그렇다면 이곳에 쉘코드를 넣고 return 하면 될것이다.


    어떻게 넣을까..?


    바로 이전 문제에서도 몇번 해본적이 있는 link 파일을 생성하여 익스하면 될듯하다.

    링크파일명에 쉘코드를 넣는다면 당연히 경로도 위의 그림과같이 들어가게될것이고

    이 위치로 return 하면 쉘을 띄울 수 있을것이다.


    따라서 심볼릭 링크파일을 만들어주고

    gdb로 Nop Sled가 들어가는 위치를 확인하였다.



    이 중 아무 주소나 잡고 공격을 하면 된다.



    이상 풀이를 마친다.


    반응형

    'System hacking training > Hackerschool LOB' 카테고리의 다른 글

    LEVEL 12 darkknight write-up  (0) 2018.04.22
    LEVEL 11 golem write-up  (0) 2018.04.20
    LEVEL 09 vampire write-up  (2) 2018.04.04
    LEVEL 08 troll write-up  (0) 2018.03.31
    LEVEL 07 orge write-up  (0) 2018.03.31
Designed by Tistory.