SFP overflow 공격은 SFP에 한바이트 만큼 overflow를 일으키는 공격 기법이다.

 

SFP overflow를 설명하기전에 stack frame pointer overflow에 대해서 먼저 알고 넘어가자

 

SFP에서 S는 Stack을 의미하며 스택이란 함수의 return address, 지역 변수 등이 저장 및 사용되는 곳이다.

스택은 FILO(First In Last Out) 후입선출구조로 마지막에 들어간게 제일 먼저 꺼내지는 특징을 지닌다.

스택은 높은주소에서 낮은 주소로 자란다.

들어올때는 1/2/3

나갈때는 3/2/1

 

F는 Frame을 뜻하며 SF스택 프레임이란 ESP가 아닌 EBP를 이용해서 스택 내 변수들이나 복귀 주소 파라미터에 접근하는 방식을 의미한다.

 

스택 프레임은 함수의 영역을 표시하는데 이때 함수 프롤로그와 에필로그라는 것을 수행한다.

프롤로그는 push ebp와 mov ebp, esp 구성되어져 있다.

함수가 호출되면 그 영역을 설정하기 위한 것으로 ebp를 push하는 행위는 이전 함수의 ebp주소를 스택에 저장시키는 행위이다.

mov ebp, esp는 esp를 ebp로 복사함으로써 불리어진 함수의 ebp를 새로 설정해주는 것이다.

ebp를 기점으로 함수의 ret주소나 argc, argv, 변수등을 쉽게 알수 있다.

 

SFPO에서는 에필로그를 중점으로 다룬다.

에필로그는 leave-ret 두함수로 구성되어져 있으며 두 함수도 각각 2가지로 구성되어져있다.

 

leave는 mov esp, ebp와 pop ebp로 이루어져 있다.

mov esp, ebp esp가 ebp가 가리키는 주소로 이동하고 이는 sfp에 위치한다.

pop ebp를 이용하여 이전 함수의 ebp로 되돌려 놓는다.

 

ret는 pop eip, jmp eip로 이루어져 있다.

pop eip가 일어나면 eip가 주소를 받아 jmp eip를 통해 그 주소로 이동한다.

 

본격적으로 SFPO에 관하여 설명하도록 하겠다.(이하 FPO)

FPO는 SFP의 하위 1바이트를 변조하였을 때 일어난다.

FPO를 하기 위해서는 2가지 전제조건이 갖추어 져야 한다.

 

1. main() 외에 서브함수가 하나이상 있어야 한다.

2. 서브함수에서 SFP의 하위 1바이트가 오버플로우로 접근 가능해야한다.

 

스택에서 에필로그가 실행 되었을때의 모습이다.

leave 함수 mov esp, ebp가 실행되면

 

 

ebp esp는 같아지고 pop ebp가 수행된다.

SFP값은 사전에 값을 변조해두어 EBP가 내가 원하는 곳을 향하게 된다.(값을 변조하는데 사용된것이 SFP overflow다)

 

 

 다음으로 ret 명령이 실행되며 pop eip가 실행된다.

esp가 가리키던곳을 eip가 가리키게 되고 esp는 또 이동한다! 

jmp eip가 실행되면 어떻게 되겠는가?

서브함수를 종료하고 main함수로 넘어온다.

main함수에 도착했는데 main의 에필로그가 실행될 차례이다.(여기서 감이 온다면 당신은 이해한것이다)

leave 명령어 mov esp, ebp

pop ebp

ret명령어 pop eip

jmp eip

이렇게 내가 원하는 곳으로 이동하게 된다.

'Basic Concepts > System' 카테고리의 다른 글

RTL(Return to libc) & chaining  (0) 2020.04.23
Fake EBP  (0) 2020.04.22
BOF(Buffer Over Flow)  (0) 2020.04.22
RET Sled  (0) 2020.04.22
NOP Sled  (0) 2020.04.10

+ Recent posts