
난독화된 코드 및 기타 흥미로운 코드 구조를 식별하는 Binary Ninja 플러그인
저자: Tim Blazytko
자동으로 난독화된 코드 및 기타 흥미로운 코드 구조를 탐지합니다
_난독화 탐지(Obfuscation Detection)_는 바이너리에서 난독화된 코드와 흥미로운 코드 구조(예: 상태 머신)를 탐지하는 Binary Ninja 플러그인입니다. 바이너리가 주어지면 이 플러그인은 리버스 엔지니어링 중에 더 자세히 살펴볼 가치가 있는 코드 위치를 식별하여 분석을 용이하게 합니다.
다양한 휴리스틱을 기반으로 이 플러그인은 복잡하거나 일반적이지 않은 코드 구조를 포함하는 함수를 식별합니다. 이러한 코드 구조는 다음을 구현할 수 있습니다.
다음 블로그 게시물은 기본 휴리스틱에 대한 자세한 정보를 제공하고 사용 사례를 보여줍니다.
몇 가지 예제 사용 사례는 examples에서 찾을 수 있습니다. 또한 REcon 강연 "바이너리에서 코드 탐지 전략을 사용하여 비밀 밝히기"는 몇 가지 사용 사례를 보여줍니다. 슬라이드는 여기에서 찾을 수 있으며, 녹화 영상은 여기에서 찾을 수 있습니다.
이 도구는 Binary Ninja의 플러그인 관리자를 사용하여 설치할 수 있습니다.
헤드리스 버전의 경우 다음 단계를 따르세요:
git clone https://github.com/mrphrazer/obfuscation_detection.git
cd obfuscation_detection
# install obfuscation_detection
pip install .
플러그인은 사용자 인터페이스와 헤드리스 모드에서 사용할 수 있습니다.
개별 휴리스틱을 실행하려면 Plugins -> Obfuscation Detection을 선택하고, 개별 유틸리티 탐지를 실행하려면 Plugins -> Obfuscation Detection -> Utils를 선택하세요. Plugins -> Obfuscation Detection -> All 명령은 모든 휴리스틱과 모든 유틸리티를 함께 실행합니다.
결과는 로그 창에 표시됩니다:
식별된 함수 주소를 클릭하면 Binary Ninja가 선택한 함수로 이동합니다.
헤드리스 모드에서 플러그인을 사용하려면 scripts/detect_obfuscation.py를 실행하세요:
$ python3 scripts/detect_obfuscation.py <binary>
이 명령은 모든 휴리스틱과 모든 유틸리티를 실행합니다. 기계가 읽을 수 있는 출력을 원하면 --json을 전달하세요:
$ python3 scripts/detect_obfuscation.py --json <binary>
JSON 페이로드는 detections 키 아래에 모든 결과를 포함합니다. 각 탐지에는 자동화를 위한 안정적인 id와 사람이 읽을 수 있는 name이 있습니다. 각 태그된 함수 발견에는 Binary Ninja 플러그인에서 사용되는 태그 유형과 설명이 포함됩니다.
헤드리스 모드에서 상태 머신 휴리스틱만 실행하려면 scripts/detect_state_machine.py를 사용하세요:
$ python3 scripts/detect_state_machine.py [--json] <binary>
플러그인은 다양한 코드 구조를 탐지하기 위해 여러 탐지 휴리스틱을 구현합니다. 다음에서는 각 휴리스틱을 간략히 설명하고 사용법을 설명합니다.
큰 기본 블록 휴리스틱은 기본 블록당 평균 명령어 수가 가장 많은 상위 10%의 함수를 식별합니다. 이를 통해 다음을 탐지할 수 있습니다.
복잡한 함수 휴리스틱은 가장 복잡한 제어 흐름 그래프(순환 복잡성 기준)를 가진 상위 10%의 함수를 식별합니다. 이를 통해 다음을 식별할 수 있습니다.
상태 머신 휴리스틱은 그래프 이론 속성을 사용하여 상태 머신을 구현하는 함수를 식별합니다. 일반적으로 이러한 상태 머신은 루프에서 디스패치되는 switch 문으로 표현될 수 있습니다. 이 휴리스틱은 다음을 식별할 수 있습니다.
비일반 명령어 시퀀스 휴리스틱은 통계 분석을 수행하여 코드 패턴이 사전 계산된 기준과 차이가 있는 상위 10%의 함수를 식별합니다. 이 방식을 통해 휴리스틱은 다음을 식별할 수 있습니다.
중첩 명령어 휴리스틱은 정렬되지 않은 명령어(명령어 바이트가 두 개의 다른 명령어에 의해 공유됨)가 있는 함수를 식별합니다. 이 휴리스틱은 다음을 식별합니다.
휴리스틱이 Binary Ninja의 사용자 인터페이스에서 사용되는 경우, 중첩 명령어는 그래프 뷰에서도 강조 표시됩니다.
가장 많이 호출된 함수 휴리스틱은 서로 다른 함수로부터 가장 많은 호출을 받은 상위 10%의 함수를 식별합니다. 이 방식을 통해 휴리스틱은 다음을 식별할 수 있습니다.
이 휴리스틱은 루프 수가 많은 함수를 식별합니다. 이러한 종류의 함수는 다음을 구현할 수 있습니다.
이 휴리스틱은 잠재적인 성능 병목 현상을 찾는 데도 도움이 됩니다.
이 휴리스틱은 일반적으로 다음을 암시하는 드물고 복잡한 루프 구조를 가진 함수를 식별합니다.
이 휴리스틱은 루프 내에서 상수로 XOR 연산을 수행하는 함수를 식별합니다. 이 방식을 통해 휴리스틱은 다음을 식별할 수 있습니다.
이 휴리스틱은 표현식에 둘 이상의 산술 연산과 하나의 부울 연산이 동시에 있는 함수를 식별합니다. 이 방식을 통해 휴리스틱은 다음을 식별할 수 있습니다.
이 휴리스틱은 반복적인 컨텍스트 해싱 접근 방식을 사용하여 각 함수의 제어 흐름 그래프 내에서 반복되는 다중 블록 구조를 탐지합니다. 각 블록의 opcode 시그니처와 해당 후속 블록의 시그니처를 비교하여 단일 함수에서 중복되거나 거의 중복된 서브그래프를 식별합니다. 이를 통해 다음을 찾는 데 도움이 됩니다.
또한 플러그인은 흥미로운 함수 및 코드 영역에 대한 더 좁은 유틸리티를 포함합니다. 이러한 유틸리티는 Utils 하위 메뉴에서 계속 사용할 수 있으며, All 명령은 더 넓은 휴리스틱과 함께 실행됩니다.
이 도우미는 알려진 호출자가 없는 함수를 식별합니다. 이러한 함수는 다음과 같을 수 있습니다.
이 도우미는 다른 함수를 호출하지 않는 함수를 식별합니다. 이러한 종류의 함수는 예를 들어 다음과 같은 함수일 수 있습니다.
이 도우미는 재귀 함수(직접 또는 간접적으로 자신을 호출하는 함수)를 식별합니다. 재귀 함수는 다음을 나타낼 수 있습니다.
이 도우미는 각 섹션의 엔트로피를 평가합니다. 엔트로피는 0에서 8 사이의 값을 갖는 무작위성의 통계적 측정값입니다. 엔트로피가 8에 가까운 섹션은 높은 수준의 무작위성을 나타내며 다음을 암시할 수 있습니다.
이 도우미는 일반적으로 RC4의 키 스케줄링 알고리즘(KSA) 및 의사 난수 생성 알고리즘(PRGA)과 관련된 휴리스틱 마커를 사용하여 잠재적인 RC4 알고리즘 구현을 탐지합니다. RC4는 다음과 같은 목적으로 맬웨어에서 널리 사용됩니다.
자세한 내용은 @mr_phrazer에게 문의하세요.