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 도움말