아주대 CTF 디스코드 notice 채널 맨 첫 메세지에 있다.
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{p0wershEllR3v3rseEng1ne3r1ng}
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{b818cf76a43e5ebd899097c4b53ab4f069ed2551463bc34b8d18e1b44db18afb247406f61dd2fdf4481f4a6b41ed0aee52e34377b8}
이것도 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{564ab5e5a509f00bbfb8a3dd31404792058580c265a21211b3c69b4b2f18046073e355858b6dcf9f40d39f88c0fee2dd73906f1780}