Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Virtuailor — IDA Pro에서 C++ 가상 테이블을 자동 생성하는 IDAPython 도구 | Kitploit
도구/GitHubGitHub/0xgalz/virtuailor
Static AnalysisDynamic Analysis (Sandboxing)Reverse EngineeringDebuggersBinary Analysis
GitHub0xgalz/virtuailor

Virtuailor

IDA Pro에서 C++ 가상 테이블을 자동 생성하는 IDAPython 도구

저장소 보기
1.4k13946년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Virtuailor - IDAPython 도구로 C++ vtable 재구성하기

Virtuailor는 인텔 아키텍처(32비트 및 64비트 코드)와 AArch64(신규!)용 C++ 코드의 vtable을 재구성하는 IDAPython 도구입니다. 이 도구는 정적(static) 부분과 동적(dynamic) 부분, 두 부분으로 구성됩니다.

첫 번째는 정적 부분으로, 다음 기능을 포함합니다:

  • 간접 호출(indirect call)을 탐지합니다.
  • 조건부 중단점(conditional breakpoint)을 사용하여 간접 호출의 값 할당을 후킹합니다(후크 코드).

두 번째는 동적 부분으로, 다음 기능을 포함합니다:

  • vtable 구조체를 생성합니다.
  • 함수 및 vtable 주소의 이름을 변경합니다.
  • 어셈블리 간접 호출에 구조체 오프셋을 추가합니다.
  • 간접 호출에서 가상 함수로의 xref를 추가합니다(다중 xref).
  • AArch64의 경우 - 정의되지 않은 vtable 및 관련 가상 함수를 수정하려고 시도합니다(펌웨어 지원).

사용 방법

Virtuailor는 이제 IDA 버전 7.0부터 최신 버전(7.5)까지 지원합니다. IDA 7.4 이전 버전을 사용하는 경우 beforeIDA-7.4 브랜치로 전환해야 하며, master 브랜치는 최신 버전(7.5)을 지원합니다.

  1. 기본적으로 Virtuailor는 코드의 모든 주소에서 가상 호출을 찾습니다. 특정 주소 범위로만 제한하려면 Main 파일을 편집하여 변수 start_addr_range와 end_addr_range에 원하는 범위를 추가하면 됩니다.
root@kitploit:~
if __name__ == '__main__':

    start_addr_range = idc.MinEA()  # 가상 호출 주소 범위를 변경할 수 있습니다
    end_addr_range = idc.MaxEA()
    add_bp_to_virtual_calls(start_addr_range, end_addr_range)
  1. 선택 사항이지만(매우 권장), idb의 스냅샷을 생성하세요. ctrl+shift+t를 누르고 스냅샷을 생성하면 됩니다.

  2. File -> Run script...를 누른 다음 Virtuailor 폴더로 이동하여 Main.py 실행을 선택하세요. 아래 gif에서 더 명확하고 시각적인 설명을 확인할 수 있습니다. 사용 방법

이제 GUI에서 대상 범위를 선택할 수 있는 옵션을 제공합니다. 전체 바이너리를 대상으로 하려면 시작 및 끝 주소에 기본값을 그대로 두고 OK를 누르면 됩니다.

그 후 중단점이 코드에 배치되며, IDA 디버거로 코드를 실행하고 원하는 작업을 수행하면 vtable이 구축되는 과정을 볼 수 있습니다! AArch64의 경우 원격 gdb 서버를 설정하고 IDA 디버거를 사용하여 디버깅할 수 있습니다.

중단점이 더 이상 필요하지 않은 경우 IDA의 중단점 목록 탭으로 이동하여 원하는 대로 중단점을 삭제하면 됩니다.

또한 이 도구는 32비트 및 64비트 지원과 aarch64를 포함하는 두 번째 버전이라는 점을 꼭 말씀드리고 싶습니다. 일부 경우에 소수의 중단점이 누락될 수 있습니다. 이런 경우 이슈를 열어 연락 주시면 코드를 개선하고 수정하는 데 도움이 될 것입니다. 미리 감사드립니다 :)

출력 및 일반 함수

vtable 구조체

Virtuailor가 적중된 가상 호출에 사용된 vtable에서 생성하는 구조체입니다. vtable 함수는 BP opcode에서 사용된 관련 레지스터를 기반으로 메모리에서 추출됩니다.

vtable 예시 IDA의 구조체와 데이터 섹션의 vtable 간의 상관 관계를 만들기 위해, BP는 데이터 섹션의 vtable 주소 이름을 구조체 이름으로 변경합니다. 다음 그림에서 확인할 수 있습니다: vtable 예시

가상 함수 이름도 변경됩니다. 단, 기본 IDA 이름이 아닌 경우(심볼이 있는 함수나 사용자가 변경한 함수)는 함수 이름이 그대로 유지되며, 현재 이름으로 vtable 구조체에 추가됩니다.

선택된 이름은 다음 패턴으로 구성됩니다:

  • vtable_
  • vfunc_ 나머지 이름은 세그먼트 시작 부분으로부터의 오프셋입니다. 이는 대부분의 바이너리가 현재 PIE 및 PIC이고 따라서 ASLR이 적용되어 있기 때문입니다(전체 주소 이름 대신 사용하며, 64비트 환경에서는 주소 이름도 상당히 깁니다). vtable 구조체에는 또한 "Was called from offset: XXXX"라는 주석이 있습니다. 이 오프셋은 세그먼트 시작 부분으로부터의 오프셋입니다.

어셈블리에 구조체 추가

vtable을 생성한 후 Virtuailor는 생성된 구조체와 어셈블리 간의 연결도 추가합니다. 다음 이미지에서 확인할 수 있습니다: 실행 후 BP, 예제 2

참고: BP에서 사용된 구조체 오프셋은 마지막으로 이루어진 호출에만 관련됩니다. 이루어진 모든 가상 호출을 더 잘 이해하기 위해 다음 섹션에서 설명하는 xref 기능이 추가되었습니다.

가상 함수로의 Xref

C++를 정적으로 리버싱할 때 누가 누구를 호출했는지 확인하는 것은 쉽지 않습니다. 대부분의 호출이 간접 호출이기 때문입니다. 그러나 Virtuailor를 실행한 후에는 간접적으로 호출된 모든 함수가 해당 위치에 대한 xref를 갖게 됩니다.

다음 gif는 추가된 Xref와 해당 간접 함수 호출을 보여줍니다:

xref

이전 발표 및 강연

이 도구는 RECon Brussels, Troopers 및 Warcon에서 발표되었습니다. 발표 자료는 다음 링크에서 확인할 수 있습니다: https://www.youtube.com/watch?v=Xk75TM7NmtA

감사의 말

REcon Brussels, Troopers, Warcon 팀, Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce

라이선스

이 플러그인은 GNU GPL v3 라이선스에 따라 라이선스가 부여됩니다.

도구 다운로드