Mic Check

아주대 CTF 디스코드 notice 채널 맨 첫 메세지에 있다.

The Powershell

vscode든지 메모장이든지 아무 에디터로 열어서 그냥 분석하면 된다.

v = [7, 96, 164, 214, 92, 231, 220, 244, 19, 182, 21, 228, 228, 29, 76, 96, 226, 42, 18, 102, 152, 255, 24, 232, 253, 8, 10, 126]
k = 0x77

def rol(x, n):
    return ((x << n) | (x >> (8 - n))) & 0xFF

flag = []
for i, enc in enumerate(v):
    rot = enc ^ ((k + i) & 0xFF)
    tmp = rol(rot, i % 8)
    flag.append(tmp)

print(''.join(chr(x) for x in flag))

FLAG

flag{p0wershEllR3v3rseEng1ne3r1ng}

Bacon

ChatGPT로 풀렸다.

bacon_cipher_table = {
    'aaaaa': 'A', 'aaaab': 'B', 'aaaba': 'C', 'aaabb': 'D', 'aabaa': 'E',
    'aabab': 'F', 'aabba': 'G', 'aabbb': 'H', 'abaaa': 'I', 'abaab': 'J',
    'ababa': 'K', 'ababb': 'L', 'abbaa': 'M', 'abbab': 'N', 'abbba': 'O',
    'abbbb': 'P', 'baaaa': 'Q', 'baaab': 'R', 'baaba': 'S', 'baabb': 'T',
    'babaa': 'U', 'babab': 'V', 'babba': 'W', 'babbb': 'X', 'bbaaa': 'Y',
    'bbaab': 'Z'
}

def decode_encrypted_message(encrypted_msg):
    # 1. 대소문자를 a/b로 변환
    binary_msg = ''
    for char in encrypted_msg:
        if char.isalpha():
            binary_msg += 'a' if char.islower() else 'b'
    
    # 2. 5글자 단위로 잘라서 복호화
    decoded_msg = ''
    for i in range(0, len(binary_msg), 5):
        chunk = binary_msg[i:i+5]
        if len(chunk) == 5:
            decoded_msg += bacon_cipher_table.get(chunk, '?')
    
    return decoded_msg

# 예시 사용법
if __name__ == "__main__":
    encrypted_input = input("encrypted msg: ").strip()
    original_msg = decode_encrypted_message(encrypted_input)
    print(f"Decoded message: {original_msg}")

FLAG

flag{b818cf76a43e5ebd899097c4b53ab4f069ed2551463bc34b8d18e1b44db18afb247406f61dd2fdf4481f4a6b41ed0aee52e34377b8}

Elliptic

이것도 GPT가 풀어줬다.

from cryptography.hazmat.primitives.asymmetric.utils import decode_dss_signature
import binascii

original_sig_hex = """
3045022100aabbccddeeff00112233445566778899aabbccddeeff00112233445566778802200aabbccddeeff00112233445566778899aabbccddeeff001122334455667788
"""  # <- 실제 값으로 바꿔야 함

original_sig_bytes = binascii.unhexlify(''.join(original_sig_hex.strip().split()))
r, s = decode_dss_signature(original_sig_bytes)

# 바이트 변환
r_bytes = r.to_bytes((r.bit_length() + 7) // 8, 'big')
s_bytes = s.to_bytes((s.bit_length() + 7) // 8, 'big')

# 0x00을 앞에 붙여 더 긴 바이트로 만듦 (조건부)
if r_bytes[0] & 0x80 == 0:
    r_bytes = b'\\x00' + r_bytes
if s_bytes[0] & 0x80 == 0:
    s_bytes = b'\\x00' + s_bytes

# DER 구성 수동
r_part = b'\\x02' + bytes([len(r_bytes)]) + r_bytes
s_part = b'\\x02' + bytes([len(s_bytes)]) + s_bytes
seq = r_part + s_part
full = b'\\x30' + bytes([len(seq)]) + seq

# 비교
if full != original_sig_bytes:
    print("[+] 수동 DER 생성 성공 (바이트 다름)")
    print("▶ HEX:", binascii.hexlify(full).decode())
else:
    print("[-] 실패: 바이트 그대로임")

FLAG

flag{564ab5e5a509f00bbfb8a3dd31404792058580c265a21211b3c69b4b2f18046073e355858b6dcf9f40d39f88c0fee2dd73906f1780}