입력 바이트를 왼쪽으로 4비트 회전 후 피보나치 수열과 XOR 미리 정의된 바이트 배열과 비교하면 플래그를 알아낼 수 있다.
// 검증 알고리즘
v4 = 0, v3 = 1
for i in range(73):
fib_val = (v4 + v3) & 0xFF
if (expected[i] != (fib_val ^ ROL(input[i], 4))):
return false
v4 = v3
v3 = v4 + v3
return true
#!/usr/bin/env python3
def rol(byte_val, bits):
return ((byte_val << bits) | (byte_val >> (8 - bits))) & 0xFF
def ror(byte_val, bits):
return ((byte_val >> bits) | (byte_val << (8 - bits))) & 0xFF
def generate_fibonacci_sequence(length):
sequence = []
v4 = 0
v3 = 1
for i in range(length):
current_val = (v4 + v3) & 0xFF
sequence.append(current_val)
v5 = v4 + v3
v4 = v3
v3 = v5
return sequence
def solve():
expected_bytes = [
0x37, 0x34, 0x55, 0x26, 0x0b, 0x2e, 0x46, 0x95, 0x24, 0x1f, 0xc3, 0xaf, 0x5f, 0x31, 0xed, 0x1b,
0x0e, 0x56, 0x5b, 0xa4, 0x39, 0xc2, 0x13, 0x37, 0xb2, 0x51, 0xe0, 0xb6, 0x6b, 0xbe, 0x63, 0xc4,
0x81, 0xaf, 0xd3, 0x6a, 0x3a, 0xf4, 0xc8, 0x2e, 0xbb, 0xd6, 0xbe, 0xb1, 0x0c, 0x87, 0x73, 0x07,
0x57, 0xd1, 0xb5, 0x46, 0x6b, 0xcb, 0xa3, 0x84, 0xe4, 0x2a, 0x53, 0x1f, 0xfa, 0xa1, 0xfd, 0x8e,
0x2b, 0xf6, 0x3e, 0x04, 0x1c, 0x92, 0x63, 0x77, 0x46
]
fib_sequence = generate_fibonacci_sequence(73)
flag = []
for i in range(73):
rotated_byte = expected_bytes[i] ^ fib_sequence[i]
original_byte = ror(rotated_byte, 4)
flag.append(chr(original_byte))
return ''.join(flag)
if __name__ == "__main__":
flag = solve()
print(f"Flag: {flag}")
print(f"Length: {len(flag)}")
