본문 바로가기
Security/Pwnable

Fake EBP

by J0DEV 2021. 8. 10.
반응형

Fake EBP

 

EBP를 속이는 기법 입니다.

 

ret 영역을 침범하여 입력값을 덮을 수 있을 때 사용합니다.

 

(이 기법은 주로 ret까지만 덮어쓸 수 있고 특정 영역에 필터링 될 때 유용한 기법이다.)

 

이 공격의 핵심은 leave-ret 입니다.

 

sfp를 조작하고, 처음 호출하는 ret 주소에 leave-ret 가젯을 실행시킴으로써 원하는 코드를 실행시킬 수 있습니다.

 

즉 sfp에 buf-4의 주소를 넣어주어 ebp가 buf-4로 가게하여 buf에 저장된 쉘코드가 온전하게 실행될 수 있도록 해줍니다.

leave
mov esp, ebp
pop ebp

ret
pop eip
jmp eip

 

ret에다가 leave-ret가젯을 넣음으로서

 

총 2번 leave-ret 이 일어납니다.

 

 

먼저 처음 leave가 수행되면서 esp에 ebp가 들어갑니다. 그리고 pop ebp때문에 ebp가 스택에서 pop 되어 buf-4로 갈 것입니다.

 

방금한 pop ebp과정에서 pop 명령어 때문에 +4가 되므로 buf-4의 주소를 sfp에 넣어줍니다.

 

그 뒤에 ret이 실행되는데 ret에서는 다시 leave-ret 가젯을 넣음으로써 2번째 leave 가 수행됩니다.

 

2번째 leave를 수행하면서 아까와 같이 esp에 ebp가 들어갑니다.

 

 

근데 현재 ebp의 위치는 맨아래에(스택 꼭대기 여기서는 지정해준 주소 buf-4) 위치합니다.

 

그러므로 pop ebp로 ebp가 사라져버리고 pop 명령어를 수행하기 때문에 +4가 됩니다.

 

그렇다면 esp는 쉘코드를 가르키게 되고 ret 이 수행되면서 쉘코드가 수행된다.

 

Fake EBP를 가지고 실제 워게임을 풀어보겠습니다.

 

소스를 봅니다.

 

여기서 rtl과 Fake EBP를 사용해서 이 문제를 풀 수 있을 것 같습니다.

 

 

 

우선 버퍼는 40바이트만 확장됬군요

 

leave의 주소는 0x080484df 입니다.

 

우선 system함수의 주소를 알아내고

 

스택의 위치를 알아내기 위해

 

main과 leave에 각각 브레이크를 걸어주겠습니다.

 

 

그리고 A를 44번 넣어주고 실행 시킨후 버퍼의 주소를 찾으면

 

 

버퍼는 0xbffffa60부터 시작하는군요

 

버퍼의 -4주소를 넣어주어야 하므로 0xbffffa5c의 주소를 넣어줄겁니다. 

 

페이로드를 짜보면

system함수(4byte) + NOP(4byte) + /bin/sh(4byte) + NOP(28byte) + buffer-4(4byte)+leave주소(byte)

입니다.

 

/bin/sh의 주소는

 

0x400fbff9이네요.

 

./zombie_assassin `python -c 'print "\xe0\x8a\x05\x40"+"\x90"*4+"\xf9\xbf\x0f\x40"+"\x90"*28+"\x5c\xfa\xff\xbf"+"\xdf\x84\x04\x08"'`
반응형

'Security > Pwnable' 카테고리의 다른 글

pwnable.kr [Toddler's Bottle]->[collision]  (0) 2021.08.11
pwnable.kr [Toddler's Bottle]->[fd]  (0) 2021.08.11
Frame Pointer Overwriting  (0) 2021.08.10
RTL이란? (Return to Library)  (0) 2021.08.10
LOB Level20 xavius  (0) 2021.08.10