문제 개요
이 문제는 리버싱 문제로, 바이너리 내부에 존재하는 암호화된 데이터를 디코딩하여 플래그를 복원하는 문제입니다.
분석한 C 코드
for (i = 0; i <= 0x48; ++i) {
*(&v5 + i) = *((_BYTE *)v6 + i) + 4;
*(&v5 + i) ^= 0x41u;
*(&v5 + i) -= 7;
}
이 코드는 바이트 단위로 세 가지 연산을 순차적으로 수행하며 데이터를 디코딩합니다.
암호화된 값
-
v6
:0x373532252A1D3107
0x2174737673217473
0x7175212170731D71
-
v7
:"p ont\"usmtnqst!q"
0x73741D711F766E70
-
v8
:"uu $mponppvmuun$"
0xB9726F737371246F
복호화 로직
각 바이트는 다음과 같은 방식으로 복호화됩니다:
def decrypt_byte(b):
return ((b + 7) ^ 0x41) - 4
해당 연산은 C 코드의 +4 -> ^0x41 -> -7
의 역순입니다.
파이썬 복호화 코드
from pwn import *
v6 = (
0x373532252A1D3107.to_bytes(8, 'little') +
0x2174737673217473.to_bytes(8, 'little') +
0x7175212170731D71.to_bytes(8, 'little')
)
v7 = (
b"p ont\"usmtnqst!q" +
0x73741D711F766E70.to_bytes(8, 'little')
)
v8 = (
b"uu $mponppvmuun$" +
(0xB9726F737371246F).to_bytes(8, 'little')
)
encrypted = v6 + v7 + v8
def decrypt_byte(b):
return ((b + 7) ^ 0x41) - 4
flag = ''.join(chr(decrypt_byte(b)) for b in encrypted)
print(flag)
복호화 결과
Kuality{76e7876e5a72ee952b306d97160576e5208c5a6799bbf12302281990f3f57734}
결론
이 문제는 XOR와 산술 연산을 활용한 간단한 바이트 암호화 문제로, 리버싱 및 수식 분석을 통해 정적 복호화를 수행할 수 있는 능력을 테스트합니다.