ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LEVEL 08 troll write-up
    System hacking training/Hackerschool LOB 2018. 3. 31. 20:28

    orge -> troll


    [문제]



    troll.c 파일을 살펴보면 많은 조건들이 걸려있다.


    그 조건들은 아래와 같다.


    1. argc 는 무조건 2여야한다. 이 말은 즉 바이너리 이름 + 인자 1개가 아닐경우 종료시킨다는 것이다.

    2. egg hunter로 환경변수에 쉘코드를 올려도 0으로 초기화되므로 환경변수를 사용하는 것은 의미가 없다.

    3. argv[1] 첫번째 인자값 마지막에 \xbf 인지 검사한다.

    4. argument의 길이를 체크해서 48보다 크면 종료시킨다.

    5. strcpy() 의 사용으로 bof 취약점이 존재한다.

    6. one more 부분에서 argv[1]의 값을 0으로 초기화 해주면서 argv[1]에 쉘코드를 올리더라도 사용할 수 없다.


    결론 : buffer hunter로 인해서 buffer에 쉘코드를 올려도 사용할 수 없고 argv[1]에 쉘코드를 올릴 수도 없다.

    그렇다고해서 인자를 더 넣는다면 argc 가 3 이상이 되서 종료될것이다.


    이전 문제에서 링크 파일을 이용하여 argv[0]의 길이를 우회한 기억이 있다.


    따라서 쉘코드를 올려서 사용하기에 가장 적절한 곳은 argv[0] 판단된다.


    그렇다면 링크를 걸때 target file에 쉘코드를 넣고 return address를 argv[0]의 주소로 덮어주면 exploit을 할 수 있을 것이다.


    여기서 문제가 있는데


    내가 사용하는 쉘코드는


    \x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80


    이런 25byte의 쉘코드를 사용하지만

    argv[0]에 쉘코드를 넣으면 쉘코드의 0x2f ('/')가 경로로 인식이 되어 작동하지 않는다는 것이다.


    따라서 쉘코드에 0x2f가 없는 쉘코드를 사용해야하는데


    일단은 구글링해서 가져왔다.


    35byte의 0x2f가 없는 쉘코드이다.


    \x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80


    이제

    이 쉘코드를 ln 으로 링크 파일로 만들어주고 return address를 argv[0]의 주소로 덮어주면 된다.

     

    먼저 tmp 디렉토리로 가서 심볼릭 링크 파일을 만들어준다.



    그리고 argv[0]의 주소를 구하기 위해 core 파일을 생성한다.



    이제 argv[0] 의 주소를 구하고..



    실제 바이너리가 위치한 곳으로 이동하여 익스플로잇하면 된다.

     

    nop sled가 들어간곳 중 적당한 위치를 ret에 덮어주면 쉘을 딸 수 있다.



    이상 풀이를 마친다.

    반응형

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

    LEVEL 10 skeleton write-up  (0) 2018.04.11
    LEVEL 09 vampire write-up  (2) 2018.04.04
    LEVEL 07 orge write-up  (0) 2018.03.31
    LEVEL 06 darkelf write-up  (0) 2018.03.21
    LEVEL 05 wolfman write-up  (0) 2018.03.16
Designed by Tistory.