티스토리 뷰

System/Windows

[RPC] Remote Procedure Call

Tribal 2019. 10. 18. 14:34

개요

 

  본래 프로세스끼리는 서로의 고유 영역에 접근이 불가능하다. 하지만 IPC(Inter-Process Communication) 통신을 이용해 프로세스간 통신을 할 수 있다. 이 때 IPC를 사용하면 프로세스간 Read/Write를 하는 것이다. 하지만 RPC(Remote Procedure Call)는 이름 그대로 원격에서 프로시저(Procedure)를 호출할 수 있다. 따라서 RPC를 사용하면 프로세스간 Execute를 하는 것이다. 

 

RPC 통신 구조

...

 

API 목록

  • 공통 API
    • UuidFromString : Uuid 형태의 문자열을 Hex 값 Uuid로 변환
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : StringUuid, Uuid 형태의 문자열 주소
      • 두 번째 인자 : Hex 값 Uuid를 반환받을 주소
    • RpcStringFree : RPC 라이브러리로부터 할당받은 문자열을 해제
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : String, 해제할 문자열 포인터
    • RpcAsyncCompleteCall : 비동기 Rpc 통신을 완료
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : pAsync, RPC_ASYNC_STATE 핸들의 포인터
      • 두 번째 인자 : Reply, RPC 통신의 반환 값
  • RPC 서버용 API
    • RpcServerUseProtseq : RPC 서버가 통신에 사용할 프로토콜을 선택
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : Protseq, 사용할 프로토콜 식별자 문자열(link)
      • 두 번째 인자 : MaxCalls, ncacn_ip_tcp 프로토콜 사용시 Backlog queue 길이
      • 세 번째 인자 : SecurityDescriptor, ncacn_np 및 ncalrpc 프로토콜 사용시의 매개 변수(선택사항)
    • RpcServerRegisterIfEx : RPC 인터페이스를 등록
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : IfSpec, MIDL로 생성된 인터페이스 명세 구조체
      • 두 번째 인자 : MgrTypeUuid
      • 세 번째 인자 : MgrEpv
      • 네 번째 인자 : Flags
      • 다섯 번째 인자 : MaxCalls, 최대 RPC 요청 수
      • 여섯 번째 인자 : IfCallback, RPC 연결 시 호출될 Callback 함수
    • RpcServerInqBindings : RPC 호출을 수신 가능한 BindingVector 핸들 생성
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : BindingVector 핸들을 저장할 포인터 주소(RPC_BINDING_VECTOR** 타입)
    • RpcEpRegister : RPC EndPoint를 등록
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : IfSpec, EndPoint로 등록할 인터페이스
      • 두 번째 인자 : BindingVector, RPC 호출을 수신할 한 BindingVector 포인터
        (RpcServerInqBindings API로 생성)
      • 세 번째 인자 : UuidVector, 인터페이스 EndPoint UUID
      • 네 번째 인자 : Annotation, 주석용 문자열
    • RpcServerListen : Rpc 호출을 수신하기 위해 RPC 라이브러리에 신호를 전송
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : MinimumCallThreads, RPC 서버에 유지되어야 할 최소 호출 스레드 수
      • 두 번째 인자 : MaxCalls, 서버가 실행할 수 있는 최대 호출 수
        (효율적인 성능을 위한 제안, 기본 값 : RPC_C_LISTEN_MAX_CALLS_DEFAULT)
      • 세 번째 인자 : DontWait, 0이 아닌 경우 즉시 반환(Non-Blocking)
  • RPC 클라이언트용 API
    • RpcAsyncInitializeHandle : 비동기 Rpc 호출을 위한 핸들 생성
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : pAsync, 비동기 Rpc 호출 핸들을 반환받을 RPC_ASYNC_STATE 포인터 주소
      • 두 번째 인자 : Size, RPC_ASYNC_STATE 구조체의 크기
    • RpcStringBindingCompose : RPC bind하기 위한 StringBinding 핸들 생성
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : ObjUuid, 바인딩할 RPC 인터페이스 EndPoint UUID 값
      • 두 번째 인자 : ProtSeq , 인터페이스와 통신할 프로토콜
      • 세 번째 인자 : NetworkAddr, 네트워크 통신시 연결할 네트워크 주소
      • 네 번째 인자 : Endpoint, Endpoint의 이름
        (ncacn_np 프로토콜의 경우, \pipe\pipename)
      • 다섯 번째 인자 : Options, 네트워크 옵션
      • 여섯 번째 인자 : StringBinding, StringBinding 핸들을 반환받을 포인터 주소
    • RpcBindingFromStringBinding : StringBinding 핸들로부터 RPC Binding 핸들 생성
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : StringBinding, StringBinding 핸들
      • 두 번째 인자 : Binding, 반환받을 RPC_BINDING_HANDLE 포인터 주소
    • RpcBindingSetAuthInfoEx : RPC bind에 필요한 인증 정보 세팅
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : Binding, RPC_BINDING_HANDLE 값
      • 두 번째 인자 : ServerPrincName
      • 세 번째 인자 : AuthnLevel, 수행할 인증 수준
      • 네 번째 인자 : AuthnSvc, 수행할 인증 서비스
      • 다섯 번째 인자 : AuthIdentity, 인증을 위한 클라이언트 식별자
      • 여섯 번째 인자 : AuthzSvc, 서버에 별도로 구현된 인증 서비스인 경우 사용
      • 일곱 번재 인자 : SecurityQOS, 보안 서비스 수준
        (Version에 따라 인자의 수가 약간 달라지니 확인)
    • RpcBindingFree : RPC Binding 핸들을 해제
      • 반환값 : RPC_STATUS 타입의 결과 값
      • 첫 번째 인자 : Binding, RPC_BINDING_HANDLE 값
    • NdrAsyncClientCall : RPC 비동기 호출
      • 반환값 : CLIENT_CALL_RETURN 타입의 결과 값
      • 첫 번째 인자 : pStubDescriptor, MIDL_STUB_DESC 타입의 MIDL 명세서
      • 두 번째 인자 : format, 인터페이스에 실행을 요청할 함수 및 인자를 담은 MIDL로 생성된 format string
      • 세 번째 인자 이후 : format string에 따른 추가 인자

Tool 목록

  • RPCView : RPC 통신을 지원하는 프로세스 목록, RPC 인터페이스 및 프로시져를 보여주는 툴
    • 장점 : 통신가능한 RPC 목록 및 RPC 프로시져까지 알려주기 때문에 분석에 필요한 모든 정보는 다 얻을 수 있다.
    • 단점 : 실행하는 Windows 환경의 rpcrt4.dll에 따라 실행이 되지 않는다.
    • Options에서 symbol을 설정 가능
  • findrpc : 바이너리로부터 RPC 인터페이스를 찾아주는 IDA script

RPC 분석 및 보안

임시(about debugging ALPC) : https://blogs.msdn.microsoft.com/ntdebugging/2010/09/30/debug-sleuth-at-work-hung-server-mystery-of-the-unprocessed-smb-work-item/

 

참고

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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 30 31