본문 바로가기

스터디/파이썬 해킹 프로그래밍

DLL과 코드 인젝션

리버싱이나 공격을 수행 시 원격 프로세스 안에서 코드를 로드하고 그것을 해당 프로세스 컨텍스트 내에서 실행시키는 것은 상당히 유용한 기술.

DLL과 코드 인젝션을 통해 패스워드 해쉬를 스니핑하거나 공격 대상 시스템의 원격 데스크탑 제어권을 얻을 수 있다.


DLL과 코드 인젝션 기술은 일반적인 개발자나 페이로드 개발자, 쉘 코드 제작자, 침투 테스터 모두가 사용하는 기술이다.


DLL인젝션을 이용해 다른 프로세스 내에서 팝업 윈도우를 띄울 것이며, 특정 PID를 가진 프로세스를 종료시키게 된 쉘 코드를 테스트 하기 위해 코드 인젝션을 사용할 것이다.

마지막으로는 완전히 파이썬만으로 코딩된 트로이 목마를 작성한다.

일단 원격 쓰레드 생성부터 알아보자.


쓰레드를 생성하는데 사용되는 Win32 API가 kernel32.dll의

CreateRemoteThread() 다. 다음은 CreateRemoteThread() 함수의 프로토타입이다.


HANDLE WINAPI CreateRemoteThread(

HANDLE hProcess,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

SIZE_T dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadId

);


파라미터들의 의미를 모두 직관적으로 판단하면 되므로 파라미터가 너무 많다고 걱정할 필요는 없다.

첫 번째 파라미터 hProcess 는 쓰레드가 실행되는 프로세스의 핸들이다.

lpThreadAttributes 파라미터는 단순히 새롭게 생성되는 쓰레드를 위한 security descriptor 를 설정하기 위한 것으로 해당 쓰레드 핸들을 자식 프로세스가 상속할 수 있는 지 여부를 나타낸다.

dwStackSize 파라미터는 단순히 새로 생성되는 쓰레드의 스택 크기를 설정한다.

값이 0일 경우 프로세스가 이미 사용하고 있는 기본 스택 크기를 사용하게 된다.

그 다음 파라미터는 가장 중요한 파라미터로, lpStartAddress다. lpStartAddress 파라미터는 쓰레드가 실행될 메모리의 주소를 나타낸다.

인젝션이 제대로 수행되기 위해서는 lpStartAddress 파라미터에 반드시 정확한 주소가 전달되어야 한다. 

다음은 lpParameter 파라미터로, lpStartAddress 파라미터 만큼이나 중요한 파라미터이다. 이 파라미터에 의해 전달되는 메모리 주소는 lpStartAddress 에 전달되는 함수 파라미터의 주소다.

--> 이 파라미터는 DLL 인젝션을 수행하는데 매우 중요하다.

dwCreationFlags 파라미터는 쓰레드가 시작되는 방식을 설정하기 위한 것이다. 여기서는 이 파라미터 값으로 항상 0을 사용할 것이다. dwCreationFlags 파라미터의 값이 0이면 쓰레드는 생성되자마자 곧바로 실행된다. 

dwCreationFlags 파라미터에 설정할 수 있는 다른 값에 대해서는 MSDN을 참조하면 좋다.

마지막은 lpThreadId 파라미터로, 이 파라미터를 통해 새로 생성되는 쓰레드의 ID가 전달된다.

 이제는 인젝션을 수행하는데 가장 중요한 함수인 CreateRemoteThread() 함수를 이해했을 것이다. 다음에는 이 함수를 이용해 원격 프로세스에 DLL과 쉘 코드를 인젝션 시키는 방법을 살펴보자.

원격 쓰레드를 생성하고 그것의 코드를 실행시키는 과정이 DLL인젝션과 코드 인젝션의 경우 약간 다르다.
















'스터디 > 파이썬 해킹 프로그래밍' 카테고리의 다른 글

코드 인젝션  (0) 2015.02.16
DLL 인젝션  (0) 2015.02.16
Immunity 디버거를 이용한 하드 후킹  (0) 2015.02.15
PyDbg 를 이용한 소프트 후킹  (0) 2015.02.15
질문 정리 (2015-01-26)  (0) 2015.01.26