뉴비에욤

Fake EBP 본문

Buffer OverFlow

Fake EBP

초보에욤 2016. 1. 27. 03:40

BoF 공격을 할 때 사용되는 다양한 방법 중 하나인 Fake EBP (가짜 EBP)에 대하여 설명하고자 한다. 원래는 글로 쓸려고 했는데 내가 봐도 이해가 잘 안 가는 듯하여 PPT로 대충 스택 구조를 그려보았다.

 

새로운 공격 기법을 사용한다는건 특정한 환경과 이유가 존재하는데, 이 기법은 "RET 이후로 덮어 쓰기 불가능", "RET 자리에 스택/라이브러리 주소 필터링"이 되어 있을 때 사용할 수 있다. (사실 이런거 다 필요없고 ROP가 진리) 어쨌든 이런 경우에는 RET에서 원하는 위치로 실행되게 eip를 추출해야 하는데 이게 굉장히 어렵다. 따라서 ebp(sfp)의 위치를 옮겨 우리가 원하는 위치에서 원하는 RET 주소를 추출하는 것이 바로 Fake EBP 기법이다.

 

쉽게 말하면 함수의 에필로그...

leave / ret

가 핵심이다.

 

각각의 명령어들은 다음과 같이 2가지 명령어, 총 4가지 명령어로 구성된다.

leave

  mov esp,ebp

  pop ebp

 

ret

  pop eip

  jmp eip

 

즉 에필로그를 이용해서 esp 레지스터를 조작하여 원하는 eip 값을 추출하는 것이다. 지금부터 이해를 돕기 위해 그림과 함께 설명할 것이다.

 

 

 

스택 구조를 간단하게 나타낸 것이다. 우선 좌측은 그냥 평범한 스택 상태이다. 이 상태에서 오버플로우를 발생시키면 스택은 우측과 같이 변경된다. 쉘코드는 꼭 저곳에 올려야 하는 것이 아니라 그림 그리기 편할려고 저곳에 올린 것이다. 다만 중요한 점은 SFP는 항상 (쉘코드가 있는 주소 - 4) 위치를 가리켜야 하는 것과 RET 영역에 leave-ret gadget를 올리는 것이다.

 

 

 

오버플로우가 발생하고 함수 자체의 에필로그 중 leave 부터 살펴보면 위 그림과 같다.

우선 leave의 첫 번째 명령어인 "mov esp,ebp"가 실행되면 기존에 buf 어딘가(NOP 어딘가)를 가리키던 esp 레지스터가 ebp 레지스터와 동일하게 SFP를 가리키게 된다. 물론 SFP는 현재 공격자에 의해 변조되어 (쉘코드가 있는 주소 - 4의 위치) 값을 가지게 된다.

그 다음 두 번째 명령어인 "pop ebp"가 실행되면서 esp 레지스터가 가리키던 (쉘코드가 있는 주소 - 4의 위치) 주소로 이동되고, esp 레지스터는 한칸 올라가서 또 함수 에필로그 (leave-ret)를 가리키게 된다.

 

함수 에필로그 leave가 수행되었으니 이제 ret이 실행되는데, 우선 "pop eip" 명령에 의해 eip 레지스터는 또 leave-ret 주소를 가지게 되며 jmp eip에 의해 또 다른 leave-ret이 수행된다.

 

 

 

그럼 이제 두 번째 에필로그에서 leave - mov esp,ebp가 실행되는데 이 때 esp/ebp 레지스터는 모두 (shellcode-4)의 주소를 가리키게 된다. 그리고 pop ebp명령어에 의해 esp 레지스터는 한칸 올라가서 쉘코드를 가리키고 ebp는 쓰레기 값을 가리키게 된다.

* fake ebp 기법은 (shellcode-4)의 주소가 필요한것이지, 저 주소 안에 있는 값이 필요한 것이 아니다.

 

 

그리고 두 번째 에필로그의 ret - pop eip 명령어가 실행되면 esp 레지스터가 쉘코드 주소를 가리키기 때문에 eip 레지스터 역시 쉘코드를 가리키게 되고 esp 레지스터는 한칸 올라가게 된다. 그리고 jmp eip에 의해 쉘코드가 실행된다.

Comments