티스토리 뷰

728x90
반응형

[Reversing] APC Injection_QueueUserAPC()


- 샘플 파일 다운로드

첨부파일


APC인젝션은 비동기 함수 호출로 직접 호출하는 형태가 아닌 CALLBACK 함수를 통해 호출하는 것이다.

QueueUserAPC() 함수를 이용하는데 해당 함수가 호출되기에는 스레드가 Alertable 상태여야며, 또 스레드가 Alertable 상태가 되기 위한 조건은 sleep(), wait() 관련 API를 통해야 된다는 조건이 있다. 


alertable 상태란? 사용자가 조정할 수 있는 유일한 스레드의 상태이다.


(SleepEx, WaitForSingleObjectEx, WaitForMultipleObjectsEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx)

내용을 정리하면 위 함수 중 하나를 호출하여 스레드가 alertable 상태로 만들어진다는 걸 알 수 있으며, 대상 프로세스(calc.exe)의 스레드가 APC queue에 있다면 쉘코드가 실행된다는 것을 알 수 있다.

, sleep(), wait() 관련 API를 통해 스레드(hThread) alertable 상태가 되어야 QueueUserAPC()가 호출이 되어 APC Injection이 가능하다는 걸 알 수 있다.

OpenProcess() 대상 프로세스 핸들 Get

VirtualAllocEx() 대상 프로세스 버퍼 할당

WriteProcessMemory() 쉘코드 삽입

Thread32Next() & OpenThread() → 스레드 검색, 오픈

QueueUserAPC(hThread)의 스레드 상태 alertable O

QueueUserAPC(hThread)의 스레드 상태 alertable X

QueueUserAPC(lpBaseAddress(쉘코드), hThread(argv[1]), NULL)

호출(Injection 성공)

QueueUserAPC() error & 재시도

1 – APC Injection 단계


(그림 1)msfvennom을 이용하여 쉘코드 생성과 APC Injection을 실행하여 인젝션 된 결과를 보여주는 것을 확인 할 수 있다.

그림 1 – APC Injection 실행 화면




728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
250x250