ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Level12 (golem -> darkknight)
    $ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:33

     

    위의 코드를 확인해 보면 FPO 기법을 이용하는 문제 입니다.

    SFP는 무엇인가, FPO 기법이 무엇인가 에 대해서 먼저 공부를 해봐야 할 것 같습니다.

     

    FPO를 사용하기 위해서는 필요한 조건이 존재 합니다.

    1. SFP 영역에서 1바이트 오버플로우가 반드시 일어나야 합니다. (strncpy에 보면 41-40 = 1 바이트)

    2. 메인 함수 이외의 sub 함수가 필요합니다. (main 함수 이외에 problem_child 함수가 존재 한다.)

     

    SFP 란?

    Stack Frame Pointer의 약자로 Saved Frame Pointer 라고도 불립니다.

    이전의 함수의 EBP 주소를 저장하는 공간 입니다.

     

    1바이트를 이용해서 OverFlow를 실행해야 하는데, 여기서 1바이트는 SFP의 첫 바이트를 이야기 합니다.

    FPO는 Frame Point Overwrite 의 약자입니다. 모든 함수의 Stack Frame은 Prolog를 시작으로  Epilog로 끝이 납니다.

     

    Prolog 와 Epilog는 임시로 적어놓은 블로그 글에서 확인 하실 수 있습니다.

     

    그렇다면 이제 문제를 한번 풀어보겠습니다.

    buf를 A로 전부 채우고 SFP 1바이트는 \xff로 넣으면 core dump가 생성이 됩니다.

     

    그리고 gdb로 값을 열어 아래와 같이 x/2000x $esp-1000 를 검색해 보면 버퍼와 SFP를 확인 할 수 있습니다.

     

    0xbffffa80에서 buf가 시작을 하고 SFP 부분을 확인해 보면 bffffaff로 ff가 쓰여진것을 확인 할 수 있습니다.

     

    leave 명령의 내부에 존재 하는 pop ebp를 하면 ebp(SFP)에 있는 주소로 ebp가 이동하게 됩니다.

    또한 ret 내부에 있는 pop eip를 하면 esp가 ebp+4로 이동을 하게 됩니다. 그리고 pop eip를 하게 되면 esp가 가리키는 값을 eip에 넣게 되고 해당 주소로 점프 하게 됩니다.

     

    위와 같은 과정을 거쳐서 프로그램이 실행이 되는데, 글로만 보면 이해가 분명히 안될 테니 Stack Frame 을 도형화 해서 확인해 보겠습니다.

     

    먼저 상황은 main함수에서 problem_child 함수에 들어가 Epilog에 도달 했을때의 상황입니다.

    또한 exploit 으로 아래와 같은 값을 넣은 상태라고 생각을 해보겠습니다.

     

     

    Epilog에 도달하면 처음 보이는 leave 명령어! 그중에서도 mov esp, ebp를 하면 위와 같이 esp의 주소가 ebp와 같아 집니다.

     

    SFP에 Buffer의 첫 주소-4 의 주소 값이 들어가 있기 때문에 pop ebp를 하면 ebp가 Buffer-4로 가게 되고, ESP는 pop을 했기 때문에 EBP+4 로 이동했습니다.

     

    leave 명령어를 지나면 ret 명령어가 나오는데 ret 내부 명령어중 하나인 pop eip를 하게 되면 pop을 하기 때문에 RET(EBP+4)에 EIP가 자리잡게 되고, ESP는 EBP+8로 이동하게 됩니다.

     

    그리고 jmp eip를 하면 RET에 들어있는 main함수에서의 call problem_child 바로 다음 주소로 이동을 하게 됩니다.

     

    이제 main이 마무리 될쯤에 main 함수의 Epilog를 만나게 될 것 입니다.

     

    leave 내부 명령인 mov esp, ebp 를 실행하면  EBP를 따라서 Shellcode를 넣은 Buffer주소+4 위치에 놓이게 됩니다.

    그다음 pop ebp를 하게되면 아래와 같이 EBP는 어딘가로 pop이 되고 ESP 가 4만큼 이동 하게 됩니다.

     

    ret 내부 명령어인 pop eip를 수행하면 eip가 esp 주소에 위치를 하고 ESP는 pop의 결과로 4만큼 이동하게 됩니다.

     

    그다음 명령어가 jmp eip인데 EIP는 쉘코드 주소를 의미 하고 있기 때문에 쉘코드를 실행 하게 되는 것 입니다.

     

    방법을 알았으니 이제 다시 앞에서 어느 주소에 buf를 채워나아가는지 확인해 보겠습니다.

     

    입력을 받기 시작한 주소는 0xbffffa80 입니다. 하지만 exploit 할때는 buffer 입력받는 주소 - 4 만큼의 주소를 SFP에 넣어 줘야 익스가 가능합니다.

    그렇기 때문에 SFP에 들어가야 하는 주소는 0xbffffa7c 입니다.

    현재 0xbffffa 까지는 잘 들어가 있고 한자리만 다르기 때문에 "\x7c"를 넣으면 될것 같습니다.

     

    login : darkknight

    password : new attacker

    '$ 시스템 해킹 $ > Los Of BufferOverflow' 카테고리의 다른 글

    Level14 (bugbear -> giant)  (0) 2020.01.01
    Level13 (darkknight -> bugbear)  (0) 2020.01.01
    Level11 (skeleton -> golem)  (0) 2020.01.01
    Level10 (vampire -> skeleton)  (0) 2020.01.01
    Level9 (troll -> vampire)  (0) 2020.01.01

    댓글

Designed by Tistory.