ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FTZ Level19 풀이]
    System/FTZ 2018.02.17 01:20

    [Level19 Code]

    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
     
    void main()
    char buf[20];
      gets(buf);
      printf("%s\n",buf);
    }  
     
    cs

    코드는 굉장히 심플하다.

    gets( )에서 BOF취약점이 발생하니까, 이 점을 이용해서 RTL공격으로 쉘을 따도록 하겠다.

    RTL에 대해서는 블로그에 정리해두었으니, 참고하길 바란다.

    [RTL 정리글]


    RTL공격을 하기 위해서는 System( )주소, /bin/sh의 문자열 위치, RET까지의 offset을 구해야 한다.

    우선 attackme가 사용하는 libc버전을 확인해보자


    [ldd attackme]

    ldd명령어로 libc버전이 /lib/tls에 위치한 so.6버전임을 알아냈다.

    libc버전을 알아냈으니 이제 System( )와 /bin/sh의 문자열의 위치를 알아보자


    [System( ) Address]


    [/bin/sh문자열 위치]


    System( )의 주소는 [0x4203f2c0]이고, /bin/sh 문자열은 [0x42127ea4]에 위치한다.

    이제 offset만 구하면 모든 준비는 끝난다.


    [RET offset]

    [ ESP - EIP = 44 ]

    따라서, offset은 44다.


    이제 RTL공격을 시도해보자

    ?????

    쉘을 따긴 땄는데, 권한이 상승되지 않고 Level19권한 그대로다.

    보안상의 이유로 일정버전부터는 그냥 쉘을 실행하면 권한상승해주는 기능이 제거되었다.

    앞선 문제들을 봐도 쉘을 실행시키기 전에 setreuid( )라는 함수로 권한상승을 해준 뒤

    쉘이 실행되는 모습을 볼 수 있다.

    따라서, Chaining RTL로 setreuid( )를 실행한 뒤 쉘을 실행해야 한다.

    Chaining RTL도 블로그에 정리해두었으니 참고하길 바란다.

    [Chaining RTL 정리글]






    [Chaining RTL]

    간단하게 말하자면, RTL을 연속적으로 진행하는 것을 말한다.

    RTL Payload를 보면 System( )와 /bin/sh사이에 더미값이 들어가는 것을 볼 수 있는데

    이 값은 일반 더미값이 아닌, System( )가 끝나고 실행될 함수의 주소이다.

    우리는 쉘이 실행된 뒤 과정은 상관없으니 그냥 AAAA라는 더미값을 넣어줬던 것이다.


    자 우선 Chaining RTL을 위해선 몇가지의 정보가 더 필요하다.

    1. PPR gadget

    2. setreuid( ) 주소


    PPR gadget부터 찾아보도록 하자

    objdump를 이용하면 된다.


    [PPR gadget]

    [0x0804849d]에 위치한 gadget을 사용했다.


    #여기서 PPR gadget을 사용하는 이유는?

    - setreuid( )의 인자값이 2개 이기때문에 인자값 두개를 POP할 PPR gadget 필요한 것이다.


    이제 setreuid( )의 주소를 알아내면 된다.

    system( )의 주소를 알아냈던 것과 같은 방법이다.

    보면 setreuid( )의 주소는 [0x420d7920]임을 알 수 있다.

    이제 필요한 정보들을 다 모았으니 정리를 한번 해보자


    #Chaining RTL 정보수집

    1. RET offset : 44


    2. System( ) 주소 : [0x4203f2c0]


    3. /bin/sh문자열 위치 : [0x42127ea4]


    4. PPR gadget 주소 : [0x0804849d]


    5. Setreuid( ) 주소 : [0x420d7920]


    PAYLOAD : A*44 + Setreuid( ) + PPR gadget + Param_1(3100) + Param_2(3100) + System( ) + AAAA + /bin/sh

    쉘을 성공적으로 따냈다.

    자 이제 마지막 문제 Level20으로 넘어가보도록 하자!



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

    [FTZ Level20 풀이]  (0) 2018.02.18
    [FTZ Level19 풀이]  (0) 2018.02.17
    [FTZ Level18 풀이]  (1) 2018.02.17
    [FTZ Level17 풀이]  (0) 2018.02.16
    [FTZ Level16 풀이]  (0) 2018.02.16
    [FTZ Level15 풀이]  (0) 2018.02.16

    댓글 0

Designed by Tistory.