[Rev] 리버싱 · 작성: 2026-07-20 03:10:34 · 수정: 2026-07-20 03:11:15 · 조회 5
안티 디버깅·패킹 글에서 실행을 방해하는 기법들을 다뤘는데, 코드 자체를 읽기 어렵게 비트는 난독화(Obfuscation)는 또 다른 층위의 방해 기법이다. 그중 가장 흔하고 강력한 게 Control Flow Flattening(제어 흐름 평탄화)이다.
정상 코드는 if/else, 반복문이 자연스러운 트리·그래프 구조로 이어진다. 평탄화된 코드는 이 구조를 다 부수고, 모든 블록을 하나의 거대한 switch문 케이스들로 흩어놓은 뒤, 다음에 실행할 케이스 번호를 담은 변수 하나(state variable)로 흐름을 제어한다.
// 원본
if (a > 0) { foo(); } else { bar(); }
baz();
// 평탄화 후 (개념적 예시)
int state = 0;
while (1) {
switch (state) {
case 0: state = (a > 0) ? 1 : 2; break;
case 1: foo(); state = 3; break;
case 2: bar(); state = 3; break;
case 3: baz(); return;
}
}
디스어셈블리 상에서는 분기가 전부 이 switch문 하나로 수렴해버리기 때문에, 그래프 뷰(IDA/Ghidra의 CFG)가 원래 로직과 전혀 다른 스파게티 모양이 되어버린다. LLVM 기반의 OLLVM(Obfuscator-LLVM) 같은 도구가 이 기법을 컴파일 단계에서 자동 적용해준다.