
Native Pcode emulator
이 실험적인 Ghidra 플러그인을 사용하면 네이티브 pcode 에뮬레이션을 쉽게 처리할 수 있습니다. 더 이상 스크립트가 필요하지 않으며 Ghidra에서 직접 사용하면 됩니다. 특히 일반적인 에뮬레이터에서 지원되지 않는 다양한 이국적인 프로세서를 다룰 때 유용할 수 있습니다.
프로세서/VM이 리버스 엔지니어링용으로 Ghidra에서 지원된다면 에뮬레이션할 수 있습니다! 예를 들어, 아래에서 eBPF 명령어 에뮬레이션을 확인할 수 있습니다:

본질적으로 이 플러그인은 ghidra.app.emulator 패키지 내부의 클래스들을 확장한 래퍼입니다. 구현된 기능은 다음과 같습니다:
PCode 에뮬레이션이 이상적으로는 통합을 의미하지만, 대부분의 프로세서는 각자 고유한 접근 방식이 필요합니다. 발생하는 모든 문제를 자유롭게 보고해 주세요. 모든 프로세서를 테스트하고 싶지만 현실적으로 어렵습니다.

모든 플러그인 창을 포함합니다: 스택 뷰, 레지스터, 중단점 뷰, 메인 창.

에뮬레이션 시작 및 종료 설정, 중단점 설정, 변경된 바이트를 에뮬레이터 상태에 적용하는 단축키가 포함되어 있습니다.
원하는 대로 레지스터를 변경하세요. 링크 레지스터(녹색 화살표)를 설정하면 에뮬레이터가 어떤 레지스터에 반환 주소가 있는지 이해하는 데 도움이 됩니다. 이 플러그인은 스택, lr 레지스터, AARCH64 및 MIPS 레지스터를 통해 작동하는 방식을 알고 있습니다. 이국적인 레지스터를 사용한다면 링크 레지스터를 선택하고 버튼을 누르세요.
CodeBrowser에서 프로그램을 열면 GhidraEmu가 스택 공간을 자동으로 매핑합니다. 스택 포인터는 스택 범위의 중간에 설정됩니다. 이를 통해 스택 프레임의 상단이나 하단에 값을 설정할 수 있습니다. 업데이트나 리셋 중 멈춤 현상이 발생하면 스크롤하세요. 에뮬레이션 과정에서 프로그램이 더 많은 스택 공간을 필요로 하면 플러그인이 자동으로 할당합니다.
에뮬레이션 중 바이트가 변경되면 클래식 ByteViewer에서 확인할 수 있습니다. 걱정하지 마세요. "Reset" 버튼을 누르면 원래 값으로 복원됩니다.
변경 사항이 있다면 에뮬레이터에 변경된 바이트를 알려주세요 (스택은 자동으로 업데이트되므로 필요 없습니다). 변경한 후 해당 바이트를 선택하고(녹색으로 표시됨) 이 옵션을 누르거나(또는 "M" 단축키 사용) 적용하세요.

여기에 플러그인이 출력 정보를 표시합니다. 예를 들어, 다음과 같은 에뮬레이션 오류 메시지가 표시됩니다:

"Jump Over" 기능을 사용하면 어떤 이유로든 현재 명령어를 에뮬레이션하고 싶지 않을 때 한 명령어 앞으로 건너뛸 수 있습니다. 초기화되지 않은 메모리를 읽으려는 시도가 감지되면 에뮬레이션 프로세스가 중단되므로, 이 기능을 사용하면 그 문제를 우회할 수 있습니다. 예를 하나 보겠습니다. 많은 x86_64 프로그램의 첫 번째 명령어 중 하나인 카나리아 스택 저장입니다:
MOV RAX, qword ptr FS:[0x28]
PC 값을 증가시켜 이 명령어를 살짝 건너뛰는 방법을 시도해 보겠습니다. 이렇게 하려면 에뮬레이션하고 싶지 않은 명령어에서 멈춘 다음 J 단축키를 누르세요. 그렇지 않으면 계속 스테핑할 때 초기화되지 않은 메모리 읽기 오류가 발생합니다.

서브루틴(내부 호출)으로 이어지는 명령어에서 멈췄고 다음 명령어까지 모든 것을 에뮬레이션하려는 경우(클래식 "step over"), F6 단축키를 누르면 확실히 실행됩니다:

고려해야 할 몇 가지 중요한 사항:
gradle을 사용하여 확장 프로그램을 빌드하세요: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle 그런 다음 Ghidra를 사용하여 설치하세요: File → Install Extensions...
CodeBrowser에서 File → Configure → Miscellaneous로 이동하여 GhidraEmu 플러그인 확인란을 선택하세요.
플러그인을 사용하면서 버그를 발견했거나 개선 아이디어가 있으신가요? 주저하지 말고 새 이슈를 열어 주세요. 확인해 보겠습니다.
EmulatorHelper 제한으로 인해 프로그램 공간을 다른 공간에서 사용할 수 없습니다. 예를 들어 외부 공유 라이브러리는 프로그램 메모리 공간에 대해 알 수 없으며 그 반대의 경우도 마찬가지입니다. 따라서 하나의 메모리 공간을 가진 하나의 프로세스로 에뮬레이션할 수 없습니다. 제가 놓치고 있는 부분이 있다면 알려주세요.