[Tutorial] rev_basic_1

@yd1ng· May 12, 2025 · 1 min read

문제 개요

이 문제는 리버싱 문제로, 바이너리 내부에 존재하는 암호화된 데이터를 디코딩하여 플래그를 복원하는 문제입니다.

분석한 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와 산술 연산을 활용한 간단한 바이트 암호화 문제로, 리버싱 및 수식 분석을 통해 정적 복호화를 수행할 수 있는 능력을 테스트합니다.

@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.