
난독화된 코드를 분석하고 단순화하기 위한 Binary Ninja 플러그인
작성자: Tim Blazytko & Nicolò Altamura
난독화된 코드를 분석하고 단순화합니다
난독화 분석 은 강력하게 보호된 바이너리를 다룰 때의 어려움을 덜어주는 Binary Ninja 플러그인입니다. 다음과 같은 몇 가지 집중적인 도우미 기능을 제공합니다.
몇 가지 사용 예시는 examples에서 확인할 수 있습니다. 또한 REcon 발표 "Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications"에서 몇 가지 사용 사례를 보여줍니다. 슬라이드는 여기에서 확인할 수 있습니다. 이 플러그인은 Obfuscation Detection을 보완합니다: 의심스러운 함수가 표시되면 난독화 분석 이 해당 함수를 정리하고 이해하는 데 도움을 줍니다. 더 많은 도우미 기능이 시간이 지남에 따라 추가될 예정입니다.
이 도구는 Binary Ninja의 플러그인 관리자를 사용하여 설치할 수 있습니다.
수동 설치의 경우 Binary Ninja의 플러그인 폴더에서 다음 단계를 따르세요:
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
가상 환경을 사용하는 경우 Binary Ninja 설정에서 site-packages 경로를 수동으로 설정해야 합니다.
이 플러그인은 Binary Ninja의 상단 바 메뉴에서 Plugins -> Obfuscation Analysis 아래에서 사용할 수 있습니다.
산술 난독화를 단순화하려면 먼저 디컴파일러 뷰에서 단순화하려는 HLIL 표현식을 선택하세요. 그런 다음 Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify를 선택합니다. 플러그인은 전체 계산을 해석하고, msynth를 통해 실행한 후, 단순화된 결과를 같은 줄에 주석으로 삽입합니다. 아래 짧은 애니메이션은 전체 워크플로를 보여줍니다:
MBA 단순화는 msynth에 의존합니다. 기본적으로 플러그인은 플러그인과 함께 제공되고 미리 구성된 msynth의 기본 단순화 오라클을 사용합니다. 더 크거나 사용자 정의된 오라클을 사용하려면 obfuscation_analysis.mba_oracle_path를 수동으로 설정하거나 Binary Ninja의 Settings 창에서 파일을 찾아보세요.
문제가 발생하면 플러그인은 Log 창에 간결한 사용자 수준 메시지를 기록합니다. 전체 추적 기록을 보려면 로그 뷰를 Debug로 전환하세요.
이 플러그인은 보호된 바이너리를 리버싱할 때 흔히 마주치는 장애물을 해결하는 집중적인 도우미 기능을 제공하며, 각각 UI 또는 헤드리스 스크립트에서 백그라운드 작업으로 실행할 수 있습니다. 아래는 현재 사용 가능한 기능들입니다.
손상된 함수는 디스어셈블리가 정의되지 않은 인공물—빈 기본 블록, 유효하지 않거나 겹치는 명령어 등—을 보여주는 함수입니다. 이 도우미는 전체 BinaryView를 순회하며 이러한 증상을 가진 함수를 표시하고, 분석가가 잘못 파싱되었거나 의도적으로 난독화된 코드를 빠르게 검사할 수 있도록 목록을 작성합니다. 선택적 제거 작업은 표시된 모든 함수를 삭제하고 새 분석을 강제하여 함수 목록을 정리합니다. 이는 특히 다음을 찾는 데 유용합니다.
Mixed-Boolean Arithmetic (MBA)은 단순한 계산을 긴 산술 및 불리언 연산 체인에 묻어버리는 난독화 기법입니다. 이 기능은 디컴파일러에서 이러한 표현식을 단순화합니다. HLIL 명령어를 선택하면 플러그인은 현재 기본 블록으로 제한된 SSA 역방향 슬라이스로 전체 계산 체인을 수집하고, 해당 슬라이스를 Miasm IR로 변환하여 msynth에 입력한 후, 최종적으로 단순화된 결과를 디컴파일러 뷰에 주석으로 추가합니다. 이 기능을 사용하면 다음이 가능합니다.
현재 선택된 함수에 대해 이 도우미는 디컴파일러 뷰 내의 모든 피호출자를 재귀적으로 인라인하여 Binary Ninja에 단일하고 자체 완결적인 IL을 제공합니다. 모든 경계가 사라지면 디컴파일러는 함수 간에 데이터를 전파할 수 있어 더 깊은 상수 폴딩, 데드 코드 제거, 그리고 일반적으로 더 명확한 로직이 가능해집니다. 다음과 같은 경우에 사용하세요.
HLIL은 매우 큰 함수나 깊은 호출 트리에서 매우 거대해지고 렌더링이 느려질 수 있습니다. 또한 모든 것이 단일 단위로 병합되면 일부 디컴파일러 최적화가 덜 효과적일 수 있습니다. 이를 제어하려면 인라인 깊이를 제한할 수 있습니다: Settings -> Obfuscation Analysis -> Max Function Inlining Depth를 상한 N으로 설정합니다 (기본값은 1). 깊이 제한이 있으면 처음 N개의 호출 레벨만 인라인되고, 더 깊은 호출은 인라인되지 않습니다.
이 플러그인에는 알아두어야 할 몇 가지 주의 사항이 있으며, 대부분 MBA 단순화 파이프라인과 관련이 있습니다:
Binary Ninja 버그: BN 5.0 stable에서 누락된 HLIL 타입 캐스트로 인해 역방향 슬라이싱 단계가 실패할 수 있습니다: https://github.com/Vector35/binaryninja-api/issues/6371; 이 문제는 5.1.7477-de 및 이후 버전에서 수정되었습니다
슬라이스가 하나의 기본 블록으로 제한됨: 선행 블록에 위치한 변수 정의는 무시됩니다 (종종 제어 흐름에 의존적), 따라서 일부 MBA 항은 부분적으로만 해석될 수 있습니다
HLIL에서 Miasm IR로의 변환 격차: 모든 HLIL 구성 요소에 건전한 Miasm 등가물이 있는 것은 아닙니다. 변환이 실패하면 표현식은 건너뛰고 오류가 기록됩니다
IL 커버리지: 제어 흐름 노드와 부동 소수점 연산은 현재 변환되지 않습니다
msynth 제약 상속: MBA 단순화는 모든 msynth 제한 사항을 상속합니다
더 많은 정보는 Tim Blazytko (@mr_phrazer) 또는 Nicolò Altamura (@nicolodev)에게 문의하세요.