wargame/bandit

Bandit6 ~ Bandit11 문제 풀이

seungwon9201 2024. 6. 24. 18:26

Bandit6 → Bandit7

-문제-
다음 단계로 가는 패스워드는 아래조건에 해당하는 어딘가에 있다. 
파일의 유저가 bandit7, 그룹이 bandit6, 사이즈는 33 bytes

 

풀이방법 : user bandit7, group bandit6, 사이즈는 33byte인 파일을 찾자.

fine / -user bandit7 -group bandit6 -size 33c 명령어를 사용했더니  permission denied가 엄청 많이 뜬다...

Permission denied가 뭐지? 

Permission denied 메시지는 파일이나 디렉토리에 대한 접근 권한이 없는 경우에 발생하는 표준 에러 메시지이다.  

  • 표준 입력 (stdin): 파일 디스크립터 번호 0
  • 표준 출력 (stdout): 파일 디스크립터 번호 1
  • 표준 에러 (stderr): 파일 디스크립터 번호 2

해결방법으로 permission denied를 제거하자

어떻게 제거하지? 

표준 에러 메세지를 redirection(>, >>, <  등)으로 출력을 다른 곳으로 바꾸자!

 

redirection은 입출력값을 다른 곳으로 옮겨주거나 파일로 저장한다는 뜻이다.

 

 

즉, permission denied라는 표준에러 메시지(fd2번)를 redirection으로 내 화면에 안 뜨도록 할 계획이다.

2>/dev/null로 에러 메시지를 모두 없애자.

 

dev/null로 경로를 지정한 이유는 ?

리눅스와 유닉스 시스템에서 표준으로 출력을 버리는 데 사용되는 특수 파일이기 때문이다. (꼭 이 경로를 사용할 필요가 없음, 그러나 여기서 새로운 디렉토리를 만들어서 경로를 지정하려 했으나 권한이 없어서 생성 불가능 했음)

 

 

 

 

find / -user bandit7 -group bandit6 -size 33c 2>/dev/null을 입력해서 permission denied를 모두 없애면 딱 하나의 파일만 남게 된다. 

cat 명령어로 실행하면 완료!


Bandit7 → Bandit8

-문제-
다음 단계로 가는 패스워드는 data.txt 파일 안에 millionth 단어 옆에 있다.
풀이방법 : data.txt 파일 안에 millionth를 찾아보자.

 

ls 명령어로 안에 data.txt가 있는 걸 발견했고 vi 명령어로 data.txt 파일의 내부로 들어가 보자.

왼쪽에 단어와 오른쪽에 암호 같은 게 보인다. 

이제 millionth단어를 찾아야 한다.

vi editor에서는 / 로 내가 원하는 단어를 찾을 수 있다.

/millionth를 입력하면 옆에 비밀번호가 나온다.(n, N 명령어로 다음 단어를 찾을 수 있으나 여기선 하나뿐이었다.)


Bandit8 → Bandit9

-문제-
다음 단계로 가는 패스워드는 data.txt안에 오직 하나의 줄로만 나타나는 패스워드이다.
풀이방법 : 한 줄로만 나오는 패스워드를 찾아보자

cat data.txt로 파일 안의 내용을 확인해 보자... 엄청 지저분하게 나온다.

이 중에서 한 줄 빼고 나머지는 모두 중복으로 나오는 문자들이다.

 

일단 sort 명령어로 지저분한 내용을 깔끔하게 정리해 보자..

sort data.txt를 사용한 결과 위의 사진처럼 몇 개의 글들이 중복되는 것을 볼 수 있다. 

내가 찾고자 하는 패스워드는 중복이 없는 한 줄이니까 중복 횟수가 1인내용을 찾으면 된다.

어떻게 찾을까?

uniq 명령어를 사용하자.

uniq 명령어는 파일이나 표준 입력으로부터 연속적으로 중복된 라인들을 제거하고 고유한(unique) 줄들만 출력하는 기능이다.

 

uniq -c data.txt를 입력해 보자.

음.. 왜 이렇게 뜨는 거지? 

uniq -c는 입력 데이터가 연속된 중복을 기반으로 동작한다. 따라서 정렬되지 않은 데이터에서는 올바른 결과를 보장하지 않는다.

 

그럼 정렬해 주는 sort 명령어와 uniq -c를 같이 쓰면 내가 원하는 값이 나올 것이다!

 

그렇다면 파이프( | )를 사용해서 연결시켜 주자.

파이프는 한 명령어의 출력을 다른 명령어의 입력으로 전달하는 역할을 합니다. 

sort | uniq -c는 sort 명령어로 정렬한 출력값을 uniq -c의 입력값으로 들어가기 때문에 정렬된 내용을 uniq -c로 중복의 개수를 카운트해 줄 것이다.

즉,  cat data.txt | sort | uniq -c 명령어를 입력하면 된다.

 

이 처럼 혼자만 1인 줄이 패스워드이다.


Bandit9 → Bandit10

-문제-
다음 단계로 가는 패스워드는 data.txt파일 안에 저장되어 있고 몇 개의 human-readable 한 string타입으로 이루어져 있고 몇몇 개의 = 로 시작한다.
풀이방법 : 수많은 내용 중에서 string이고 패스워드 앞이 = 인 것을 찾자.

 

특정 문자로 시작하는 단어를 어떻게 찾을까? 

grep 명령어를 사용하자.

grep은 주어진 텍스트나 파일에서 패턴을 검색하는 명령어이다. 

grep [옵션] 패턴 [파일]

grep "=" data.txt 명령어로 =로 시작하는 내용을 찾으려고 했으나 위의 파일은 binary라서 grep를 사용할 수 없다.

grep은 텍스트 형식의 파일을 읽을 수 있기 때문에 위의 내용을 string으로 따로 빼 온다음에 사용해야 할 거 같다.

 

그러니 string을 찾기 위한 명령어 strings을 이용하자.

 

strings data.txt로 string만 출력한 상황이다. 이제 여기서 몇몇 개의 =로 시작하는 패스워드를 찾기만 하면 된다.

sting인 내용을 grep 명령어를 사용해서 찾을 거라서 파이프를 사용해야 한다.
strings data.txt | grep "="를 해보자.

저기 패스워드처럼 보이는 것이 있다. 문제에서 몇몇 개의 =로 이루어졌다 했으니 하나만 더 추가해 보자.

 

이렇게 패스워드를 찾았다.

 

그래서 cat 명령어로 비밀번호를 출력하자.


Bandit10 → Bandit11

-문제-
다음 단계로 가는 패스워드는 data.txt로 저장돼 있고 base64로 인코딩 되어있다.
풀이방법 : 인코딩 된 data.txt를 디코딩해서 출력하자.

 

cat 명령어로 data.txt 파일을 출력해 보자

패스워드로 입력해 보니 역시나 틀린 패스워드였다.

문제에서 base64로 인코딩 되어있다고 하니 인코딩 된 파일을 디코딩으로 풀어버리자!

 

base64 --decode data.txt 명령어를 사용해서 인코딩 된 data.txt파일을 디코딩할 수 있다.

이 문제는 알기만 한다면 이처럼 패스워드를 쉽게 찾을 수 있다.