Information Security
[FTZ] Level 9 본문
Level 9
#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");
}
}
해석해보자
buf2라는 배열 10칸
buf라는 배열 10칸
fgets를 입력받은 값을 buf에 저장해주는데 40이하여야 한다
setreuid(ruid, euid)
ruid: Real User ID의 약자로 실제 본이느이 프로세스 id를 의미한다
euid: Effective User ID의 약자로 SetUID 모드의 프로세스가 실쟁 중일 때 부여되는 파일 소유자의 id를 의미한다
=> Set Real and Effective user ID의 약어로 Real user ID와 Effective user ID를 설정하는 역할
SetUID가 설정된 파일에서 setreuid(geteuid(),geteuid())를 사용하면 ruid가 euid로 변경 후
bash 등 명령을 실행하면 ruid(현재 euid로 변경된) 실행
함수의 원형 -> int setreuid(uid_t* ruid*, uid_t*euid*);
출처: https://blog.naver.com/emmaeunji/222082272535
setreuid의 개념
setuid는 질리도록 들었는데, setreuid는 정말 개념 설명 해준 곳이 없더라. 그래서 개인적으로 괜찮은 설...
blog.naver.com
strncmp : 문자열이 같은지
buf2와 "go"가 앞 2개가 같으면
Good Skill!을 출력하고
권한 얻고
/bin/bash 실행
overflow를 이용하여 풀어야 하는 문제이다
buf 10개 buf2 10개 에 문자를 줄 수 있는데 fgets를 이용해 40개의 문자를 받을 수 있다
내가 0123456789를 받으면 buf는 꽉 차게 된다
buf2의 앞 부분 2개가 go여야 하기 때문에
만약 0123456789go를 받게 되면?
buf 0123456789
buf2 go
이렇게 값이 들어가게 될 것이다
/usr/bin/bof를 실행시켜서 0123456789go 를 입력해 넣어보자
아무런 반응이 없다
buf와 buf2 사이에 거리가 있다는 뜻이다
buf
l
l
l
buf2
0123456789와 go 사이에 다른 문자들을 하나씩 늘려가면서 실행해보자
012345 6자리를 더 넣어주니 Good Skill!이 나오면서 실행되었다
buf와 buf2의 사이 거리는 6이었나 보다
level10이 권한을 얻었으니 my-pass를 이용해 비밀번호를 알아내자
level 10 비밀번호 획득 성공!
'INTERLUDE > System Hacking' 카테고리의 다른 글
[FTZ] Level 11 (0) | 2021.11.18 |
---|---|
[FTZ] Level 10 (0) | 2021.11.11 |
[FTZ] Level 8 (0) | 2021.11.04 |
[FTZ] Level 5 -7 (0) | 2021.11.02 |
[FTZ] Level 4 - 5 (0) | 2021.10.28 |