728x90
반응형
1. intro
2. code 및 분석
2.1. code
N/A
2.2. 분석
마찬가지로 문제의 설명을 간단히 해석해보면
다른 일반적인 인코딩 스킴으로 base 64가 있다.
이것은 바이너리 데이터를 64자리의 알파벳으로 구성된 ascii string으로 대체하는 방식이다.
base 64로 인코딩된 하나의 문자는 6비트이며, 4개의 문자가 3개의 8비트 바이트로 구성된다.
이게 뭥말인가? 하면 아래 테이블 하나면 해결된다.
Text content | M | a | n | |||||||||||||||||||||
ASCII | 77 | 97 | 110 | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Index | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64-Encoded | T | W | F | u |
그리고 값에 따라 대응하는 base 64 encoded 값은 아래와 같다.
값 | 문자 | 값 | 문자 | 값 | 문자 | 값 | 문자 |
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
인코딩 방식에 대해 조금 더 이야기 하자면,
문자열을 ascii code로 변환하고,
이를 8비트로 표현하고,
이를 다시 한번 6비트로 쪼개서 읽었을 때의 값을
위의 테이블에 적용하는 것이다.
상세한 내용은 아래를 참고하자.
https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464
베이스64 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의
ko.wikipedia.org
3. exploit
물론 문제에서와 같이 함수로 디코딩 하여도 되겠지만, 원리를 이해하기 위해 직접 구현해봤다.
e = '72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf'
base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
byte = bytes.fromhex(e)
bit = ''
b64 = ''
for i in range(len(byte)):
bit += bin(byte[i])[2:].rjust(8,'0')
for i in range(0,len(bit),6):
b64 += base64[int(bit[i:i+6],2)]
print(b64)
┌──(kali㉿kali)-[~/Downloads]
└─$ python solve.py
crypto/Base+64+Encoding+is+Web+Safe/
또는 아래와 같이 간단히 풀 수 있다.
┌──(kali㉿kali)-[~/Downloads]
└─$ python
Python 3.10.8 (main, Nov 4 2022, 09:21:25) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> e = '72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf'
>>> base64.b64encode(bytes.fromhex(e))
b'crypto/Base+64+Encoding+is+Web+Safe/'
728x90
반응형
'Wargame > Cryptohack' 카테고리의 다른 글
XOR Starter (0) | 2023.01.31 |
---|---|
Bytes and Big Integers (0) | 2023.01.31 |
Hex (0) | 2023.01.31 |
ASCII (0) | 2023.01.31 |
Great Snakes (0) | 2023.01.31 |