-->

FEBP(Fake EBP) 공격이란?

반응형

LOB 풀이를 옮기다가 FEBP를 사용하는 문제가 나와서 여기에 정리한다. EBP를 조작해 원하는 코드가 실행되게끔 하면 되기 때문에 한가지 방식이 정해져있지는 않은 것 같다.

 

/* 틀린 부분 지적 및 댓글 환영합니다 */

 

 

FEBP 공격 페이로드

FEBP 공격을 위해 buffer에 &(shellcode)를, SFP에 &(buffer)-4를, RET에 &(leave-ret 가젯)을 넣어보고, 어떻게 쉘코드가 실행될 수 있는지 순서대로 확인해보자.

 

buffer (44)
&(shellcode)
SFP  <--ebp
&(buffer)-4
RET
&(leave-ret gadget)

 

 

leave 실행 후

위 상황에서 levae 명령어가 실행되면 <mov esp, ebp; pop ebp> 이기 때문에 먼저 mov esp, ebp로 인해 ebp값(&(buffer)-4)이 esp에 저장된다. 즉, esp와 ebp가 가리키는 곳이 같아지게 된다.

 

(mov esp, ebp)

buffer (44)
&(shellcode)
SFP 
&(buffer)-4 <--ebp,esp
RET
&(leave-ret gadget)

 

 

 

그리고나서 pop ebp로 인해 esp에 저장되어있는 값(&(buffer)-4)이 ebp에 저장되고 esp는 +4가 된다. 즉, ebp는 esp에 저장되어있는 값을 가리키게 되기 때문에 아래와 같이 쉘코드가 저장되어있는 주소의 -4 위치를 가리킨다.

 

(pop ebp)

&(buffer)-4 | XXXXXXXX <--ebp
buffer (44)
&(shellcode)
SFP
&(buffer)-4
RET
&(leave-ret gadget)  <--esp

 

 

ret 실행 후

여기서 ret이 실행되면 esp가 가리키고 있는 값을 eip에 넣고 점프하기 때문에 leave-ret 가젯이 있는 곳으로 점프하게 된다.

 

&(leave-ret gadget) | leave <--eip
...
&(buffer)-4 | XXXXXXXX <--ebp
buffer (44)
&(shellcode)
SFP
&(buffer)-4
RET
&(leave-ret gadget)
RET+4 <--esp

 

 

leave-ret 가젯의 leave 실행 후

다시 가젯으로 인해 leave가 실행되면, esp가 ebp쪽으로 움직인 후,

 

(mov esp, ebp)

&(buffer)-4 | XXXXXXXX  <--ebp,esp
buffer (44)
&(shellcode) 
SFP
&(buffer)-4
RET
&(leave-ret gadget)
RET+4
...
XXXXXXXX | YYYYYYYY <---ebp

 

 

 

ebp가 esp가 가리키는 곳의 값이 되고 esp+=4가 되므로 아래와 같은 상황이 된다. 참고로 여기서 XXXXXXXX의 위치는 임의로 잡은 것이다.

 

(pop ebp)

&(buffer)-4 | XXXXXXXX
buffer (44)
&(shellcode)  <--esp

SFP
&(buffer)-4
RET
&(leave-ret gadget)
RET+4
...
XXXXXXXX | YYYYYYYY <---ebp

 

 

leave-ret 가젯의 ret 실행 후 

이제 마지막 단계이다. ret명령 실행으로 인해 esp에 저장되어있는 값인 &(shellcode)로 점프하게 되고 따라서 쉘코드가 실행된다.

 

&(buffer)-4 | XXXXXXXX
buffer (44)
&(shellcode)
SFP
&(buffer)-4
RET
&(leave-ret gadget)
RET+4
...
&(shellcode) | shellcode <--eip !!!!!
...
XXXXXXXX | YYYYYYYY

 

댓글

Designed by JB FACTORY