티스토리 뷰

[Reversing] APC Injection_QueueUserAPC()


QueueUserAPC()의 인자를 적절하게 넣는다고 하여도 스레드(hThread) alertable 상태일 때 QueueUserAPC()가 호출이 되는 조건이 있다. 그렇듯이 스레드가 alertable 상태되는 조건으로는 sleep(), wait() 관련 API를 통해야 된다는 것을 알고 있어야 하며 아래와 같다.

(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 실행 화면



첨부파일

댓글
공지사항
«   2020/02   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
Total
138,729
Today
2