2013-07-02 3 views
2

x86 용 비공개 보호 모드 용으로 생성 된 것으로 보이는 프로그램 (주로 코드) (~ 30KB)을 현재 리버스 엔지니어링하려고합니다. 그것은 물리적 메모리에 직접 (또는 메모리 맵핑 된 장치가 더 정확하게 레지스터)에 액세스 지침, 예를 들어 있습니다 : 나는 에서 QEMU을 상기 프로그램을 실행하고 이상적으로 그것을 통해 단계 수 있도록하고 싶습니다 실행중인 코드가 x86 비공개 보호 모드 용으로 빌드되었습니다.

mov esi, 0FED400000h ; Some device base address 
mov eax, [esi+18h] ; Memory mapped status register of said device 

디버거 (예 : gdb).

이제 문제는 코드에서 인코딩 된 절대 메모리 주소가 페이징이 활성화 된 모든 운영 체제에서 세그먼트 오류가 발생한다는 것입니다.

나는이 문제를 우회 할 수있는 방법으로 생각을 해 봤는데 :

  • 지도 물리적 메모리를 사용자 공간으로는/dev/MEM에서의 mmap를 사용하여 사용자 공간에서 프로그램을 실행하여. 이렇게하면 실제 메모리에 액세스 할 수 있지만 매핑 된 주소는 실제 주소와 같지 않으므로 분석 프로그램의 하드 코드 된 메모리 주소는 패치해야합니다. 이는 대량의 인코딩 된 절대 주소로 인해 거의 불가능한 것처럼 보입니다.
  • 주소를 다시 쓰면 불법 메모리 액세스를 수정하려고하는 세그먼트 화 오류 처리기를 설치하십시오. 그런 다음 사용자 공간에서 프로그램을 실행하십시오.
  • 프로그램 코드를 디스크에서 메모리로로드하고, 보호 모드 (GDT 설정 포함)를 입력하고 점프하는 부트 로더를 작성하십시오. 비슷한 코드를 작성한 적이 없기 때문에이 코드가 작동하는지조차 확신 할 수 없습니다.

지금까지보고 싶지 않은 프로그램을 실행할 수있는 다른 옵션이 있습니까? 또는 위에 언급 한 아이디어에 대한 제안, 추가 또는 경험이 있습니까?

+0

어떤 형식입니까? DOS COM, EXE, Win32 PE? –

+0

인텔의 TXT 인증 코드 모듈 (일명 SINIT ACM)입니다 ([TXT 소프트웨어 개발 가이드] (http://www.intel.com/content/www/us/en/software-developers/intel-txt- software-development-guide.html) page 64ff) – r00t

답변

1

필자가 보았던 몇몇 SINIT 모듈은 모듈의 끝에 삽입 된 일반 PE 파일로 구문 분석하고 점프하는 항목에 리얼 모드 로더 부분을 가지고 있습니다. 따라서 로더를 디버그 할 필요가없는 경우 PE를 추출한 다음 PE 파일 (예 : HX-DOS, WDOSX)을 지원하는 DOS 확장기 중 하나를 사용하여 DOS에서로드 및 디버그 할 수 있습니다. 그러나 모듈이 실행되고 CLOSE-PRIVATE 명령을 실행하면 개인 TXT 레지스터에 액세스 할 수 없습니다.

참고로 0xFED40000 범위는 Intel의 내부 TPM (iTPM)에 속한 것 같습니다. Linux의 tpm_tis 드라이버를 참조하십시오. 따라서 대신 이러한 액세스 (신호/예외 처리기 사용)를 차단하고 실제 TPM으로 리디렉션 할 수 있습니다.

+0

답장과 임베디드 PE 파일에 대한 힌트를 보내 주셔서 감사합니다. 불행히도 나는 어떤 TXT/TPM 레지스터에 액세스하고 어떤 TPM 명령을 실행하는지 알고 싶기 때문에 로더를 디버깅해야 할 것이다. 또한이 특정 SINIT 모듈을 본 적이 있는지 확실하지 않습니다. 코드가 피연산자 크기없이'eax','ecx'와 같은 32 비트 레지스터에 액세스 할 때 16 비트 리얼 모드 코드처럼 보이지 않습니다. 접두사 (0x66). – r00t

+0

네, 분명히 저는 "리얼 모드"에 대해 틀 렸습니다. 로더 코드는 헤더에 지정된 GDT의 선택기를 사용하며 Intel의 모듈은 기본적으로 32 비트 CS로 간주됩니다. –