이 실험적인 Ghidra 플러그인을 사용하면 기본 pcode 에뮬레이션을 쉽게 처리할 수 있습니다. 더 이상 스크립트가 필요하지 않습니다. Ghidra에서 직접 사용하세요. 일반적인 에뮬레이터에서 지원하지 않는 다양한 이국적인 프로세서로 작업하는 데 특히 유용할 수 있습니다.
리버스 엔지니어링을 위해 Ghidra에서 프로세서/VM을 지원하는 경우 에뮬레이트할 수 있습니다! 예를 들어 eBPF 명령어 에뮬레이션은 아래와 같습니다.
본질적으로 플러그인은 ghidra.app.emulator
패키지 내부 클래스를 둘러싼 확장 래퍼입니다. 구현된 내용은 다음과 같습니다.
PCode 에뮬레이션은 이상적으로 통합을 의미하지만 대부분의 프로세서에는 고유한 접근 방식이 필요합니다. 발생한 문제를 언제든지 보고해 주세요. 모든 프로세서를 테스트하고 싶지만 거의 불가능합니다.
스택 보기, 레지스터, 중단점 보기 및 기본 창 등 모든 플러그인 창을 포함합니다.
에뮬레이션의 시작과 끝, 중단점을 설정하고 변경된 바이트를 에뮬레이터 상태에 적용하기 위한 단축키가 포함되어 있습니다.
원하는대로 레지스터를 변경하십시오. 링크 레지스터(녹색 화살표)를 설정하면 에뮬레이터가 반환 주소가 포함된 레지스터를 이해하는 데 도움이 됩니다. 플러그인은 스택, lr 레지스터, AARCH64 및 MIPS 레지스터를 통해 작동하는 방식을 알고 있습니다. 이국적인 것이 있다면 링크 레지스터를 선택하고 버튼을 누르십시오.
СodeBrowser GhidraEmu에서 프로그램을 열면 스택 공간이 자동으로 매핑됩니다. 스택 포인터는 스택 범위의 중간에 설정됩니다. 이를 통해 스택 프레임의 상단 또는 하단에 값을 설정할 수 있습니다. 업데이트 또는 재설정 시 멈춤 현상이 발생하면 스크롤하세요. 에뮬레이션 프로세스 중에 프로그램에 스택을 위한 더 많은 공간이 필요한 경우 플러그인이 자동으로 이를 할당합니다.
에뮬레이션 중에 바이트가 변경되면 클래식 ByteViewer에서 해당 내용을 볼 수 있습니다. 걱정하지 마십시오. "재설정" 버튼을 누르면 원래 값으로 재설정됩니다.
변경한 경우 에뮬레이터에 변경된 바이트에 대해 알립니다(스택 업데이트는 자동으로 이루어지며 그럴 필요가 없습니다). 변경한 후 해당 항목을 선택하고(녹색으로 표시됨) 이 옵션을 누르십시오(또는 단축키 "M" 사용).
여기 플러그인은 출력 정보를 인쇄합니다. 예를 들어 다음과 같은 에뮬레이션 오류 메시지가 있습니다.
"Jump Over" 기능을 사용하면 어떤 이유로 현재 명령을 에뮬레이션하고 싶지 않은 경우 한 명령 앞으로 건너뛸 수 있습니다. 초기화되지 않은 메모리를 읽으려는 시도가 감지되면 에뮬레이션 프로세스가 중단되므로 이 기능을 사용하면 이를 우회할 수 있습니다. 예를 보세요. 다음은 많은 x86_64 프로그램의 첫 번째 지침 중 하나인 카나리아 스택 저장입니다.
MOV RAX, qword ptr FS:[0x28]
그냥 조금 치트를 해서 PC의 가치를 높여서 뛰어넘어보도록 하겠습니다. 이렇게 하려면 에뮬레이트하고 싶지 않은 명령에서 멈추고 J
단축키를 누르세요. 그렇지 않으면 한 단계 더 진행하면 초기화되지 않은 메모리 읽기 오류가 발생합니다.
서브루틴(내부 호출)으로 이어지는 명령에서 멈추고 다음 명령(전통적인 "스텝 오버")까지의 모든 것을 에뮬레이션하려는 경우 F6
단축키를 누르면 다음과 같은 일이 확실히 발생합니다.
고려해야 할 몇 가지 중요한 사항은 다음과 같습니다 .
Gradle을 사용하여 확장 기능을 빌드하고: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
사용하여 이를 설치합니다: File → Install Extensions...
CodeBrowser에서 File → Configure → Miscellaneous
로 이동하여 GhidraEmu 플러그인 확인란을 선택합니다.
플러그인을 사용하는 동안 버그가 발생했거나 개선 아이디어가 있습니까? 부끄러워하지 말고 새로운 호를 열어보세요. 제가 알아내겠습니다.
EmulatorHelper 제한은 다른 프로그램 공간을 사용하는 것을 허용하지 않습니다. 따라서 예를 들어 외부 공유 라이브러리는 프로그램 메모리 공간을 전혀 알 수 없으며 그 반대의 경우도 마찬가지입니다. 따라서 하나의 메모리 공간을 가진 하나의 프로세스로 에뮬레이트할 수 없습니다. 여기에 뭔가 빠진 것이 있으면 알려주세요.