
IDA Pro에서 C++ 가상 테이블을 자동 생성하는 IDAPython 도구
Virtuailor는 인텔 아키텍처(32비트 및 64비트 코드)와 AArch64(신규!)용 C++ 코드의 vtable을 재구성하는 IDAPython 도구입니다. 이 도구는 정적(static) 부분과 동적(dynamic) 부분, 두 부분으로 구성됩니다.
첫 번째는 정적 부분으로, 다음 기능을 포함합니다:
두 번째는 동적 부분으로, 다음 기능을 포함합니다:
Virtuailor는 이제 IDA 버전 7.0부터 최신 버전(7.5)까지 지원합니다. IDA 7.4 이전 버전을 사용하는 경우 beforeIDA-7.4 브랜치로 전환해야 하며, master 브랜치는 최신 버전(7.5)을 지원합니다.
if __name__ == '__main__':
start_addr_range = idc.MinEA() # 가상 호출 주소 범위를 변경할 수 있습니다
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
선택 사항이지만(매우 권장), idb의 스냅샷을 생성하세요. ctrl+shift+t를 누르고 스냅샷을 생성하면 됩니다.
File -> Run script...를 누른 다음 Virtuailor 폴더로 이동하여 Main.py 실행을 선택하세요. 아래 gif에서 더 명확하고 시각적인 설명을 확인할 수 있습니다.

이제 GUI에서 대상 범위를 선택할 수 있는 옵션을 제공합니다. 전체 바이너리를 대상으로 하려면 시작 및 끝 주소에 기본값을 그대로 두고 OK를 누르면 됩니다.
그 후 중단점이 코드에 배치되며, IDA 디버거로 코드를 실행하고 원하는 작업을 수행하면 vtable이 구축되는 과정을 볼 수 있습니다! AArch64의 경우 원격 gdb 서버를 설정하고 IDA 디버거를 사용하여 디버깅할 수 있습니다.
중단점이 더 이상 필요하지 않은 경우 IDA의 중단점 목록 탭으로 이동하여 원하는 대로 중단점을 삭제하면 됩니다.
또한 이 도구는 32비트 및 64비트 지원과 aarch64를 포함하는 두 번째 버전이라는 점을 꼭 말씀드리고 싶습니다. 일부 경우에 소수의 중단점이 누락될 수 있습니다. 이런 경우 이슈를 열어 연락 주시면 코드를 개선하고 수정하는 데 도움이 될 것입니다. 미리 감사드립니다 :)
Virtuailor가 적중된 가상 호출에 사용된 vtable에서 생성하는 구조체입니다. vtable 함수는 BP opcode에서 사용된 관련 레지스터를 기반으로 메모리에서 추출됩니다.
IDA의 구조체와 데이터 섹션의 vtable 간의 상관 관계를 만들기 위해, BP는 데이터 섹션의 vtable 주소 이름을 구조체 이름으로 변경합니다. 다음 그림에서 확인할 수 있습니다:

가상 함수 이름도 변경됩니다. 단, 기본 IDA 이름이 아닌 경우(심볼이 있는 함수나 사용자가 변경한 함수)는 함수 이름이 그대로 유지되며, 현재 이름으로 vtable 구조체에 추가됩니다.
선택된 이름은 다음 패턴으로 구성됩니다:
vtable을 생성한 후 Virtuailor는 생성된 구조체와 어셈블리 간의 연결도 추가합니다. 다음 이미지에서 확인할 수 있습니다:

참고: BP에서 사용된 구조체 오프셋은 마지막으로 이루어진 호출에만 관련됩니다. 이루어진 모든 가상 호출을 더 잘 이해하기 위해 다음 섹션에서 설명하는 xref 기능이 추가되었습니다.
C++를 정적으로 리버싱할 때 누가 누구를 호출했는지 확인하는 것은 쉽지 않습니다. 대부분의 호출이 간접 호출이기 때문입니다. 그러나 Virtuailor를 실행한 후에는 간접적으로 호출된 모든 함수가 해당 위치에 대한 xref를 갖게 됩니다.
다음 gif는 추가된 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 라이선스에 따라 라이선스가 부여됩니다.