ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FPO (Frame Pointer Overflow)
    System hacking training/Knowledge 2018. 4. 26. 00:57

    안녕하세요.


    FPO (Frame Pointer Overflow) 에 대해 포스팅을 시작하겠습니다.


    먼저 FPO 란?


    SFP의 1byte를 overflow (overwrite) 하여 실행코드가 있는 원하는 주소로 eip 를 변조하는 기법입니다.


    이를 학습하기 위해서는 함수 에필로그 과정을 이해하고 있어야하는데요.


    LOB golem의 문제를 예로들겠습니다.



    이 바이너리에는 main()와 problem_child 라는 서브 함수가 있습니다.
    problem_child 함수에는 buffer[40]으로 버퍼가 40byte 할당됩니다.

    또 이 바이너리는 buffer가 40byte 할당되었지만 SFP가 1byte 오버플로우가 일어납니다.


    본격적으로 에필로그에 대해서 알아봅시다.


    함수 에필로그에는 leave 와 ret instruction이 있는데

    leave 명령에는 세부적으로 mov esp , ebp 와 pop ebp를 수행합니다.



    위 그림은 leave 명령 중 mov esp , ebp 를 실행 했을 때 스택의 모습입니다.


    mov esp, ebp 를 함으로서 ebp 와 esp 가 가리키는 주소가 같아지고 그 위치는 서브함수의 SFP가 됩니다.




    그 후 pop ebp 가 실행되면서 esp는 +4하여 ret를 ebp는 이전 함수의 SFP를 가리키게 됩니다.


    다음으로 ret도 내부적으로 두가지 instruction을 수행하는데

    바로 pop eip 와 jmp eip 를 합니다.



    이와 같이 pop eip를 하여 esp의 값을 eip에 넣어줍니다.



    그 후 jmp eip를 하여 ret의 주소로 jmp하게 됩니다.




    이제 FPO 즉 SFP의 하위 1byte를 변조하였을때 어떤식으로 공격이 전개되는지 알아봅시다.


    먼저 FPO를 하기 위해서는 해당 조건이 만족해야합니다.


    1. main() 외에 서브 함수가 1개 이상 존재해야한다.

    2. 서브함수에서 SFP 의 하위 1byte가 오버플로우가 가능해야 한다.


    main()에서 되지 않는 이유에 대해서는 뒤에 가서 알아보기로 하고 FPO의 원리에 대해 먼저 알아봅시다.


    일련의 과정을 거쳐서 call 명령으로 problem_child() 함수가 호출되었고 이 함수의 에필로그가 실행되었다고 가정하여 봅시다.


    가정 했을 때의 스택의 모습은 이러합니다.



    현재 이 스택은 서브 함수 (problem_child)의 SFP가 변조되었습니다.

    여기서 mov esp, ebp 를 하여 esp는 ebp 와 같아지고




    pop ebp 하였을때 서브함수의 SFP의 주소로 ebp가 이동하게 되는데

    여기서 SFP의 하위 1byte를 shellcode - 4의 위치로 변조하여 shellcode - 4의 위치로 가게됩니다.



    다음으로 서브함수의 ret 명령으로 pop eip하여 현재 esp가 가리키는 값을 eip에 넣고 jmp 하여 해당 주소로 점프하게됩니다.


    이제 main()로 넘어와서 일련의 과정을 거쳐 main()의 에필로그에 다달았을때



    이렇게 mov esp , ebp하여 돌아다니던 esp를 ebp의 위치로 보내고 그 위치는 현재 ebp가 위치한 shellcode - 4의 위치로 보내집니다.


     

    그리고 pop ebp를 하게되면서 ebp 는 어디론가 보내지겠죠?

    여기서 중요한것은 pop ebp 하게 되면서 esp가 shellcode가 위치한 주소를 가리키게된다는것입니다.

    (만약 우리가 입력하여 데이터를 넣을 수 있는 buffer에 쉘코드의 주소를 넣게된다면..?)


    그리고 ret가 실행된다면



    바로 이렇게 현재 esp 의 주소가 eip에 들어가게 되고 우리가 원하는 쉘코드의 위치로 jmp 하게 되어 쉘코드를 실행시키게 되는 것이죠.


    이상 FPO (Frame Pointer Overflow)에 대한 포스팅을 마칩니다.

    반응형

    'System hacking training > Knowledge' 카테고리의 다른 글

    What is heap - part 2  (0) 2018.12.21
    What is heap - part1  (2) 2018.12.12
    x64 BOF(Buffer Overflow)  (0) 2018.04.18
    [x86 vs x64] Memory Address  (2) 2018.03.19
    ELF Memory Protection - RELRO  (2) 2018.03.07
Designed by Tistory.