ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LEVEL 14
    WARGAME/FTZ 2018. 4. 29. 16:31
    level14

    FTZ LEVEL14


    [Summary]

    1. 소스코드의 13 행에서 fgets 함수를 통해 Max 15바이트 만큼 버퍼를 복사한다.
    2. 소스코드의 14~18 행에서 check 변수의 값이 0xdeadbeef 이면 setreuid 함수와 system 함수를 통해 level15(3095) 권한의 쉘을 획득할 수 있다.
    3. buf 배열의 길이 (20 + 20)바이트만큼 덮고 check 변수의 값을 0xdeadbeef 로 변조함으로써 level15(3095) 권한의 쉘을 획득하였다.

    [Sourcecode]

    1.   // 레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다.
    2.   // 버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이
    3.   // 최고의 효과를 가져다줍니다.
    4.   
    5.  
    6.  #include <stdio.h>
    7.  #include <unistd.h>
    8.   
    9.   main()
    10.  { int crap;
    11.    int check;
    12.    char buf[20];
    13.    fgets(buf,45,stdin);
    14.    if (check==0xdeadbeef)
    15.     {
    16.       setreuid(3095,3095);
    17.       system("/bin/sh");
    18.     }
    19.  }
    20.  
    21.  // attackme.c
    

    [Analysis]

    • setuid 가 설정되어 있으면 gdb 가 동작하지 않기 떄문에 tmp 디렉토리에 cp 명령을 이용하여 복사한다.

    • attackme 소스코드 13행을 보면 fgets 함수를 통해 stdin(Standard Input) 에서 입력받은 버퍼를 buf 배열에 최대 45바이트만큼 복사한다.
    • 소스코드 상에서는 buf 배열 크기가 20 이지만 실제로 20 이상의 버퍼가 할당되어 있을것이다.(자세한 내용 참조 : http://mdkstudy.tistory.com/41)
    • 또한, 소스코드 14~18행에서 check 변수의 값이 0xdeadbeef 이면 setreuid 함수와 system 함수를 통해 level15(3095) 권한의 쉘을 획득할 수 있다.
    • 그러나 check 변수의 입력을 받는곳이 없기 때문에 fgets 함수를 통해 buf 배열의 크기 이상을 복사함으써 check 변수의 값을 변조시켜야한다.
    • 이제 소스코드를 통해 전체적인 흐름은 파악했으니 gdb 를 이용해 실행시켜보면서 동적 분석을 진행한다.

    • gdb 에 실행파일을 로드한 뒤 main 함수의 ret 와 check 변수의 값이 0xdeadbeef 인지를 검사하는 루틴에 브레이크포인트를 걸고 실행한다.

    • fgets 함수를 통해 입력을 받기 때문에 FTZ LEVEL12 의 gets 함수와 동일하게 payload 라는 파일을 만들어서 attackme 실행파일에 넘겨줄 것이다.
    • gdb 에서 shell 로 나가지 않고 쉘명령어를 사용 하는 방법은 shell 명령어 뒤에 바로 쉘명령어를 쓰면된다. (ex. shell ls -l)
    • bp(BreakPoint) 가 걸리고 esp 를 확인해보면 필자가 넣은 "A" 20바이트가 입력된것을 확인할 수 있다.

    • bp 가 걸린상태에서 다음명령을 확인하기 위해서는 x/[숫자]i $eip 를 입력하면 된다.
    • cmp(compare) 명령으로 0xdeadbeef 와 0xfffffff0(%ebp) 를 비교하는데 뒤의 의미는 ebp 에서 16바이트만큼 뺀 주소의 값이랑 비교한다는 의미이다.
    • 현재 시스템에서 gdb 는 at&t 문법으로 보여주기 때문에 set disassembly-flavor intel 명령을 입력하면 intel 문법으로 볼 수 있다.
    • intel 문법으로 표시된 cmp 명령을 보면 0xdeadbeef 와 ebp-16 을 비교하는것을 볼 수 있다.

    • ebp-16 주소의 값을 보면 필자가 입력한 "A" 20바이트 + 20바이트를 더 채워야지 ebp-16 주소를 변조할 수 있는것을 볼 수 있다.

    • payload 에 "A" 20바이트, "B" 4바이트를 넣고 실행해보면 예상했던대로 ebp-16 의 값이 정상적으로 변조된 것을 확인할 수 있다.

    • 이제 payload 에 "A" 40바이트, 0xdeadbeef 4바이트를 넣고 실행하면 level15 권한의 쉘을 획득 할 수 있을것이다.

    [Exploit]

    python -c 'print "A"*40 + "\xef\xbe\xad\xde"' > payload
    (cat payload;cat) | ./attackme
    

    [References]


    'WARGAME > FTZ' 카테고리의 다른 글

    LEVEL 16  (0) 2018.05.06
    LEVEL 15  (0) 2018.05.05
    LEVEL 13  (0) 2018.04.27
    LEVEL 12  (0) 2018.04.26
    LEVEL 11  (0) 2018.04.24
Designed by Tistory.