Since recent commercial virtualization-obfuscation software generates and embeds heavy and complicated virtual machines(VMs), summary graphs of execution traces of obfuscated programs can help analyzing and guessing overall structure of the original programs. Most of code optimization techniques are known to work effectively within a single basic block, so a big basic block gives more chance to apply the known optimization techniques. Since control and data dependencies get complicated among more than one basic block, we need to merge basic blocks into a big one as many as possible. Applying previously developed tools to virtualization-obfuscated binaries tends to be inefficient due to opaque predicates generated during the obfuscation process. Based on our observation, we present a method generating simplified execution path graph capable of disclosing branches reflecting control structure of the original program using symbolic execution. Then we show that out approach helps applying existing deobfuscation tools.
최근의 가상화 난독화 기술을 쓰는 상용 난독화 소프트웨어는 크고 복잡한 가상머신을 생성하여 난독화 함에 따라 난독화 이전 프로그램의 구조를 분석하려면 어려움이 따른다. 따라서 난독화 해제 시에 난독화된 프로그램의 축약된 실행경로 그래프를 분석하면 원본 프로그램의 구조를 파악하는 데 큰 도움이 된다. 또한 코드 최적화 기법들은 여러 베이직 블럭 사이에서는 자료 및 제어흐름의 의존성 문제로 인해 대체적으로 하나의 베이직 블럭 안에서만 동작하기 때문에 베이직 블럭들을 최대한 합쳐서 하나로 만들어야 최적화 기법의 적용이 용이하다. 기존에 연구되던 도구들을 최근의 난독화 기법이 적용된 바이너리에 적용했을 때 효과가 상당히 떨어지는 것을 볼 수 있는데, 이는 난독화 과정에서 생겨난 다량의 opaque predicate으로 인한 제어흐름 및 자료흐름의 분석이 힘들어진 것이 가장 큰 원인이라 할 수 있다. 따라서 본 논문에서는 이런 문제를 해결하기 위해 동적 심볼릭 실행을 통해 원본 프로그램의 제어흐름을 반영하는 분기문들이 잘 나타나도록 축약된 실행경로 그래프를 생성하는 방법을 제시하고 이 방법으로 생성한 실행경로 그래프가 가상화 난독화된 바이너리에 기존에 연구된 도구들을 적용하는 데 도움이 됨을 보였다.