ftz level9를 풀어보겠습니다.
/usr/bin/bof 의 소스가 나오면서 이를 이용하여 level10의 권한을 얻으라고 합니다.
간단한 소스 분석부터 하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(){
char buf2[10]; //char 형으로 buf2 배열 선연 10바이트
char buf[10]; //char 형으로 buf 배열 선연 10바이트
printf("It can be overflow : "); //해당 문장 출력
fgets(buf,40,stdin); //입력받은값을 buf에 저장하는데 크기는 40바이트 이하여야 합니다.
if ( strncmp(buf2, "go", 2) == 0 ) //buf2의 앞 2바이트와 "go" 를 비교했을때 같으면
{
printf("Good Skill!\n"); //해당 문장 출력
setreuid( 3010, 3010 ); //해당 UID의 권한을 부여합니다.
system("/bin/bash"); //"/bin/bash" 명령을 실행합니다.
}
}
해당 C언어 소스를 보면, 결과적으로 buf2의 앞 2바이트에 go 라는 문자가 있어야 문제를 해결할 수 있음을 알 수 있습니다.
buf2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
buf |
|
| |
| |
| |
| |
| |
| |
| |
| |
|
그 다음, 값을 입력 받아 buf에 값을 저장하게 되는데 만약 0123456789 를 입력했을 경우, 아래와 같이 buf 공간에
데이터가 입력됩니다.
buf2 |
|
| |
| |
| |
| |
| |
| |
| |
| |
|
buf | 9 |
8 | |
7 | |
6 | |
5 | |
4 | |
3 | |
2 | |
1 | |
0 |
buf2 |
|
| |
| |
| |
| |
| |
| |
| |
o | |
g |
buf | 9 |
8 | |
7 | |
6 | |
5 | |
4 | |
3 | |
2 | |
1 | |
0 |
buf2 |
|
| |
| |
| |
| |
| |
| |
| |
o | |
g |
불필요 |
? |
buf | 9 |
8 | |
7 | |
6 | |
5 | |
4 | |
3 | |
2 | |
1 | |
0 |
권한을 얻었으면 my-pass를 입력하여 다음으로 가는 패스워드를 획득하면 되겠습니다.
ftz level9를 풀어보았습니다.
'Hack > ftz' 카테고리의 다른 글
ftz 풀이 level11 (0) | 2016.12.28 |
---|---|
ftz 풀이 level10 (0) | 2016.12.12 |
ftz 풀이 level8 (0) | 2016.12.01 |
ftz 풀이 level7 (0) | 2016.11.29 |
ftz 풀이 level6 (0) | 2016.11.28 |
댓글