fgets , atoi , fread 함수
(1) fgets
※ 역할
스트림에서 문자열을 받는역할을 하는 함수이며, 문자열을 받아 (num - 1) 개의 문자를 입력 받을 떄 까지나,
개행 문자(\n) 또는 파일 끝에 도달할 때 까지 입력받아서 C형식의 문자열로 저장한다.
※ 특징
- 파일 끝이나 개행 문자까지 읽음.
- 라인 끝(CR/LF)을 읽으면 개행 문자 '\n'으로 변환
- string 끝에 NULL 문자를 추가함
※ 함수의 구조 및 설명
char
*
fgets
(
char
*string,
int
n,
FILE
*stream );
- string : 파일 데이터를 읽어서 저장할 버퍼의 포인터를 의미
- n : 읽을 최대 문자의 수 +1, 읽은 문자열의 끝에 NULL 추가
- stream : 개방된 FILE 구조체의 포인터
- return 값 : 읽은 string의 포인터, 더 읽을 파일이 없거나 에러 출력시 NULL 포인터
(2) atoi
※ 역할
- 문자열을 long 형 정수로 변환시켜주는 함수
※ 특징
- "+","-", 숫자가 아니면 변환이 이루어지지 않음
- 문자열이 공백 문자로만 이루어져 있어도 변환이 이루어지지 않음
※ 함수의 구조 및 설명
int atoi (const char* str);
- 파라미터 : 문자열
- return 값 : long 형 정수로 변환된 값 ("1000" 이라는 문자열을 파라미터로 전달하면 1000 의 long형 정수가 반환됨)
(3) fread
※ 역할
스트림에서 데이터 블록을 읽어옴
※ 특징
- 스트림에서 count 개의 원소를 가지는 배열을 읽음, 원소의 크기는 size 바이트이며 ptr이 가리키는 배열에 넣게됨
- 스트림의 위치 표시자는 읽어들인 바이트 수 만큼 증가
※ 함수의 구조 및 설명
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
- ptr : size * count 의 크기를 가지는 배열을 가리키는 포인터
- size : 읽어들일 원소의 크기로 단위는 바이트
- count : 읽어들일 원소들의 개수로 각 원소의 크기는 size 바이트
- stream 데이터를 입력받을 스트림의 FILE 객체를 가리키는 포인터
- return 값 : 지정한 원소의 개수 만큼 읽어 들였다면 읽어들인 원소의 개수가 size_t 형으로 반환됨
Nebule level01 풀이
Nebule level01 풀이
#Nebula level01 계정
ID : level01
PW : level01
Nabula level01 문제에 접속하면 나오는 메인화면이다.
소스를 간단히 해석하면 해당 프로그램의 gid,uid를 가져와 system 함수를 실행시키는 소스이다.
system("/usr/bin/env echo and now what?");
소스 중 해당 부분은 system 함수를 이용해 env 환경 변수를 참조한뒤 echo 명령어로 "and now what?" 이라는 문구를 출력시킨다.
실제로 /home/flag01 디렉터리에 존재하는 flag01 파일을 실행시켜보면 "and now what?" 이라는 문구가 출력된다.
해당 문제는 $PATH weaknesses 취약점을 이용하는 문제인 것 같다.
echo 명령어를 예로 $PATH weaknesses 취약점을 설명해보도록 하겠다.
사용자가 echo 명령을 사용하면 쉘은 echo 명령을 실행시키려 위 사진의 환경변수 $PATH 에 존재하는 경로를 왼쪽에서 부터 차례대로 확인한다. 그리고 echo 명령이 존재하는 경로를 찾으면 그 곳에 존재하는 echo 명령을 수행해 결과를 우리에게 출력시켜 준다.
이러한 특징을 이용해 우리는 PATH 환경변수의 가장 앞에 현재 계정인 level01 권한으로 파일생성이 가능한 디렉터리를 임의로 추가한뒤 해당 경로에 echo 라는 이름의 파일을 생성하고 파일에 getflag 또는 /bin/bash를 실행시키는 코드를 저장하게 되면 쉘은 맨 앞에 우리가 임의로 추가한 경로에 저장된 echo 명령을 수행할 것이고 그렇게 되면 flag01계정의 권한으로 getflag 명령 또는 /bin/bash가 실행되어 문제가 해결될 것이다.
먼저 현재 계정인 level01 권한으로 파일생성이 가능한 디렉터리를 찾아보자.
/tmp 디렉토리는 sticky 비트가 설정되어 있으며 소유자, 그륩, 그외 사용자 모두가 읽기, 쓰기 , 실행이 가능하다.
해당 디렉토리에 echo 파일을 생성하고 getflag 명령어를 수행하는 코드의 추가와 함께 실행권한을 주자
echo 파일에 getflag를 실행시키는 코드와 함께 실행권한이 추가됬다.
이제 /tmp 디렉토리 경로를 PATH 환경변수의 가장 앞에 넣어보자.
export 는 환경변수를 추가할때 사용하는 명령어다. 해당 명령어를 이용해 PATH 환경변수의 제일 앞에 /tmp 디렉터리를 추가했다.
모든 준비를 끝마쳤으니 /home/flag01 디렉토리의 flag01 파일을 다시 실행시켜보자
성공적으로 문제를 공략했다 :D
#Nebula level01 Clear!
'System Hacking > Nebula' 카테고리의 다른 글
Nebula level00 풀이 (0) | 2017.08.03 |
---|
Nebula level00 풀이
Nebula level00 풀이
[Nebula 링크]
https://exploit-exercises.com/nebula/
Nebula는 별도의 iso 파일을 제공하며 해당 iso 파일안에 문제파일 확인 및 flag흭득이 가능하다. 그리고 문제에 대한 지문은 위 링크의 우측 Levels 카테고리를 확인하면 된다. iso 파일 역시 위 링크의 Download 카테고리에 접속하면 다운로드가 가능하다.
#Level00 계정
ID : level00
PW : level00
Nebula level00 문제에 접속하면 출력되는 메인화면이다.
이 level 에서는 flag00 이라는 계정의 권한으로 Setuid가 걸린 파일을 최상위 디렉토리 " / " 로 부터 찾는것이 문제이다.
find 명령어와 여러 옵션을 사용하여 flag00 소유의 setuid가 걸려있는 파일을 찾았다.
-user 옵션은 찾으려는 파일의 소유주를 기준으로 찾을 수 있게끔 해주며 -perm 옵션은 퍼미션을 입력받아 해당 퍼미션에 대한 파일을 찾는다.
find 명령의 결과로 출력된 디렉토리로 이동하면 flag00 계정이 소유주이며 해당 계정의 권한으로 Setuid가 걸린 flag00 파일을 확인 할 수 있다.
해당파일을 실행하게 되면 축하의 메시지와 함께 "getflag" 명령을 실행하라는 주문을 받게 된다.
주문대로 "getflag" 명령을 입력하게 되면 문제가 해결된다.
#Nebula level00 Clear!
'System Hacking > Nebula' 카테고리의 다른 글
Nebule level01 풀이 (0) | 2017.08.04 |
---|