뉴비에욤

Frame Pointer Overflow ( 프레임 포인터 오버플로우, FPO ) 본문

Buffer OverFlow

Frame Pointer Overflow ( 프레임 포인터 오버플로우, FPO )

초보에욤 2016. 1. 28. 00:40

지난 번에 FakeEBP에 대한 글을 작성하였는데 비슷한 원리를 가지는 공격 기법으로 FPO가 있다. 사용 환경에는 다음과 같은 조건이 따른다.

1. SFP 영역에서 1 바이트 오버플로우가 반드시 일어나야 함

2. 메인 함수 이외 서브 함수가 필요함

 

이번에도 스택 구조를 대충 그려보면서 설명할 것이다.

 

일단 바이너리에서 버퍼를 40만큼 선언했다면 공격자의 페이로드는 총 41 바이트가 된다. FakeEBP와 달리 FPO는 리턴 주소는 변조하지 않고 SFP 역시 1바이트만 오버플로우 시키기 때문이다. 어쨋든 페이로드를 올리고 서브 함수의 에필로그 직전까지를 보면 우측과 같은 구조를 가지게 된다.

 

 

 

서브 함수의 에필로그 중 leave 명령어의 "mov esp,ebp"가 실행되면 좌측 구조처럼 esp/ebp 모두 SFP 영역을 가리키게 된다. 이하 하위 1바이트는 변조된 바이트이다. 그리고 "pop ebp"가 실행되면 esp 레지스터는 RET를 가리키고 ebp 레지스터는 &(&shellcode)-4 를 가리키게 된다. 다시 말하면 쉘코드의 시작 주소를 가리키는 주소의 - 4 값이다.

 

 

그리고 ret가 실행되면서 메인 함수에서 서브 함수를 호출한 다음 명령어(CALL 명령어 다음) 주소로 이동된다. 

 

 

일련의 작업 후에 메인 함수의 에필로그까지 오고 "mov esp,ebp" 명령어가 실행되면 esp,ebp 레지스터는 동일한 주소를 가리키게 된다. 그리고 "pop ebp" 명령어가 실행되면서 esp 레지스터는 쉘코드의 시작 주소를 가리키게 된다. ( 더 이상 ebp는 신경 쓰지 않아도 됨 )

 

 

그리고 "ret - pop eip"가 실행되면 기존에 esp가 쉘코드 주소를 가리키고 잇었기 때문에 eip가 쉘코드의 주소를 가리키고 jmp eip에 쉘코드가 실행된다.

Comments