Alter_Ego

@yd1ng· May 27, 2025 · 1 min read

1. 문제 개요

  • 바이너리는 64bit ELF PIE 형태의 공유 객체였습니다.
  • 프로그램 설명 메시지로 “Hello. Find My Alter Ego… zzz”를 출력하며, main()에서 가짜 플래그(잘못된 디코딩)를 만들어 참가자를 혼란시키도록 설계되었습니다.

2. 정적 분석

2.1 함수 목록

$ nm -C prob | grep ' T '
0000000000001169 T a
0000000000001255 T main

2.2 init_array 확인

readelf -a 또는 IDA의 segment 뷰에서 다음 항목을 확인하였습니다.

.init_array:
3DA8 ▶ frame_dummy
3DB0 ▶ a               ; ← 프로그램 시작 전에 자동 호출

이를 통해 a() 함수가 main() 실행 이전에 반드시 실행된다는 사실을 확인했습니다.

3. a() 함수 상세 분석

mov     rax, 0D5D7DCC7C4CFD3E5h
...
mov     [rbp-0x60], rax
...
add     eax, 3
xor     eax, 0xAB
...
cmp     [rbp-0x64], 0x48   ; 72바이트 루프
  • 72바이트 암호화 데이터가 스택(rbp-0x60 이하)에 기록됩니다.
  • 루프에서 (byte + 3) XOR 0xAB 연산을 수행하여 데이터를 덮어씁니다.

4. 복호화 절차

역연산은 다음과 같습니다.

decoded = bytes(((b ^ 0xAB) - 3) & 0xFF for b in encrypted[:72])

Python 스크립트로 실행하면 결과는 아래와 같습니다.

Kuality{5e56e421d2dcabb090c9c1e12c0a9f0707d15a145c037df4f526f52ab0bc9f1c}
  • 72바이트 전체를 복호화해야만 맨 뒤 } 문자가 포함된 완전한 플래그가 나옵니다.

5. 가짜 플래그의 위치

main() 함수도 동일 구조로 80바이트 데이터와 복호화 루프를 가지고 있으나,
연산 순서가 XOR 0xAB-1 로 살짝 다릅니다.

7. 최종 플래그

Kuality{5e56e421d2dcabb090c9c1e12c0a9f0707d15a145c037df4f526f52ab0bc9f1c}

8. 참고자료

  • ELF System V ABI, 64‑bit
  • GNU objdump manual
  • IDA Freeware 8.x 도움말
@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.