Developing Ring0 Loader

문서 정리하다가 발견한 ARTEAM E-Zine에 재미있는 기사가 있어서 정리해 보았다.
예전에 커널에서 특정 프로그램을 실행하는 코드가 Code Project에 올라왔다.
그때는 시스템에 Explorer.exe 안에 있는 스레드 가운데 alertable한 녀석을 골라잡아
PETHREAD를 참조하여 UserAPC 큐에 실행하기 원하는 APC Object를 집어넣는 기법이었다.

그런데 이건 조금 다른쪽에서 접근한 방법이다. 크랙을 만드는 입장에서 Ring0 Loader를
이용하여 특정 프로그램을 실행하는 것이다. 이 기사는 Ring0 CrackMe Tutorial을 썼던
Deroko가 썼다. 먼저 여기서의 로더는 커널에서 동작하며, 때로는 디버거의 역할까지도
한다. 다시말해 Soft-Ice와 유사하게 IDT를 후킹하여 Fault나 Trap를 가로채서 처리하는
역할을 하는 것이다.

먼저 잘 알려진 IDT의 주소를 얻는 방법이다.
<++>
.data
idttable            dq      ?

.code
                      sidt   fword ptr[idttable]
                      mov   eax, dword[idttable+2]
<++>
x86의 인스트럭션인 sidt로 얻어지는 값은 6바이트의 데이터이다. 그중 앞대가리 2바이트는
LIMIT이고 나머지 4바이트가 IDT의 주소이다.

그런데 이 코드가 themida에서는 이렇게 꼬여있다.
<++>
push   edi                      ;save edi
push   eax                     ;ESP-4
sidt     fword ptr[esp-2]
pop     eax                     ;EAX will hold IDT base
pop     edi                      ;restore edi
<++>

포스팅 계속....

by nerd | 2007/04/22 00:39 | Security | 트랙백 | 덧글(0)


트랙백 주소 : http://nerd.egloos.com/tb/3128876
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶