The password for the next level is stored in the file data.txt in one of the few human-readable strings, preceded by several ‘=’ characters.
Level goal에 제시된 것과 같이, =
기호를 포함하는 라인을 찾아야 한다. 이전 level에서 다루었던 grep
명령어와, |
를 이용하여 출력해보았다.
bandit9@bandit:~$ cat data.txt | grep "="
grep: (standard input): binary file matches
출력된 내용을 보면, binary file
이기 때문에 grep
명령어를 사용할 수 없다고 한다.
이러한 상황에서 grep
명령어를 원활하게 사용하려면, binary file을 text file처럼 처리하는 -a
option을 사용해야 한다. 물론, 해당 option을 사용해도 여전히 파일 형태를 육안으로 확인하기 어려움으로 다른 방법을 사용해야 한다.
file에 포함된 문자열을 출력하는 strings
명령을 활용하면, 파일 안에 포함된 문자열을 뽑아낼 수 있다. 이렇게 뽑아낸 문자열을 |
을 통해 grep
에게 넘겨준다면, human-readable 텍스트를 출력해낼 수 있다.
strings data.txt | grep "="
→ (생략) ========== G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
생략한 부분에는 =
기호가 포함된 라인들이 모두 출력됨으로, password가 있는 라인만 확인하면 된다.
Bandit10 Password : G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
앞서 언급했듯이, 특정 파일 내용을 출력하려고 하면 Binary file matches라는 메세지와 함께 명령을 수행하지 못하는 일이 발생한다. 해당 파일이 대부분 문자열로 인코딩 된 파일이지만, 특정 라인 때문에 data file로 인식될 수 있고, 이 경우 grep
은 이를 'binary' 파일로 간주하게 된다.
grep
할 수 없다.이를 해결하기 위해서는, 모든 파일을 text file로 인식하여 명령어를 수행하도록 도와주는 grep
명령어의 option 중 하나인 -a
를 사용해야 한다. 즉 -a
옵션을 사용하면 binary file을 text file로 인식해 내용을 검색할 수 있게 도와준다는 뜻이다.
cat data.txt | grep -a "===="
물론 해당 level에서는 원활하게 text file로 처리되었으나, 여전히 육안으로 확인하기에 어려움이 있어 파일에 포함된 문자열을 출력할 수 있는 strings
명령어를 사용해야 한다.
strings
명령어는 실행 파일인 ASCII 문자를 찾아 화면에 출력한다. Binary file 또는 Object file에 있는 모든 인쇄 가능한 문자열을 추출하여 출력하기에 유용한 명령어이다.
strings [file name][option]
예시로, data.txt file에는 ASCII 코드가 아닌 코드들이 섞여 있어 제대로 읽을 수 없다. 그렇기에 strings
명령어로 data.txt file를 실행하면 읽을 수 있는 문자열만 출력하게 된다.