LINE CTF 2021 - Crypto - babycrypto2
TL;DR
問題文
nc 35.200.39.68 16002
概要
babycrypto1と似ているが、test Command表示後すぐに任意の暗号文の復号フェーズに入る。
また、フラグ表示条件がPREFIX + b'show' + TOKENと一致することに変わっている。
解法
IVを指定できるため、先頭ブロックを自由に書き換えることが可能。
test部分がshowになるようにIVを作れば良い。
code:py
from base64 import b64decode, b64encode
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
class AESCipher:
def __init__(self, key):
self.key = key
def encrypt(self, data):
iv = get_random_bytes(AES.block_size)
self.cipher = AES.new(self.key, AES.MODE_CBC, iv)
return b64encode(iv + self.cipher.encrypt(pad(data,
AES.block_size)))
def encrypt_iv(self, data, iv):
self.cipher = AES.new(self.key, AES.MODE_CBC, iv)
return b64encode(iv + self.cipher.encrypt(pad(data,
AES.block_size)))
def decrypt(self, data):
raw = b64decode(data)
token = b"ZzTosTPcUnBu44roqYGeyIjyJ22OoYp66c67bitZZthoRjCwTC9sW5jOFkVqW7WlMwJqI5Y+eJtxCkY4lkVkX3vzdDSkPtwB1FOrfHWPeGq4jOeprbrqhtcQzRdUsukyF1YdRzzZ8ezm2g82ydjFYcDrkfzk3ZQOzx0CpVulL80HGbwsB6amUMsmmVsC4jULWpg66++vj30B6p/aKGbh"
test_command = "X05PCR4VfeCWgbO4WOg0P9FRaRRgaPdE4PTrm370iRtTxrC5ty3cfApwL7FCuk5vszs+5J6mbyxtKZj8Ys5MkTfP1P4oqdHIlz8q9LDnotMejlveXz9AOvzuZuR5BmW0dbhVMxX6vtEKEMEGqBWC/tJOFRjFaEjfoxnN5edF0GMiRSnhdHDG6qqc6Lps/EV8kvbK20iNn0mPTkF5RoJj9/72fRINw+LeObfXWdatf1cjKGV0AibIudk5IocSXVIGlb2Dgtml16Bn0f7ywOAbJMM8AHm7fy8VLrXNZXjH2gQuZg679reNATUK77aBln8RGNaMxhm+fHMtqy2+FOqWmA=="
print(iv)
print(test_command_body_first_block)
print(show_command_raw)
iv_send = bytes([ivi ^ test_command_rawi ^ show_command_rawi for i in range(len(iv))])
print(iv_send)
show_command = b64encode(iv_send + test_command_body)
print(show_command)
LINECTF{echidna_kawaii_and_crypto_is_difficult}