[리눅스 기초] Bandit Level 5 ~ Level 10
|
- 파이프(pipe)
- Shift + \(백슬래시)
- 명령어를 연계해서 사용할 수 있다.
- 앞 부분 명령어의 결과를 대상으로 뒷 부분 명령어를 이어서 수행한다.
<Bandit Level 5 → Level 6> https://overthewire.org/wargames/bandit/bandit6.html
다음 레벨의 비밀번호: inhere directory에 위치한, ① human-readable ② 1033 bytes in size ③ not executable한 속성들을 모두 가진 파일에 저장되어 있다.
inhere 디렉토리 안에 너무 많은 디렉토리들이 있다.
find
- 파일 및 디렉토리를 검색할 때 사용하는 명령어.
- 리눅스 파일 시스템의 구조가 복잡한 만큼, 다양한 옵션과 표현이 존재한다.
find 명령을 통해 사이즈가 1033바이트인 파일을 찾았더니 maybehere07 디렉토리의 .file2가 나왔다. c는 바이트를 뜻한다. file 명령을 통해 .file2의 타입을 알아본 결과 ASCII였다.
비밀번호는 DXjZPULLxYr17uwoI01bNLQbtFemEgo7
<Bandit Level 6 → Level 7> https://overthewire.org/wargames/bandit/bandit7.html
다음 레벨의 비밀번호: 서버 어딘가에, ① owned by user bandit7 ② owned by group bandit6 ③ 33 bytes in size한 속성들을 모두 가지고 저장되어 있다.
find /
- / : 서버의 최상위 경로
- 서버 전체에서 찾겠다는 뜻
find 명령을 통해, 서버 전체에서 세 가지 조건들을 만족하는 파일 및 디렉토리를 검색했다. 그러자 Permission denied인 파일 및 디렉토리와 함께, 너무 많은 결과가 떴다.
File Descriptor(FD)
- 프로세스가 특정 파일에 접근할 때 사용하는 추상적인 값
- 프로그램이 실행 중에 사용하는 파일, 파이프, 소켓, 외부 장치 같은 리소스들은 처음 사용될 때 운영체제에 의해 리소스 번호가 할당된다. 이 번호는 non-negative integer values로, 프로세스마다 가지고 있는 PCB의 file descriptor table에 등록되고 이후부터는 이 FD 번호를 이용해서 리소스를 사용한다.
- 그 중 0, 1, 2는 standard stream에 기본으로 설정되어 있다.
0 | 표준 입력 | standard input | stdin | 쉘에서 키보드로 입력하는 것 |
1 | 표준 출력 | standard output | stdout | 실행 결과를 모니터로 출력하는 것 |
2 | 표준 에러 | standard error | stderr | 에러를 출력하는 것 |
/dev/null
- 리눅스의 쓰레기통
Redirection
- 입출력의 방향을 지정하는 것
A > B | A의 결과를 B로 보낸다/저장한다. |
A >> B | A의 결과를 B의 기존 데이터에 추가한다. |
A < B | B의 데이터를 A에 입력한다/명령한다. |
2 > /dev/null
- 표준 오류 메시지(이 경우 permission denied)를 redirection을 통해 /dev/null에 버린다.
permission denied된 결과들을 /dev/null에 모두 버리니 하나의 결과가 출력됐다. cat 명령을 통해 이것을 읽었다.
비밀번호는 *
<Bandit Level 7 → Level 8> https://overthewire.org/wargames/bandit/bandit8.html
다음 레벨의 비밀번호: 단어 millionth의 다음에 있는 data.txt 파일에 저장되어 있다.
ls -al 명령을 통해 data.txt 파일이 있는 것을 확인하고, cat 명령을 통해 data.txt을 읽었더니, 스크롤이 잘릴 정도로 엄청나게 긴 텍스트들이 출력됐다. 차마 사진에 다 담지 못할 길이다.
grep [옵션] [패턴] [파일명]
- 지정한 문자열이나 정규표현식을 포함한 행을 출력하는 명령어
문자열 찾기
# 특정 파일에서 'error' 문자열 찾기
grep 'error' 파일명
# 여러 개의 파일에서 'error' 문자열 찾기
grep 'error' 파일명1 파일명2
# 현재 디렉토리내에 있는 모든 파일에서 'error' 문자열 찾기
grep 'error' *
# 특정 확장자를 가진 모든 파일에서 'error' 문자열 찾기
grep 'error' *.log
grep 명령어의 옵션
-c | 일치하는 행의 수를 출력한다. |
-i | 알파벳 대소문자를 구별하지 않는다. |
-v | 일치하지 않는 행만 출력한다. |
-n | 포함된 행의 번호를 함께 출력한다. |
-l | 포함된 파일의 이름을 출력한다. |
-w | 단어와 일치하는 행만 출력한다. |
-x | 라인과 일치하는 행만 출력한다. |
-r | 하위 디렉토리를 포함한 모든 파일에서 검색한다. |
비밀번호는 cvX2JJa4CFALtqS87jk27qwqGhBM9plV
<Bandit Level 8 → Level 9> https://overthewire.org/wargames/bandit/bandit9.html
다음 레벨의 비밀번호: data.txt 파일에 저장되어 있고, 단 한 번만 나타나는 줄의 텍스트이다.
sort [옵션] [-o 저장될 파일명] [정렬할 파일명] [-m 병합할 파일명]
- 텍스트로 된 파일을 행(가로) 단위로 정렬하는 명령어
- 기본적으로 알파벳 오름차순으로 정렬한다.
sort 명령어의 옵션
-r | 역순으로 정렬한다. |
-t구분자 | 필드 구분자를 지정한다. ex) sort -t. data.txt: "."을 기준으로 필드를 나눈다. |
-k숫자 | 해당 필드를 기준으로 정렬한다. ex) sort -k3 data.txt: 3번째 필드를 기준으로 정렬한다. |
-u | 정렬 후 중복된 내용을 제거한다. ex) bbaaaeeddccc → abcde |
-f | 알파벳 대소문자를 구분하지 않고 정렬한다. |
-b | 앞에 붙는 공백을 무시하고 정렬한다. |
uniq [옵션] [파일명]
- 중복된 내용의 행이 연속으로 있으면 하나만 남기고 삭제하는 명령어
- 연속으로 있지 않고 분산된 중복은 찾아내지 못한다. 따라서 sort 명령으로 정렬한 뒤 사용한다.
uniq 명령어의 옵션
-u | 연속으로 중복되지 않는 행들만 출력한다. |
-d | 연속으로 중복되는 행들만 한 번씩 출력한다. -u 옵션과 반대다. |
-c | 중복 발생 횟수를 출력한다.![]() |
-i | 알파벳 대소문자를 구별하지 않고 비교한다. |
-s숫자 | 한 행에서 지정된 숫자만큼의 문자를 비교 대상에서 제외한다. |
-f숫자 | 맨 앞에서 지정된 숫자만큼의 필드를 비교 대상에서 제외한다. |
-w숫자 | 비교 대상 문자 개수를 지정한다. |
sort 명령을통해 중복된 것끼리 정렬하고, uniq -u 명령을 통해 한 번만 출력되는 행을 출력했다.
비밀번호는 UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
<Bandit Level 9 → Level 10> https://overthewire.org/wargames/bandit/bandit10.html
다음 레벨의 비밀번호: data.txt 파일의 human-readable한 문자열 중 하나에 저장되어 있다. 여러 '=' 문자로 시작한다.
data.txt를 열어보면 이렇게 이상한 문자들이 뜬다. 어쩌다 보니 비밀번호를 발견해버렸지만 정석적인 방법을 알아보자.
*이러한 파일을 binary file(이진 파일)이라고 한다. 바이너리 파일을 텍스트 모드로 열면 위와 같이 깨진다.
strings [옵션] [파일명]
- 파일에서 문자열을 출력하는 명령어
- 바이너리 파일에서 사용하기 좋다.
grep 명령을 통해 문자열 "=="가 포함된 행을 출력한다.
비밀번호는 truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk