
Capstone 기반 디스어셈블러를 사용하여 사용자 정의 그래프 패턴을 정의하고 바이너리 제어 흐름 그래프와 매칭합니다. CLI, Python 바인딩 및 IDA 플러그인을 지원합니다.
grap는 패턴과 바이너리 파일을 입력받아, Casptone 기반 디스어셈블러를 사용하여 바이너리에서 제어 흐름 그래프를 얻은 후, 패턴을 이에 매칭합니다.
패턴은 사용자 정의 그래프로, 명령어 조건("opcode is xor and arg1 is eax")과 반복 조건(3개의 동일한 명령어, 기본 블록 등)으로 구성됩니다.
grap는 디스어셈블러와 Python 바인딩을 갖춘 독립 실행형 도구, 그리고 IDA 및 리버서가 수행한 디스어셈블리를 활용하는 IDA 플러그인으로 사용할 수 있습니다.
지원:




이 문서는 Linux 배포판에서 grap를 빌드하고 설치하는 방법을 설명합니다.
다음 문서도 참조하세요:
컴파일러(build-essential) 외에도 다음 의존성이 설치되어야 합니다:
따라서 Ubuntu/Debian에서는 다음 명령이 작동합니다:
sudo apt-get install build-essential cmake bison flex libboost-regex-dev libboost-system-dev libboost-filesystem-dev libseccomp-dev python3-dev python3-pefile python3-pyelftools python3-capstone swig
해당 패키지는 최신 Ubuntu LTS (18.04.3)에서 테스트되었습니다. 패키지는 배포판에 따라 다를 수 있습니다.
다음 명령으로 프로젝트를 빌드하고 설치합니다:
mkdir build; cd build/ - 전용 디렉토리에서 프로젝트를 빌드하는 것을 권장합니다.cmake ../src/; make - cmake와 make로 빌드합니다.sudo make install - grap를 /usr/local/bin/에 설치합니다.SWIG가 python3을 찾지 못하는 경우 기본 Python 버전이 python2라면, python3을 기본으로 전환하여 해결할 수 있습니다. 예를 들어 Ubuntu에서는:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
다음 명령을 사용하여 도구를 실행할 수 있습니다:
$ grap [options] pattern test_paths
지원되는 옵션의 몇 가지 예는 다음과 같습니다:
grap -h: 지원되는 옵션을 설명합니다.grap가 문자열에서 패턴을 추론하도록 할 수 있습니다. 소수의 옵션만 지원되지만 프로토타이핑에 유용합니다:
grap "opcode is xor and arg1 contains '['" (test.exe): 메모리 쓰기가 있는 xor를 찾습니다.grap -v "sub->xor->sub" (test.exe): -v는 추론된 패턴의 경로를 출력합니다.바이너리 디스어셈블 방법 선택:
grap -od (pattern.grapp) samples/*: samples/ 폴더의 파일을 매칭 시도 없이 디스어셈블합니다.grap -f (pattern.grapp) (test.exe): 바이너리를 강제로 다시 디스어셈블한 후 pattern.grapp와 매칭합니다.grap --raw (pattern.grapp) (test.bin): 원시 파일 디스어셈블 (64비트 바이너리는 --raw-64 사용)출력의 상세 수준 제어:
grap -q -sa (pattern.grapp) (samples/*.grapcfg): 디스어셈블된 파일을 매칭하고, 매칭 및 비매칭 파일을 한 줄에 하나씩 표시합니다.grap -m (pattern.grapp) (test.grapcfg): 모든 매칭된 노드를 표시합니다.디스어셈블된 파일(.grapcfg)이 저장될 위치를 선택하고, 여러 파일을 여러 패턴에 대해 매칭합니다:
grap patterns/basic_block_loop.grapp -o ls.grapcfg /bin/ls: ls를 ls.grapcfg로 디스어셈블하고 기본 블록 루프를 찾습니다.grap (pattern1.grapp) -p (pattern2.grapp) (test.exe): 여러 패턴 파일에 대해 매칭합니다.grap -r -q patterns/ /bin/ -o /tmp/: /bin/의 모든 파일을 /tmp/로 디스어셈블하고 patterns/의 모든 .grapp 패턴과 매칭합니다 (재귀 옵션 -r은 패턴이 아닌 /bin/에 적용됩니다).다음 패턴은 Backspace 샘플에서 발견된 xor 다음 sub로 구성된 복호화 루프를 감지합니다:
digraph decryption_md5_4ee00c46da143ba70f7e6270960823be {
A [cond=true, repeat=3]
B [cond="opcode is xor and arg2 is 0x11"]
C [cond="opcode is sub and arg2 is 0x25"]
D [cond=true, repeat=3]
E [cond="opcode beginswith j and nchildren == 2"]
A -> B
B -> C
C -> D
D -> E
E -> A [childnumber=2]
}
패턴 파일에는 여러 패턴 그래프가 포함될 수 있습니다.
두 디렉토리에서 추가 패턴 예제를 찾을 수 있습니다:
악성코드 샘플에 대해:
Python 바인딩 사용법:
doc/ 폴더에서 더 많은 문서를 찾을 수 있습니다:
패턴 및 테스트 그래프의 구문은 릴리스 섹션의 grap_graphs.pdf 파일에 자세히 설명되어 있습니다.
grap는 MIT 라이선스에 따라 라이선스가 부여됩니다. 전체 라이선스 텍스트는 LICENSE에서 확인할 수 있습니다.