ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FTZ Level16 풀이]
    System/FTZ 2018. 2. 16. 20:06

    [Level16 Code]

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

    코드를 보면 call( ) printit( )를 저장해서 call( )가 실행되면 printit( )함수가 실행되도록 되어있다.

    그리고 위에 shell( )는 쉘을 실행시켜준다.


    따라서, 우리는 printif( )의 주소가 저장되는 스택에 shell( )의 주소를 저장해서

    call( )가 실행되면 shell( )가 실행되도록 만들면 될 것이다.


    [Level16 main]

    주황색 박스를 보면 fgets함수에 인자값 buf의 주소를 넘겨주는 것을 볼 수 있다.

    따라서, buf의 시작위치는 [EBP-56]인 것을 알 수 있다.


    그리고 빨간색 박스에서 [EBP-16]에 저장되어 있는 주소를 EAX에 저장한 후 EAX의 담긴 주소를 호출한다.

    여기서 EAX는 Call( )이고, [EBP-16]이 printit( )의 주소가 저장되어 있는 곳이라는 걸 알 수 있다.

    따라서, buf와 40Byte 떨어진 곳에 Shell( )의 주소를 넣어주면 쉘이 실행이 될 것이다.


    [Level16 objdump]

    자 shell( )의 주소는 [0x080484d0]이다.


    페이로드를 실행해보면

    보는 것처럼 Shell( )가 실행된 것을 볼 수 있다.

    이제 Level17을 풀러가보자


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

    [FTZ Level18 풀이]  (1) 2018.02.17
    [FTZ Level17 풀이]  (0) 2018.02.16
    [FTZ Level15 풀이]  (0) 2018.02.16
    [FTZ Level14 풀이]  (0) 2018.02.16
    [FTZ Level13 풀이]  (0) 2018.02.16

    댓글

Designed by Tistory.