bandit

[2024/bandit] bandit level10 -> level11 Write-up

성밍쟁 2024. 11. 16. 21:13
728x90
반응형

프롤로그

bandit 문제풀이

저번 비밀번호는 FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey 이다.

 

 

문제

다음 레벨로 가는 비밀번호는 data.txt 파일 안에 저장되어있는데, 그 파일은 base64 인코딩된 데이터가 포함되어있다.

 

 

base64란?

바이너리 데이터를 텍스트 형식으로 인코딩하는 방법 중 하나. 

주로 이진 데이터를 텍스트로 변환하거나, 아니면 네트워크 전송 및 데이터 저장을 할 때 사용된다.

 

왜 base64냐? 아스키 코드 중에서 [a-z], [A-Z], [0-9] , +, /까지 총 26+26+10+2= 64개, 즉 기본적인 것만 사용한다고 해서 base64라고 불린다.

 

그래서 base64 인코딩이라고 한다는 것은, 원래 바이너리 데이터를 Base64 형태로 변환한다는 의미이고, 

base64디코딩을 한다는 것은, 인코딩된 데이터를 원래 바이너리데이터로 변환한다는 얘기이다

 

Base64 장점:

  • 이진 데이터를 ASCII 문자로 변환해, 텍스트 기반 시스템에서 안전하게 전송하거나 저장할 수 있다.
  • 인코딩된 데이터는 텍스트 편집기에서 쉽게 읽을 수 있다.

Base64의 단점:

  • 인코딩된 데이터의 크기가 원래 데이터보다 약 33% 더 커진다.
  • 보안적인 인코딩은 아니므로 민감한 데이터를 다룰 때는 암호화를 별도로 사용해야 한다.

 

 

리눅스 base64

리눅스에서 base64로 인코딩 디코딩 하는 방법은 다음과 같다.

(1) 인코딩

base64 #인코딩

이렇게 사용하는데, 

echo "hello world" | base64
aGVsbG8gd29ybGQK

이렇게 앞의 내용을 | 파이프를 이용하여 넘겨주어도 되고

base64 파일이름

 

이런식으로 해주어도 잘 작동한다.

 

(2) 디코딩

base64 --decode #디코딩

이렇게 사용하는데

아까랑 똑같이

echo "dGhpcyBpcyBzZW8gbWluIGphZQoK" | base64 --decode
this is seo min jae

이렇게 사용하거나

base64 --decode 파일명

으로 사용한다.

 

 

풀이과정

우선 접속부터 하자.

ssh bandit10@bandit.labs.overthewire.org -p 2220
FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey
ls

해서 data.txt를 읽어보자.

저렇게 base64로 인코딩된 값이 있다.

cat data.txt|base64 --decode

하면

cat data.txt|base64 --decode
The password is dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr

이렇게 값이 나온다

비밀번호가 나왔다.

 

 

정답

비밀번호는 dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr 이다.

 

 

==??

근데 아까전에 base64는 a-z, A-Z, 0-9, +/ 이것만 된다고 하지않았나?

왜 아까 base64로 인코딩된거에 ==이거가 있냐? 그러면 base65가 되어야하는 거 아니냐?

 

이걸 이해하기 위해선 인코딩이 어떻게 작동하는지 알아야한다.

 

1. 우선 3바이트가를 묶는다. 3바이트는 총 3*8 해서 24비트. 

2. 이 24비트를 6바이트씩 4개의 블록으로 나눈다. 그러니까 6비트짜리 4블록이 생성이 된다.

3. 각 6비트 블록들은 아래의 base64들과 매칭이 된다.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

 

이렇게 진행되는데, 그러면 3바이트씩 묶어야하지 않는가? 근데 만약의 전체 길이가 3의 배수가 아니라면...?

인코딩 할 대상이 3바이트가 안 되면 맨 뒤에 0을 채워준 다음에 3의 배수로 만들고, 인코딩을 진행한다.

그렇다면, 인코딩이 끝난 후에는 몇 개를 추가적으로 0을 채웠는지 알려줘야 하지 않겠는가?

그래서 3의 배수로 만들기 위해서 1바이트를 추가했다면 =를 한개만 붙이고, 2바이트를 추가했다면 ==을 붙여주는 것이다.

 

디코딩할 때 =의 개수를 가지고, 참고한다.

 

 

에필로그

base64가 이런 거였구나.

 

 

 

 

728x90
반응형