본문 바로가기

Bandit

Bandit Level 7 -> Level 8 (awk/sed)

 해당 게시글은 bandit wargame에 대한 스포일러(방향성/힌트/정답)를 제공할 수 있습니다. 

 

 

 

bandit level 7에서 비밀번호를 얻기 위해

millionth라는 단어 옆에 나열된 비밀번호 문자열을 출력해야합니다. 

 

grep 'millionth' data.txt
# data.txt에서 'millionth'가 들어간 줄만 출력해라.

grep 명령어를 이용하여 millionth과 같은 줄에 있는 비밀번호만 출력시키면
millionth 단어와 함께 목표한 비밀번호가 출력됩니다. 

 

grep 'millionth' data.txt | awk '{print $2}'
# data.txt에서 'millionth'가 들어간 줄을 추출하여
# 문자열을 공백/탭으로 하여 2번째 단어만 출력해라.

 

만약 비밀번호만 출력해야 한다면
파이프 라인으로 awk 명령어의 인수로 넘겨주고 2번째 토큰(비밀번호)만 출력하면 됩니다. 

 

더보기

awk vs grep vs sed

awk : 열(Column) 중심의 데이터 분석에 특화

grep : 행(Row) 추출에 특화

sed : 행(Row) 중심의 텍스트 변환 및 필터링에 특화

 

awk

: pattern-directed scanning and processing language

awk 'pattern { action }' filename
# Pattern: 어떤 줄에 적용할지 결정하는 조건 (생략 시 모든 줄에 적용)
# Action: 조건이 참일 때 실행할 명령어 (생략 시 기본값은 { print })
  • $0: 현재 처리 중인 전체 행
  • $1, $2, ...: 현재 행의 첫 번째, 두 번째, ... 열 (기본적으로 공백이나 탭으로 구분, -F 옵션으로 연산자 지정 가능)
  • NR (Number of Record): 현재 처리 중인 행 번호
  • NF (Number of Field): 현재 행에 포함된 열의 개수
  • FS (Field Separator): 입력 필드 구분자 (기본값은 공백)
  • BEGIN { ... }: 데이터를 읽기 전에 한 번만 실행 (헤더 출력, 변수 초기화)
  • END { ... }: 데이터를 모두 읽은 후에 한 번만 실행 (결과 요약, 합계 출력)
awk '{ print $1, $3 }' data.txt
# data.txt의 1번째, 3번째 열만 출력

awk '$2 >= 100 { print $0 }' data.txt
# 2번째 열의 값이 100 이상인 행만 출력

awk -F ":" '{ print $1 }' /etc/passwd
# 구분자를 :(colon)으로 지정하여 /etc.passwd의 1번째 열만 출력

awk 'NR >= 10 && NR <= 20' data.txt
# data.txt의 10번째 줄부터 20번째 줄까지 출력

awk '{ sum += $1 } END { print "Total Sum: ", sum }' numbers.txt
# numbers.txt의 1번째 행만 더해서 마지막 줄에 Total Sum : (값)을 출력

 

sed

: stream editor for filtering and transforming text 

sed [option] 'command' filename
# command : 범위 or 동작

 

  • /pattern/: 특정 문자열이 포함된 행 대상
  • !: 조건의 반전 (예: 1!d는 1행을 제외한 나머지 )
  • option: -n (자동 출력 억제), -i (파일을 직접 수정) 등
  • command : s(substitute), d(delete), p (print) 등

 

Line-by-line processing

  1. 입력 스트림에서 한 줄을 읽어 패턴 공간(Pattern Space)이라는 임시 버퍼에 넣고
  2. 지정된 명령어를 해당 버퍼의 텍스트에 적용
  3. 결과를 표준 출력으로 내보낸 뒤 버퍼를 비우고 다음 줄로 넘어간다
sed 's/apple/orange/' file.txt      # 각 행에서 첫 번째 apple을 orange로 변경
sed 's/apple/orange/g' file.txt     # 행 전체(global)에서 모든 apple을 변경

sed '1d' file.txt                   # 첫 번째 줄 delete
sed '1,5d' file.txt                 # 1~5행 delete
sed '/pattern/d' file.txt           # 특정 패턴이 포함된 행 delete

sed -n '5p' file.txt                # 5번째 줄만 출력
sed -n '10,20p' file.txt            # 10~20행만 출력

sed -n '/START/,/END/p' file.txt    # START 문구부터 END 문구 사이의 모든 행 출력

 

 

 

 

less data.txt 의 결과

less 명령어를 활용하여 data.txt를 확인하면
cat으로 출력하여 직접 읽어볼 수 있는 분량이 아니라는 사실을 알 수 있습니다. 

더보기

- less command

명령 키 동작 비고
Space 한 화면 아래로 페이지 단위 스크롤
b 한 화면 위로 Backward 이동 (역방향 탐색)
G 파일의 최하단으로 파일 끝(EOF)까지 점프
g 파일의 최상단으로 파일 시작점(Offset 0)으로 복귀
/pattern 문자열 정방향 검색 력한 패턴을 찾아 강조 표시
q 종료 (Quit) 표준 출력 버퍼를 반환하고 쉘로 복귀

 

만약 cat 명령어로 data.txt를 출력했더라면 텍스트 데이터들이 무수히 많이 출력될 것입니다. 

 

cat으로 읽었다면 Ctrl + C 단축키를 통해 프로세스를 종료하고

grep 명령어를 이용하여 비밀번호가 포함된 줄만 출력시키면 됩니다.