The password for the next level is stored in the file data.txt, which is a hexdump of a file that has been repeatedly compressed. For this level it may be useful to create a directory under /tmp in which you can work. Use mkdir with a hard to guess directory name. Or better, use the command “mktemp -d”. Then copy the datafile using cp, and rename it using mv (read the manpages!)
이번 password 역시 data.txt에 포함되어 있으나, hexdump로 본 결과가 여러 번 압축되어 있다고 합니다.
저희가 서버에서 마음대로 파일을 생성하고, 삭제할 권한이 없기 때문에 문제에서도 tmp 폴더를 활용하라고 하네요.
해결
ls -al 명령어로 data.txt 파일을 확인해봅니다.
file 명령어를 통해 data.txt가 text 형식임을 알 수 있습니다.
cat 명령어를 통해 data.txt 파일을 확인해보면 hexdump 명령어를 실행한 값이 저장되어 있는 것을 알 수 있습니다. hexdump는 바이너리에 대해서 내용을 hex 값으로 변환해서 보여주는 역할을 수행합니다. 가운데 섹션이 hex 값이고, 오른쪽 섹션이 원래 저희가 이전 문제에서 읽었던 단순 파일의 내용들을 나타내는 부분입니다.
원래라면 data type일때 저희가 읽지 못하는 글자들이 있는데, 이들에 대해서도 모두 hex 값은 할당되어 있기 때문에 이를 확인해볼 수 있는 명령어라고 할 수 있겠습니다.
data type에 대해서 모두 눈으로 읽지 못하는 이유는 hex 값에 대해서 ASCII text로 매핑할 값이 없어, 치환할 문자가 없기 때문에 보이지 않는 것이라고 할 수 있겠습니다. 실제로는 모두 값을 갖고 있습니다.
어쨌든 문제에서 제공해준 것에 따라 압축 해제를 하기 위해서는 mkdir 명령어를 통해 /tmp 디렉토리 아래에 myname123이라는 디렉토리를 형성해야 합니다.
참고로 /tmp 폴더는 임시 폴더이기 때문에, 영구적으로 파일이 남지 않습니다. 그리고 저희는 bandit12 홈디렉토리에 write 권한이 부여되지 않아서 압축 해제와 같은 작업을 할 수 없는데, /tmp에 권한이 부여되어 있기 때문에 여기서 작업이 가능한 것입니다.
어쨌든 cp 명령어를 통해 data.txt 파일을 새로 만든 myname123 디렉토리에 복사해봅니다.
cp는 명령어에서 유추해볼 수 있듯, copy의 약어 입니다. 파일/디렉토리를 복사하는 기능을 갖고 있습니다.
ls -al 명령어를 통해 /tmp/myname123 에 data.txt파일이 들어있음을 확인할 수 있습니다.
이제 실제로 /tmp 폴더로 이동해서 작업을 진행해보겠습니다.
cd 명령어를 통해 /tmp/myname123 으로 이동합니다.
xxd 명령어를 통해 hexdump 결과를 가지고 있는 data.txt 파일을 16진수로 읽을 수 있습니다.
원본 파일을 유지하기 위해서 data라는 새로운 파일로 표준 출력을 redirect 하였습니다.
ls -al 명령어를 통해 data 파일이 새롭게 만들어졌음을 확인할 수 있습니다.
1단계 압축 파일: gzip
이제 data 파일에 대해서 file 정보를 출력해보겠습니다.
file 명령어를 통해 data의 파일 형식을 확인한 결과, gzip으로 압축되어 있는 것을 확인해볼 수 있습니다.
gzip 으로 압축된 파일을 해제하기 위해서는 반드시 파일의 확장자가 .gz으로 설정되어야 합니다.
즉, data인 파일명을 data.gz으로 변경해야 합니다.
이는 mv 명령어를 통해 가능합니다.
mv 명령어는 명령어에서 유추할 수 있듯, move의 기능을 수행합니다.
구체적으로 1) 파일 이동, 2) 파일명 변경을 수행할 수 있습니다.
mv [현재 파일명] [변경할 파일명] 형태로 사용하면 파일명을 변경할 수 있습니다.
이와 같은 형태로 data파일을 data.gz로 변경한 뒤, ls -al 명령어를 통해 파일명이 변경된 것을 확인할 수 있습니다.
여기까지 진행하면, 압축파일에 확장자가 붙어있지 않았던 것을 확장자까지 붙였습니다. 이제 압축파일을 해제하는 과정을 거쳐야합니다. .gz 파일에 대해서 어떻게 압축을 해제할 수 있을까요?
바로 gzip 명령어를 통해 data.gz 파일의 압축을 해제할 수 있습니다.
앞선 문제에서 base64를 decoding 할 때 option -d를 붙였듯, 여기서도 동일하게 -d 옵션을 활용하면 압축이 해제 됩니다.
확인해보면 압축이 해제되어 .gz 확장자가 사라지게 된 것을 알 수 있습니다.
2단계 압축 파일: bzip
압축이 해제된 파일에 대해서 file 명령어로 data 파일의 형식을 확인한 결과, 이번에는 bzip2 로 압축되어 있는 것을 확인해볼 수 있습니다.
이 역시 압축 파일의 한 형태입니다.
bzip2 명령어에서 마찬가지로 -d 옵션을 통해 data 파일의 압축을 해제한 결과, data.out 이라는 파일이 생성된 것을 확인할 수 있습니다.
3단계 압축 파일: gzip
file 명령어를 통해 data.out 파일의 형태를 확인하니, gzip으로 압축되어 있습니다.
앞선 과정과 동일하게 data.out 파일에 .gz 확장자를 붙여준 후 압축을 해제해봅니다.
4-5단계 압축 파일: tar
file 명령어를 통해 data.out 파일의 형식을 확인하니 tar 아카이브로 묶여져 있습니다.
tar 명령어를 통해 data.out 파일의 묶음을 해제한 결과, data5.bin이라는 파일이 생성되었습니다.
tar는 압축을 해제할 때 -d를 사용하지 않습니다. 자세한 내용은 [핵심] 파트 참고해주세요.
이후 동일하게 file 명령어를 통해 data5.bin 파일의 형태를 확인한 결과, 동일하게 tar 아카이브로 묶여져 있습니다.
동일하게 압축을 해제해보면 data6.bin 파일이 생성되고, file 명령어를 통해 bzip2 로 압축되어 있는 것을 확인해볼 수 있습니다.
6단계 압축 파일: bzip
bzip2 명령어를 통해 data6.bin 파일의 압축을 해제한 결과, data6.bin.out 이라는 파일이 생성된 것을 확인할 수 있습니다.
7-8단계 압축 파일: tar, gzip
file 명령어를 통해 data6.bin.out 파일의 형태를 확인하니, tar 아카이브로 묶여 있었고, tar 명령어를 통해 해제한 결과 data8.bin 파일이 생성되었습니다.
file 명령어를 통해 data8.bin 파일의 형태를 확인한 결과, gzip으로 압축되어 있습니다.
gzip 확장자에 맞게 파일명을 변경한 후 압축을 해제한 결과, data8.bin 파일이 생성되었습니다.
file 명령어를 통해 data8.bin 파일의 형태가 text 형식임을 확인할 수 있습니다.
최종적으로 cat 명령어를 통해 data8.bin 파일을 확인해보면 패스워드를 획득할 수 있습니다.
핵심
tar (Tape ARchiver) 명령어
여러 개의 파일을 하나의 파일로 묶거나 풀 때 사용하는 명령
파일 저장 및 전송 시, 다수의 파일 존재할 경우 관리 복잡 → 여러 파일을 하나로 합쳐 처리하기 위한 목적으로 만든 프로그램
Tape: 과거 사용되었던 저장 장치
ARchiver: 여러 개의 파일을 하나의 파일로 합치는 프로그램
→ 테이프에 파일을 백업하기 위해 만들어진 프로그램
tar 자체는 파일 압축을 수행하지 않음. 단순히 여러 파일을 하나의 파일로 묶는 용도로 사용됨
tar을 통해 하나로 합쳐진 파일을 gzip이나 bzip2 방식을 사용해 압축할 수 있음
이 때, gizp이나 bzip2 명령을 따로 수행하지 않고 tar 명령의 옵션으로 처리 가능함
단순 아카이버 기능 + tar로 묶여지기 전 파일들의 속성과 심볼릭 링크, 디렉토리 구조 등을 그대로 가져갈 수 있음
리눅스 용 프로그램, 데이터, 소스 및 라이브러리 등을 배포하는 용도로 많이 사용
tar 명령을 통해 만들어지는 파일의 확장자
".tar" 사용
gzip 또는 bzip2으로 압축된 경우
파일 뒤에 ".gz" 또는 ".bz2" 확장자 추가 => ".tar.gz" 또는 ".tar.bz2"로 파일 이름을 지정
간략하게, tar + gzip을 ".tgz"로, tar + bzip2를 ".tb2", ".tbz", "tbz2" 등으로 지정 가능
옵션 사용
1. tar 아카이브 묶기: cvf 사용
2. tar 아카이브 풀기: xvf 사용
3. tar로 묶고 gzip으로 압축하기: zcvf 사용
4. gzip으로 압축된 tar 아카이브 풀기: zxvf 사용
5. tar로 묶고 bzip2로 압축하기: jcvf 사용
6. bzip2로 압축된 tar 아카이브 풀기: jxvf 사용
gzip(GNU zip) 명령어
파일 압축 명령어
gzip [option] 압축할 파일 형태로 사용
.gz의 확장자를 가져야 해제 가능
zcat 명령어로 압축 파일 내용 확인 가능
여러 파일을 하나의 파일로 모을 수 없음
여러 파일을 하나의 파일로 압축하기 위해 보통 tar 명령어와 함께 사용
압축 → gzip 사용, 압축 해제 → gunzip 사용 (= gzip -d)
bzip2 명령어
파일 압축 명령어
gzip, zip 보다 압축률 좋지만 느린 속도
.bz2 의 확장자를 가져야 함
bzip2로 압축하 파일이 손상된 경우 bzip2recover [손상된 압축 파일명] 형태로 복구 가능
압축 → bzip2 사용, 압축 해제 → bunzip2 사용 (= bzip -d)
bzcat 명령어로 압축 파일 내용 확인 가능
xxd 명령어
주어진 파일이나 표준 입력으로 들어온 문자들을 16진수로 보여줌
mkdir (make directory) 명령어
새로운 디렉토리를 만들 때 사용
파일을 만들고자 하면 touch 명령어 사용할 것
rmdir 명령어로 비어있는 디렉토리를 삭제 가능 (파일이 들어있는 디렉토리 삭제 불가)
파일이 들어있는 디렉토리 삭제 시, rm -r [filename] 으로 가능함 (위험한 명령이니 주의!)
cp 명령어
파일, 디렉토리 복사
데이터 백업 시 유용
cp file1 file2형태로 사용
파일을 디렉토리 안으로 복사할 경우, cp file1 dir1/의 형태로 사용
한번에 여러 개의 파일을 디렉토리 안으로 복사할 경우, cp file1 file2 dir/의 형태로 사용