프롤로그
bandit 문제풀이
저번 비밀번호는 4CKMh1JI91bUIZZPXDqGanal4xvAg0JM 이다.
문제
다음 레벨로 가는 비밀번호는 data.txt 인 파일에 있다. 그리고 사람이 읽을 수 있는 문자열이고, 몇개의 = 문자 뒤에 있다.
strings
바이너리 파일이나 이진 데이터 내에 포함된 사람이 읽을 수 있는 텍스트 문자열을 추출하는 데 사용된다. 일반적으로 바이너리 파일은 사람이 직접 읽기 어려운 형식으로 되어 있으므로, strings 명령어는 그 안에서 ASCII나 유니코드 문자열을 찾아 출력한다.
- -n : 최소 길이 맞추기
- strings -n 8 program #8글자 이상 가져오기
- - e : 특정 인코딩
- strings -e S binaryfile #UTF-16
- - t : 특정 오프셋
grep
그랩은 계속 해서 나오는 거 같은데 그만큼 많이 중요하고 핵심이라서 그런 것 같다. 나도 이걸 많이 써보지를 않았다 보니까 계속 까먹는다 그냥. 까먹는다기 보다는 계속 새로운 속성들이 나오니까...이거 참 외우기로 힘들고 익숙해지는 방법밖에 없다.
파일이나 명령어의 출력에서 특정 패턴을 검색하고, 그 패턴이 포함된 줄을 출력하는 명령어인데
- -i : 대소문자 구분 X
- -r / -R : 재귀적 탐색
- -l: 패턴이 포함된 파일 이름만 출력.
- -n: 패턴이 포함된 줄 번호를 함께 출력.
- -v : 패턴이 포함되지 않는 줄을 출력
- -E : 확장된 정규 표현식을 사용한다. 웬만하면 이거 붙여라. 아래 있는 거 할 때 귀찮아진다.
이정도는 이전에서도 계속 알았고
grep [옵션] '검색 패턴' [파일명]
이렇게 쓴다는 것은 알고 있다.
이때, 검색패턴 부분에서 정규표현식을 통해서 더 강력하게 문자열들을 찾아낼 수 있다.
정규표현식
1. 리터럴 문자
pattern
있는 그대로 검색한다.
2. 메타 문자
.(점)
임의의 단일 문자를 의미한다.
b.t
라고 한다면, bit, bat, bot 등 저기 가운데에는 아무거나 한 글자 들어간다는 뜻인다.
^(캐럿)
시작을 나타낸다
^Hello
라고 한다면, Hello로 시작하는 단어들을 찾아낸다.
다만 이게 배열에 들어간다면 말이 좀 다르다.
[0-9]
이렇게 있으면 0~9까지를 의미하는 말이지만
[^0-9]
를 해버리면 숫자 빼고 라는 의미가 되어버린다
$(달러)
끝을 나태낸다.
World$
라고 한다면, World로 끝나는 단어들을 찾아낸다.
위에 두 개 합친다면,
^Hello World$
한다면 딱 저렇게 시작하고 끝나는 단어를 찾아낼 것이다.
*(애스터리스크)
앞의 문자가 0번이상 반복된다는 의미
go*gle
이렇게 있으면 ggle, gogle, google, gooogle, gooooogle, gooooooooooooooogle 다 된다는 것이다. 그러니까, o가 있어도 그만, 없어도 그만이란 얘기
+ (플러스)
앞의 문자가 1번 이상 반복된다는 의미
go+gle
아까 전에랑 비슷한데 안 되는 건, ggle 이건 안 된다. o가 반드시 한 번은 있어야 하기 때문에 gogle 부터 가능하다.
?(물음표)
앞의 문자가 0번 또는 1번 있을 수도 있고~ 없을 수도 있다 라는 의미
goo?gle
이렇게 있으면 google 또는 gogle 만 가능.
있을수도 있고...없을수도 있고 라는 의미니까.
3. 문자 클래스
[] (대괄호)
여러 문자 중에 하나.
[abcdefg]
[a-g]
이중에 하나라는 의미.
{} (중괄호)
특정 횟수를 반복시킨다
a{3}
a{3, 5}
위에 건 a를 3번 반복한 aaa
아래건 a를3번 이상 5번 이하 반복한 aaa, aaaa, aaaaa전부 매칭된다.
풀이과정
일단 접속부터 하자
ssh bandit9@bandit.labs.overthewire.org -p 2220
4CKMh1JI91bUIZZPXDqGanal4xvAg0JM
ls
cat data.txt
이 중에서 몇 개의 = 이거 뒤에 있다고 했으니까 해당 부분을 찾아야 한다.
정규 표현식으로 몇 개의 = 이거 뒤라는 의미가 결국에는 =+ 를 입력하면 될 것이다. 이렇게 하면 =가 한 번 이상 반복된다는 의미니까.
grep "=+" data.txt
했더니 아무것도 안 나온다. 엄...
당연하다. 저기에는 읽을 수 없는 것들도 포함되니까.
아까 strings를 써서 읽을 수 있는 것들만 가져오고 | 파이프를 통해서, grep 을 통해 정규표현식으로 넣어줘야한다.
strings data.txt | grep "=+"
하면 아무것도 안 나온다. 이때 아까 위에서 -E 이거 붙이라고 하던 거 기억하는 가
strings data.txt | grep -E "=+"
확실히 차이가 난다. 대충 비밀번호 같이 생긴 게 저거인 거 보이는 가?
정답
비밀번호는 FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey 이다.
에필로그
https://overthewire.org/wargames/bandit/bandit10.html
100번째 글 달성하고, 이게 101번째 글이다.
하루만에 글 10개쓴 거 같다.
'bandit' 카테고리의 다른 글
[2024/bandit] bandit level11 -> level12 Write-up (1) | 2024.11.18 |
---|---|
[2024/bandit] bandit level10 -> level11 Write-up (0) | 2024.11.16 |
[2024/bandit] bandit level8 -> level9 Write-up (0) | 2024.11.10 |
[2024/bandit] bandit level7 -> level8 Write-up (1) | 2024.11.10 |
[2024/bandit] bandit level6 -> level7 Write-up (0) | 2024.11.10 |