security/리버싱핵심원리

CreateRemoteThread()를 이용한 DLL Injetcion의 한계

민사민서 2023. 4. 4. 16:30

Windows 7부터 적용된 세션 관리 정책

- 시스템 프로세스들과 서비스 프로세스들이 실행되는 시스템 세션(Session ID=0)과 로그온 사용자의 세션(Session ID>=1)을 분리

- CreateRemoteThread() API를 이용한 DLL 인젝션 기법은

    1) Session 1의 사용자 세션에서 실행되는 프로세스 대상으로는 잘 동작하지만

    2) Session 0의 시스템 세션에서 실행되는 프로세스 대상으로는 동작하지 x

 

해결 방법

- Kernel32!CreateRemoteThread() API 내부에서 remote thread를 생성할 때 ZwCreateThreadEx()를 이용해 suspend 모드로 생성하는데, 만약 리모트 프로세스가 Session 0이라면 (CreateSuspended 파라미터가 TRUE(1)로 세팅되면서) resume시키지 않고(ZwResumeThread() API가 호출되지 않고 건너뜀) 에러를 리턴함

 

Therefore...

=> CreateRemoteThread() 내부에서 호출되는 ZwCreateThreadEx()를 직접 호출한다

=> Ollydbg에서 CreateSuspended 파라미터를 조작하거나, ZwResumeThread 직전 분기를 조작한다