CBC ๋ชจ๋
AES์ CBC (Cipher Block Chaining) ๋ชจ๋๋ ๋ธ๋ก ์ํธํ ๋ชจ๋ ์ค ํ๋๋ก, ๊ฐ ๋ธ๋ก์ ์ํธํํ ๋ ์ด์ ๋ธ๋ก์ ์ํธ๋ฌธ๊ณผ XOR ์ฐ์ฐ์ ์ํํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
- IV(Initialization Vector) ์ ํ: ๋ฌด์์๋ก ์ ํ๋ IV๋ ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ๋ธ๋ก ๋จ์ ์ํธํ: ํ๋ฌธ์ ๋ธ๋ก ํฌ๊ธฐ๋ก ๋๋ ํ, ๊ฐ ๋ธ๋ก์ ์ด์ ๋ธ๋ก์ ์ํธ๋ฌธ๊ณผ XOR ์ฐ์ฐ์ ์ํํ ๋ค AES ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ํธํ๋๋ค.
์ฃผ์ด์ง ์ฝ๋ ํด์
1. token + b'test' ๋ฅผ aes_key ๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํํ๊ณ ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
aes_key = get_random_bytes(AES.block_size)
token = b64encode(get_random_bytes(AES.block_size*10))[:AES.block_size*10]
client.send(b'test Command: ' + AESCipher(aes_key).encrypt(token+COMMAND[0]) + b'\\n')
2. IV ์ Message ๋ฅผ ์ ๋ ฅ ๋ฐ์ aes_key ๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํํ๊ณ ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
client.send(b'**Cipher oracle**\\n')
client.send(b'IV...: ')
iv = b64decode(client.recv(1024).decode().strip())
client.send(b'Message...: ')
msg = b64decode(client.recv(1024).decode().strip())
client.send(b'Ciphertext:' + AESCipher(aes_key).encrypt_iv(msg,iv) + b'\\n\\n')
3. ์ํธ๋ฌธ์ ์ ๋ ฅ ๋ฐ๊ณ ๊ทธ ๊ฐ์ด token + b'show' ์ ์ผ์นํ๋ ๊ฒฝ์ฐ flag๋ฅผ ์ถ๋ ฅํ๋ค.
while(True):
client.send(b'Enter your command: ')
tt = client.recv(1024).strip()
tt2 = AESCipher(aes_key).decrypt(tt)
client.send(tt2 + b'\\n')
if tt2 == token+COMMAND[1]:
client.send(b'The flag is: ' + flag)
print(b'The flag is: ' + flag)
client.close()
break
ํ์ด ๋ฐฉ๋ฒ
์ฃผ์ด์ง ์ฝ๋์์๋ ๋์ผํ ํค๊ฐ ๊ณ์ ์ฌ์ฉ๋์ด ์ํธํ์ ๋ณตํธํ๊ฐ ์ด๋ฃจ์ด์ง๋ค. ๋ํ, AES๊ฐ 16 ๋ฐ์ดํธ ๋ธ๋ก ์ํธ๋ผ๋ ํน์ฑ์ ํ์ฉํ์ฌ token + b'show' ๋ฌธ์์ด์ ์ํธ๋ฌธ์ ๊ตฌํ์.
1. token์ ์ํธ๋ฌธ์ C0~C10 ์ ํด๋นํ๋ค. test์ ์ํธ๋ฌธ์ C11์ ํด๋นํ๋ค.
2. Cipher Oracle์ ์ฌ์ฉํ์ฌ token + b'show' ์ ๋ง์ง๋ง ๋ธ๋ก ์ํธ๋ฌธ์ ์์ฑํ๋ค. ์ด๋ IV๋ C10, Message๋ ‘show’๋ก ์ค์ ํ๋ค.
3. C0~C10 ๊ณผ ์๋ก ์์ฑํ C11์ ํตํด flag๋ฅผ ํ๋ํ๋ค.
ํ์ด ์ฝ๋
from pwn import *
import base64
p=remote("host3.dreamhack.games", 11224)
## token + 'test' ๊ฐ ์ํธํ๋ ๊ฐ
p.recvuntil(b"test Command: ")
test_command = p.recvline().decode('utf-8')
## C10 + 'show' ๊ฐ ์ํธํ๋ ๊ฐ
p.recvuntil(b"IV...:")
iv = base64.encodebytes(base64.b64decode(test_command)[160 : 176])
p.send(iv)
p.recvuntil(b"Message...:")
p.send(base64.encodebytes(b"show"))
p.recvuntil(b"Ciphertext:")
cipher_text = p.recvline().decode('utf-8')
## token + 'show' ๊ฐ ์ํธํ๋ ๊ฐ ์
๋ ฅใด
p.recvuntil(b"Enter your command: ")
p.send(base64.encodebytes(base64.b64decode(test_command)[0 : 176] + base64.b64decode(cipher_text)[16 : 32]))
print(p.recvline())
print(p.recv(512))
'๐ดโโ ๏ธ CTF ๐ดโโ ๏ธ > ๐งฎ ์ํธํ ๐งฎ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dream Hack - Crypto] Padding Oracle (0) | 2023.12.29 |
---|---|
[Dream Hack - Crypto] Pyploit (2) | 2023.12.18 |
[Dream Hack - Crypto] X-Time Pad (0) | 2023.12.09 |
[Dream Hack - Crypto] likeb64 (0) | 2023.12.09 |
[DreamHack - Crypto] uncommon_e (2) | 2023.11.22 |