ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LEVEL 07 orge write-up
    System hacking training/Hackerschool LOB 2018. 3. 31. 03:07

    darkelf -> orge


    [문제 + 힌트]





    orge.c 파일을 열어보면 바이너리에 대한 c 코드가 나온다.


    먼저 이 바이너리는 strcpy()의 사용으로 인해 bof 취약점이 존재한다.

    strcpy()는 문자열의 길이를 확인하지 않아서 NULL 이전의 모든 문자를 복사하기 때문에

    main 함수의 인자 argv[1]에 40byte 이상의 문자열을 넣어준다면 return address 를 변조할 수 있을것이다.


    따라서 우리는 이 바이너리를 이용하여 다른 행위를 가능케하는데 (쉘을 띄울 수 있다.)

    orge.c 파일을 보면 많은 조건들이 있다.


    그 조건들은 아래와 같다.


    1. argc < 2 이면 exit(0) 으로 종료한다. 인자가 2개 이상이여야한다.

    2. argv[0]의 길이가 77이 아닐경우 역시 종료한다.

    3. egghunter로 인해서 환경변수에 쉘코드를 올리더라도 ret instruction에 도달하기 전에 0으로 초기화된다.

    4. argv[1][47] 의 값이 \xbf 가 아닐때도 종료된다. 따라서 return address 는 스택의 임의의 주소로 덮어줘야한다. (bf 로 시작하는 주소는 스택이므로)

    5. argv[1] > 48 이면 종료한다.

    6. strcpy()로 argv[1]의 값을 buffer에 복사하지만 buffer hunter에서 buffer에 값을 모두 0으로 초기화한다. (buffer에 쉘코드를 넣고 실행할 수 없다.)


    쉘코드를 넣어줄 공간은 argv[1] 부터 스택의 여러 공간이 있다.


    처음에는 argv[1]의 길이를 체크하기 때문에 argv[2]에 쉘코드를 올리는게 편하다고 생각을 했고

    이후에는 argv[1]에도 충분히 쉘코드를 올려서 쉘을 띄울 수 있다고 생각했다.


    따라서 argv[1] or argv[2]에 쉘코드를 올리고 return address를 변조하여 쉘을 띄울 수 있다.


    하지만 이 바이너리를 실행하면 argv[0] 의 길이가 77이 아니기 때문에  쉘코드가 위치한 주소로 return 하기 전에 바로 종료가 된다.


    따라서 argv[0]의 길이를 77로 만들어줘야한다.

    argv[0]에는 바이너리의 이름이 들어가고 linux에서 ln이라는 파일링크 명령어를 사용하여 해결할 수 있다.




    ln (link) 명령은

    파일의 링크를 생성할 때 사용하는 파일 연결 명령어이고 하나의 파일에 이름을 두개 유지하는 방법을 제공하는것이다.


    링크 생성을 통해 편리하게 파일과 디렉토리를 관리하기 위해 이 명령어를 자주 사용하곤 한다.

    (사실 이게 있는지 몰랐다.... 삽질의 결과이다.)


    마치 윈도우의 바로가기 같은것이라고 생각한다.


    ln 에 대한 사용법은 아래와 같다.



    아무런 옵션없이 ln [source binary] [target binary] 해주면 하드링크가 걸린 파일을 생성할 수 있다.


    여기서 -s 라는 옵션을 넣어주면 심볼릭 링크가 걸린 파일을 생성할 수 있다.



    이 둘의 차이는 위 그림과 같이 하드 링크가 걸린 파일 BBBB와 심볼릭 링크가 걸린 파일 AAAA가 '->' 의 기호로 차이를 보인다.


    먼저


    심볼릭 링크 (Symbolic Link) 란?


    ▶ 단순히 원본파일을 가리키도록 링크만 걸어둔것이다.

    원본파일이 있고 심볼릭 링크는 그 파일을 가리키는 것인데

    이 심볼릭 파일을 수정한다면 원본파일도 수정이 된다.


    심볼릭 링크는 소프트 링크라고도 하며 윈도우의 바로 가기 기능과 유사하다.

    + 원본 파일이 삭제된다면 그 링크는 사용할 수 없다.


    하드 링크 (Hard Link) 란?


    ▶ 원본 파일과 다른 이름으로 존재하는 동일한 파일이며 원본 파일과 동일한 내용의 다른 파일이다.

    복사의 개념은 아니고 하나의 파일에 이름만 두개 이상 붙어 있는게 하드링크이다.

    링크를 건 파일(target) or 걸린 파일(source) 둘 중 하나를 수정하면 두 파일 모두 수정이 된다.

    하지만 원본 파일이 지워지더라도 링크 파일은 남아 있다.


    ex) 10MB 파일이 있고 그 파일을 하드 링크하여 총 파일이 두개(링크 파일, 파일)여도 실제 차지하는 디스크 용량은 20MB가 아닌 10MB이다.



    다시 문제 풀이로 돌아와서

    심볼릭 링크 or 하드 링크 이 둘 중 하나를 이용하여 argv[0]의 길이를 77로 링크 파일을 만들어주면 조건문 만족

    하지 않아 바이너리를 실행 시킬 수 있다.


    하지만 직접 확인을 해보면 조금 다른듯 하다.


    실제로 77개의 A의 이름으로 orge 파일에 링크를 걸어 실행하려 하였으나 argv[0] error를 출력해서

    '.' 와 '/' (ex 바이너리를 실행 시킬때 : ./binary_name) 까지 포함을 하여 argv[0]에 들어간다고 생각하여 77 - 2 하여 75의 길이의 이름을 가진 링크 파일을 만들고 실행하였다.


    그랬더니 다행히도 argv[0] error가 나지 않는다.


    그리고 한가지 궁금한점이 있는데

    argv[1] 혹은 쉘코드가 들어간 위치의 주소를 알아야 return address를 변조하고 쉘을 띄울 수 있는데

    문제는 gdb로 분석을 했을때 argv[0] error를 출력하며 바이너리가 종료된다. (왜 그런지 모르겠다..)



    하지만 core 파일을 만들어서 core dump를 하여 쉘코드가 들어간 위치의 주소를 찾을 수 있었고



    이렇게 tmp 디렉토리에 가서 같은 환경을 구성하고 core 파일을 생성하였고 argv[1]의 위치를 확인해보면

    \x90이 44개 들어가 있는것을 확인할 수 있다.



    이제 nop sled가 들어간 위치 중 아무곳이나 return address로 잡아서 변조해주면 된다.


    따라서 페이로드를 작성해보면


    이렇게 쉘을 띄울 수 있다.


    + argv[2] 에 쉘코드를 올려서 풀이를 할 수도 있다.



    마찬가지로 인자 두개를 주면서 core 파일을 생성하여 분석한 뒤 0x90이 들어가 있는 위치를 확인한 후 익스할 수 있다.



    like this :)



    이상 풀이를 마친다.

    반응형

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

    LEVEL 09 vampire write-up  (2) 2018.04.04
    LEVEL 08 troll write-up  (0) 2018.03.31
    LEVEL 06 darkelf write-up  (0) 2018.03.21
    LEVEL 05 wolfman write-up  (0) 2018.03.16
    LEVEL 04 goblin write-up  (0) 2018.03.16
Designed by Tistory.