ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LEVEL 17
    WARGAME/FTZ 2018. 5. 7. 18:40
    level17

    FTZ LEVEL17


    [Summary]

    1. 소스코드의 11 행에서 fgets 함수를 통해 44(40+4) 바이트 만큼 버퍼를 복사한다.
    2. 소스코드의 9 행에서 call 함수 포인터 변수에 printit 함수의 주소를 넣기 때문에 buf 배열 이상의 데이터를 덮어 씌울수 있다.
    3. 소스코드의 13 행에서 call 함수 포인터를 호출하기 전 fgets 함수를 통해 call 함수 포인터 변수가 가리키는 printit 함수 주소가 아니라 shell 코드가 위치한 환경변수의 주소로 변조함으로써 level18(3098) 권한의 쉘을 획득하였다.

    [Sourcecode]

    1.  #include <stdio.h>
    2.
    3.  void printit() {
    4.    printf("Hello there!\n");
    5.  }
    6.  
    7.  main()
    8.  { int crap;
    9.    void (*call)()=printit;
    10.   char buf[20];
    11.   fgets(buf,48,stdin);
    12.   setreuid(3098,3098);
    13.   call();
    14. }
    15.
    16.  // attackme.c
    

    [Analysis]

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

    • attackme 소스코드 11행을 보면 fgets 함수를 통해 stdin(Standard Input) 에서 입력받은 버퍼를 buf 배열에 최대 48바이트만큼 복사한다.
    • FTZ LEVEL14 와 같이 소스코드 상에서는 buf 배열 크기가 20 이지만 실제로 20 이상의 버퍼가 할당되어 있을것이다.(자세한 내용 참조 : http://mdkstudy.tistory.com/41)
    • 또한, 소스코드 9행에서 call 함수 포인터 변수에 printit 함수의 주소를 할당받는다.
    • call 함수 포인터 변수를 변조시킴으로써 printit 함수가 아닌 다른 함수등을 호출시킬수 있다.
    • 이제 소스코드를 통해 전체적인 흐름은 파악했으니 gdb 를 이용해 실행시켜보면서 동적 분석을 진행한다.

    • gdb 에 실행파일을 로드한 뒤 main 함수의 call 함수 포인터 변수가 가리키는 주소를 호출하는 루틴에 브레이크포인트를 건다.
    • 또한, main+57 라인에서 eax 레지스터에 ebp-16 을 mov 하고 main+60 라인에서 eax 레지스터를 호출하는것을 보아하니 ebp-16 위치의 값을 변조하면 원하는 함수를 호출시킬 수 있다.

    • Dummy Data 44("A"*40 + "B"*4) 바이트를 넣고 실행한다.
    • bp(BreakPoint) 가 걸리고 ebp-16 를 확인해보면 필자가 넣은 Dummy Data "A" 40바이트 뒤에 "B" 4바이트가 입력된것을 확인할 수 있다.

    • FTZ LEVEL16 와 다른점은 shell 함수가 따로 없기 때문에 환경변수등과 같이 다른곳에 쉘코드를 위치시켜주어야 한다.
    • 환경변수에 NOP 와 쉘코드를 등록시켜주고 ulimit -c unlimited 명령을 통해 필자가 등록한 쉘코드의 정확한 위치를 구한다.
    • Segmentation Fault 가 발생하고 core 파일이 생기면 gdb 를 통해 core 파일을 로드시킨다.

    • 대충 0xbffffc00 위치 정도의 스택 메모리를 살펴보면 필자가 등록한 EGG 변수의 위치를 알수있다.
    • "EGG=" 부분은 날려 쓸모없는 부분이므로 NOP(0x90) 가 시작하는 0xbffffc1d 주소를 ret 에 덮으면 된다.

    [Exploit]

    python -c 'print "A"*40 + "\x1d\xfc\xff\xbf"' > payload
    (cat payload;cat) | ./attackme
    my-pass
    

    [References]


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

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