업데이트로 돌아가기
New releaseAug 20, 2026

rhabdomancer v0.10.0

이진 파일에서 잠재적으로 안전하지 않은 API 함수 호출을 찾아내는 취약점 연구 보조 도구.

공유

rhabdomancer

build doc

"익스플로잇 가능한 버그로 가는 길은 익스플로잇 불가능한 버그로 포장되어 있다."

-- Mark Dowd

Rhabdomancer는 바이너리 파일에서 잠재적으로 안전하지 않은 API 함수 호출을 찾아내는 매우 빠른 IDA 헤드리스 플러그인입니다. 감사자는 이러한 후보 지점에서 역추적하여 신뢰할 수 없는 입력에 접근할 수 있는 경로를 찾을 수 있습니다.

기능

  • IDA 9.x와 idalib-rs Rust 바인딩 덕분에 매우 빠른 헤드리스 사용자 경험을 제공합니다.
  • IDA가 구현하는 모든 아키텍처용으로 컴파일된 C/C++ 바이너리 타깃을 지원합니다.
  • 잘못된 API 함수 호출 위치가 stdout에 출력되고 IDB에 표시됩니다.
    • IDA가 인식하는 라이브러리 코드(예: FLIRT 시그니처로 매칭된 정적 링크 런타임)의 호출 위치는 (lib)로 표시됩니다.
    • 스텁을 통한 호출(예: ELF 바이너리의 .plt 항목 또는 PE 및 Mach-O 바이너리의 임포트 스텁, thunk로 나열됨)은 호출자까지 역추적됩니다.
    • ELF 바이너리에서 함수는 동일한 호출 위치와 함께 의도적으로 두 번 나열됩니다: 한 번은 .plt 스텁 (thunk로 표시됨)으로, 한 번은 임포트로 나열됩니다. 각 호출 위치는 IDB에 한 번만 표시됩니다.
  • 알려진 잘못된 API 함수는 심각도 등급으로 그룹화되어 감사 작업의 우선순위를 정하는 데 도움을 줍니다.
    • [BAD 0] 높은 우선순위 - 일반적으로 안전하지 않다고 간주되는 함수.
    • [BAD 1] 중간 우선순위 - 안전하지 않은 사용 사례를 확인해야 하는 흥미로운 함수.
    • [BAD 2] 낮은 우선순위 - 이 함수와 관련된 코드 경로를 주의 깊게 확인해야 함.
  • 알려진 잘못된 API 함수 목록은 내장되어 있으며 conf/rhabdomancer.toml을 기반으로 한 구성 파일로 쉽게 사용자 정의할 수 있습니다.
  • 함수 이름은 다음 장식 없이 매칭됩니다: 선행 점과 밑줄(예: _strcpy), 라이브러리 별칭의 접두사 (예: Universal CRT의 __o_malloc, glibc의 __libc_system 및 __GI___snprintf), 그리고 스텁 및 그러한 별칭에 한해 IDA가 이미 사용 중인 이름에 추가하는 숫자 접미사(예: memset_0).

[!NOTE] 강화된 함수(예: _FORTIFY_SOURCE로 빌드할 때 strcpy 대신 사용되는 __strcpy_chk)는 나열된 함수의 검사된 변형이므로 의도적으로 매칭되지 않습니다. 해당 호출도 표시하려면 사용자 정의 구성에 명시적으로 추가하십시오(예: strcpy와 동일한 우선순위로 "__strcpy_chk").

기사

참고 항목

설치

최신 릴리스를 얻는 가장 쉬운 방법은 crates.io를 이용하는 것입니다:

  1. IDA를 다운로드, 설치 및 구성합니다(https://hex-rays.com/ida-pro 참조).
  2. LLVM/Clang을 설치합니다(https://rust-lang.github.io/rust-bindgen/requirements.html 참조).
  3. Linux/macOS에서는 다음과 같이 설치합니다:
    export IDADIR=/path/to/ida # if not set, the build script will check common locations
    cargo install rhabdomancer --locked
    
    Windows에서는 대신 다음 명령을 사용하세요:
    $env:LIBCLANG_PATH="\path\to\clang+llvm\bin"
    $env:PATH="\path\to\ida;$env:PATH"
    $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations
    cargo install rhabdomancer --locked
    

컴파일

또는 소스에서 빌드할 수 있습니다:

  1. IDA를 다운로드, 설치 및 구성합니다(https://hex-rays.com/ida-pro 참조).
  2. LLVM/Clang을 설치합니다(https://rust-lang.github.io/rust-bindgen/requirements.html 참조).
  3. Linux/macOS에서는 다음과 같이 컴파일합니다:
    git clone --depth 1 https://github.com/0xdea/rhabdomancer
    cd rhabdomancer
    export IDADIR=/path/to/ida # if not set, the build script will check common locations
    cargo build --release --locked
    
    Windows에서는 대신 다음 명령을 사용하세요:
    git clone --depth 1 https://github.com/0xdea/rhabdomancer
    cd rhabdomancer
    $env:LIBCLANG_PATH="\path\to\clang+llvm\bin"
    $env:PATH="\path\to\ida;$env:PATH"
    $env:IDADIR="\path\to\ida" # if not set, the build script will check common locations
    cargo build --release --locked
    

사용법

  1. IDA가 유효한 라이선스로 올바르게 구성되어 있는지 확인하세요.
  2. 선택적으로 알려진 악성 API 함수 목록을 사용자 지정할 수 있습니다: conf/rhabdomancer.toml을 복사하고(정확한 내장 목록을 위해 설치된 버전과 일치하는 태그를 선택하세요), 복사본을 편집한 뒤, RHABDOMANCER_CONFIG 환경 변수를 해당 경로로 설정하세요. 파일은 high, medium, low 배열을 정의해야 하며, 다른 키는 없어야 합니다. 그렇지 않으면 빌드 시점에 conf/rhabdomancer.toml에서 바이너리에 내장된 내장 목록이 사용됩니다 (해당 파일을 편집하려면 재빌드가 필요합니다).
  3. IDA 설치가 비표준 위치에 있는 경우 IDADIR 환경 변수가 설정되어 있는지 확인하세요.
  4. 다음과 같이 실행하세요:
    rhabdomancer <binary_file>
    
    기존 .i64 IDB 파일이 있으면 업데이트됩니다. 그렇지 않으면 새 IDB 파일이 생성됩니다.
  5. 생성된 .i64 IDB 파일을 IDA로 엽니다.
  6. View > Open subviews > Bookmarks를 선택합니다.
  7. 결과가 IDA 창에 편리하게 모여 있는 것을 즐기세요.

[!NOTE] Rhabdomancer는 표시된 호출 위치에 주석도 추가합니다. 북마크와 주석 모두 [BAD n] <function_name> 형식으로 태그되며, 여기서 n은 우선순위 등급(0 = 높음, 1 = 중간, 2 = 낮음)이므로 스크립트가 IDB에서 이를 검색할 수 있습니다. 이 형식은 릴리스 간에 안정적입니다.

호환성

공식적으로는 최신 IDA 릴리스만 지원되지만, 이전 버전에서도 작동할 수 있습니다. 다음 표는 각 IDA 버전에 대한 최신 호환 릴리스를 요약한 것입니다:

IDA 버전최신 호환 릴리스
v9.0.240925v0.2.4
v9.0.241217v0.3.5
v9.1.250226v0.6.2
v9.2.250908v0.7.6
v9.3.260213v0.8.1
v9.3.260327v0.9.0
v9.3.260421v0.9.3
v9.4.260714현재 릴리스
v9.4.260915현재 릴리스

[!NOTE] 추가 정보는 idalib-rs 문서를 확인하세요.

크레딧

이 프로젝트의 개발은 다음 조직들의 지원을 받았습니다:

변경 로그

TODO

  • 알려진 악성 API 함수 목록을 더욱 풍부하게 합니다(https://github.com/0xdea/semgrep-rules 참조).
  • .plt 세그먼트 외부의 thunk를 통한 호출을 추적합니다(예: MSVC 증분 링크 j_ thunk).
  • IDA가 인식한 라이브러리 코드에서 호출 위치 표시를 건너뛰는 것을 고려합니다(현재는 (lib)로만 표시됨).
  • 자동화된 파싱 및 분석을 용이하게 하기 위해 직렬화된 출력을 구현합니다.
  • VulFi 및 VulnFanatic 스타일의 기본 규칙 세트를 구현합니다.

카테고리