ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Rookiss ] loveletter
    System/Pwnable.kr 2018. 8. 26. 05:10

    이번에 새로 추가된 Rookiss문제다.

    포인트는 제대로 잡았는데, 제대로 활용을 못해서 굉장히 오래 걸렸다..ㅠㅠ


    우선 문제 취약점은 로직버그로 생긴 BoF이며, Command Injection을 이용해서 쉘을 따내는 문제다.

    Canary때문에 RET를 직접 덮을 수는 없으며, Size 공간 Overflow가 가능해서 이 부분을 공략하면 되는 문제다.


    Command Injection으로 쉘 명령어를 실행시킬 수 있는 환경을 조성했더라도

     Input의 dummy값까지 명령어로 인식해버려서 이 부분까지 신경을 써줘야 한다.


    따라서 STAGE 1 - BoF로 Command Injection으로 쉘 환경 조성하기 

     STAGE 2 - Input dummy값 처리하기  로 나눠서 Write up을 작성하도록 하겠다.




    [ STAGE 1 ]

    우선 바이너리는 32bit이고, Dynamically Linked 방식이며, Symbol정보가 살아있었다.


    [ main ]

    main함수가 실행되면, v5와 v6에 prolog(echo I love)와 epilog( very much!)의 길이를 저장하고 있다.

    그 후, Input은 protect( )의 인자값으로 넘어가고 마지막에 Command Injection이 발생한다.


    [ protect ]

    protect( )에서는 Input값을 필터링하는 기능을 한다.

    Input값과 주황박스에 값들과 1Byte씩 비교 하고, 예외처리에 걸리면 해당 1Byte를 0xa599e2(♥)로 필터링한다.

    여기서 BoF가 발생하며, Input값이 포인터형태로 넘어왔기 때문에 BoF가 발생하는 Stack Frame은 main( )가 된다.

    따라서, prolog의 size값을 조작할 수 있게 된다.


    [ Command Injection ] 

    prolog의 size값(v5)를 0으로 만들어 주면 loveletter의 시작 문자열은 우리가 입력한 Input이 된다.


    그렇다면, 어떻게 v5의 값을 0으로 만들어줄 수 있을까?

    \x00과 같은 NULL값을 입력하면 입력이 멈추기 때문에 스택에 저장되지 않는다.

    포인트는 protect( )에서 0xa599e2로 필터링하는 부분에 있다.


    [ Filtering ]

    주황박스를 보면 필터링할 때, DWORD로 캐스팅하여 저장하고 있다.

    DWORD의 크기는 4Byte이며, 저장되는 값은 3Byte이기 때문에 나머지 1Byte는 NULL로 저장된다.


    따라서, 마지막에 길이를 잘 맞춰서 필터링되는 문자 하나만 넣어주면 v5공간에 NULL값이 저장되게 된다.


    [ v5 ]

    이제 system( )로 넘어가는 버퍼의 시작주소는 우리가 입력한 Input값이 되었으므로 /bin/sh을 실행시킬 수 있다.


    [ /bin/sh ]

    쉘을 성공적으로 실행시켰지만, BoF를 위한 dummy값까지 명령어로 들어가버렸다.




    [ STAGE 2 ]

    우선 우리가 사용가능한 특수문자부터 나열해보면

    ! % - _ + = : / .

    이렇게 있다.

    여기서 포인트는 / 와 - 다.


    /bin/sh을 실행하는 쉘코드를 보면 /bin//sh 이러한 형태의 쉘코드를 볼 수 있을 것이다.

    이유는 //sh(4byte)를 맞추기 위함인데, /는 여러번 입력되도 하나만 인식하기 때문에 

    몇번을 입력하던 /bin/sh실행시키는데 아무런 영향을 끼치지 않는다.


    [ //////////bin///////////sh ]

    짠!


    이제 남은건 뒤에 붙는 ♥와 그외의 dummy값들이다.

    여기서는 - 를 이용해서 /bin/sh의 옵션 메커니즘을 이용하면 된다.


    /bin/sh은 -뒤에 오는 1~2개의 문자만 인식하기 때문에, 유효한 문자를 준 다음에

    공백으로 ♥와 그외의 dummy값들을 무시하도록 하면 된다.


    [ /bin/sh 옵션 ]

    짠!




    [ Exploit ]


    'System > Pwnable.kr' 카테고리의 다른 글

    [ Rookiss ] Ascii_easy  (2) 2019.04.05
    [ Rookiss ] Alloca  (1) 2019.03.24
    [ Toddler's Bottle ] asm  (4) 2019.03.09
    [ Rookiss ] otp  (1) 2019.03.06
    [ Rookiss ] Simple Login  (2) 2019.01.17

    댓글

Designed by Tistory.