๋ฐ์ํ
PKCS#7 ํจ๋ฉ
- ํจ๋ฉ ๊ธธ์ด ๊ณ์ฐ: ํจ๋ฉ์ ๋ง์ง๋ง ๋ธ๋ก์ ๊ธธ์ด๊ฐ ๋ธ๋ก ํฌ๊ธฐ์ ๋ค๋ฅผ ๋ ์ถ๊ฐ๋ฉ๋๋ค. ํจ๋ฉ์ ๊ฐ์ ์ถ๊ฐ๋์ด์ผ ํ๋ ๋ฐ์ดํธ ์๋ก ํํ๋ฉ๋๋ค.
- ํจ๋ฉ ๊ฐ์ ์ผ๊ด์ฑ: ํจ๋ฉ ๊ฐ์ ์ถ๊ฐ๋์ด์ผ ํ๋ ๋ฐ์ดํธ ์๋ก ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ, ์๋ฅผ ๋ค์ด 1๋ฐ์ดํธ๊ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ค๋ฉด 0x01, 2๋ฐ์ดํธ๊ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ค๋ฉด 0x02๋ก ์ฑ์์ง๋๋ค. ์ด๋ ํจ๋ฉ์ ๋์ค์ ์ ๊ฑฐํ ๋ ์ด๋๊น์ง๊ฐ ํจ๋ฉ์ธ์ง ์ฝ๊ฒ ํ๋จํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋ชจ๋ ๋ฐ์ดํธ๊ฐ ํจ๋ฉ์ธ ๊ฒฝ์ฐ: ๋ง์ฝ ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๋ธ๋ก ํฌ๊ธฐ์ ์ ํํ ๋ฐฐ์์ผ ๋, ๋ธ๋ก ํฌ๊ธฐ๋งํผ์ ํจ๋ฉ์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ด๋ ์ถ๊ฐ๋๋ ๋ชจ๋ ๋ฐ์ดํธ ๊ฐ์ ํจ๋ฉ ๊ฐ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ํจ๋ฉ ์ ๊ฑฐ ์ ์ ํจ์ฑ ํ์ธ: ํจ๋ฉ ์ ๊ฑฐ ์์๋ ์ถ๊ฐ๋ ํจ๋ฉ ๊ฐ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํฉ๋๋ค.
Oracle Padding Attack
AES Oracle Padding Attack์ ํจ๋ฉ์ด ์ ์ฉ๋ ์ํธ๋ฌธ์ ๋ํ ์ค๋ผํด ์๋น์ค๋ฅผ ์ด์ฉํ์ฌ ํ๋ฌธ์ ์ถ์ถํ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๋๋ค. ์ด ๊ณต๊ฒฉ์ ์ฃผ๋ก ๋ธ๋ก ์ํธํ ๋ชจ๋ ์ค ํ๋์ธ CBC (Cipher Block Chaining) ๋ชจ๋์์ ๋ฐ์ํ๋ฉฐ, ํจ๋ฉ ์ค๋ผํด์ด ์ํธ๋ฌธ์ ํจ๋ฉ์ด ์ ํจํ์ง ํ์ธํ๋ ์๋น์ค์ผ ๋ ํ์ฉ๋ฉ๋๋ค.
๊ณต๊ฒฉ ๊ณผ์ :
- ์ํธ๋ฌธ ์์ง: ๊ณต๊ฒฉ์๋ ํจ๋ฉ์ด ์ ์ฉ๋ AES ์ํธ๋ฌธ์ ์ป์ต๋๋ค.
- ํจ๋ฉ ์ค๋ผํด ์๋น์ค ์ด์ฉ: ๊ณต๊ฒฉ์๋ ํจ๋ฉ ์ค๋ผํด ์๋น์ค๋ฅผ ์ด์ฉํ์ฌ ์ํธ๋ฌธ์ ๋ณตํธํํฉ๋๋ค. ํจ๋ฉ ์ค๋ผํด์ ํจ๋ฉ์ด ์ฌ๋ฐ๋ฅด์ง ์์ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ฐํํ๊ฑฐ๋ ํน๋ณํ ์ ํธ๋ฅผ ์ค ์ ์์ต๋๋ค.
- ํจ๋ฉ์ด ์ ํจํ์ง ํ์ธ: ๊ณต๊ฒฉ์๋ ํจ๋ฉ ์ค๋ผํด์ด ๋ฐํํ ์ ๋ณด๋ฅผ ๋ถ์ํ์ฌ ํจ๋ฉ์ด ์ ํํ์ง ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค. ํจ๋ฉ์ด ์ฌ๋ฐ๋ฅด๋ฉด ์ค๋ผํด์ ์ ์์ ์ธ ๋ณตํธํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ , ํจ๋ฉ์ด ์ฌ๋ฐ๋ฅด์ง ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋ธ๋ก ๋ณ ๋ณตํธํ: ๊ณต๊ฒฉ์๋ ์ํธ๋ฌธ์ ๋๋ถํฐ ์์ํ์ฌ ๋ธ๋ก์ ํ๋์ฉ ๋ณตํธํํฉ๋๋ค. ๊ฐ ๋ธ๋ก์ ๋ณตํธํํ ๋ ํจ๋ฉ์ ์กฐ์ ํ์ฌ ์ค๋ผํด์ ์ฌ๋ฐ๋ฅธ ํจ๋ฉ์ ์ ์ฉํ๋๋ก ํฉ๋๋ค.
- ์ ์ฒด ๋ฉ์์ง ๋ณตํธํ: ๊ฐ ๋ธ๋ก์ ๋ณตํธํํ์ฌ ์ ์ฒด ๋ฉ์์ง๋ฅผ ๋ณต๊ตฌํฉ๋๋ค.
ํ์ด ์ฝ๋
์๋ฒ์ ์๋ต ๊ฐ์ผ๋ก Padding์ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ฒฝ์ฐ(ValueError), Padding์ ์ ์์ ์ด์ง๋ง ๋ณตํธํ๊ฐ ์๋ชป๋์์ ๊ฒฝ์ฐ(JSONDecodeError)๋ก ๊ตฌ๋ถํ ์ ์๋ค.
import base64
from urllib import parse
import requests
API_URL = "<http://host3.dreamhack.games:23349/>"
BLOCK_SIZE = 16
def cbc_byte_decryption(ciphertext, index, block_size) :
burtf_i = index - block_size
burtf_c = ciphertext[burtf_i]
for i in range(0x00, 0xff+1) :
ciphertext[index - block_size] = i ^ burtf_c
enc_encoding = parse.quote(base64.b64encode(ciphertext))
params = f'secure/decrypt?token=abc&e_data={enc_encoding}&sig=abc'
response = requests.get(API_URL + params).json()
if(response['result']['message'] != 'ValueError') :
return i ^ (2*block_size - index)
return None
def cbc_block_decryption(ciphertext) :
decipher_text = [0] * BLOCK_SIZE
modified_block = ciphertext[:]
for index in range(BLOCK_SIZE - 1, -1, -1) : ## ๋ณตํธํํ ์ธ๋ฑ์ค ์์
for i in range(index + 1, BLOCK_SIZE) : ## i๋ณด๋ค ํฐ ์ธ๋ฑ์ค ํจ๋ฉ ์ ์ฉ
modified_block[i] = decipher_text[i] ^ ciphertext[i] ^ (BLOCK_SIZE - index)
decipher_text[index] = cbc_byte_decryption(modified_block, index + BLOCK_SIZE, BLOCK_SIZE)
print((chr)(decipher_text[index]))
return ''.join(chr(i) for i in decipher_text)
response = requests.get(API_URL + "gb/1")
enc_data = base64.b64decode(response.json()['result']['article']['enc_data'])
enc_01 = bytearray(enc_data[0 : 2*BLOCK_SIZE])
enc_02 = bytearray(enc_data[BLOCK_SIZE : 3*BLOCK_SIZE])
dec_01 = cbc_block_decryption(enc_01)
dec_02 = cbc_block_decryption(enc_02)
print(dec_01)
print(dec_02)
## p45$W0Rd
๋ฐ์ํ
'๐ดโโ ๏ธ CTF ๐ดโโ ๏ธ > ๐งฎ ์ํธํ ๐งฎ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dream Hack - Crypto] Double DES (0) | 2024.05.29 |
---|---|
[Dream Hack - Crypto] Private Storage (1) | 2024.01.23 |
[Dream Hack - Crypto] Pyploit (2) | 2023.12.18 |
[Dream Hack - Crypto] [LINE CTF 2021] babycrypto1 (2) | 2023.12.12 |
[Dream Hack - Crypto] X-Time Pad (0) | 2023.12.09 |