부동산, 채권, 주식, 경제흐름 자료를 모아 보는 블로그입니다.

CALL Gate를 이용한 행위 은폐 - 2 본문

디바이스 드라이버

CALL Gate를 이용한 행위 은폐 - 2

runardor 2016. 9. 7. 00:10

일단 Call Gate의 동작 과정이나 방법을 알기전에 Call Gate를 일단 보고 시작하도록 하겠습니다.




일단 해당 프로그램은 Call Gate를 TEST하기 위한 유저 레벨 프로그램을 올리디버거를 이용하여 디버깅하는 화면이며


위의 화면을 보게되면 CALL FAR FWORD PTR SS: [EBP-8] 코드가 존재함을 확인할 수 있다.


EBP-8 내부 DATA는 0070:00000000인데 해당값은 Segment:Offsett이기 때문에 실제 Call 되는 주소가 0x700이다.



해당주소는 당연하게도 유효한 주소가 아니며 해당 함수를 따라 들어갈 경우 BSOD 화면이 뜰 수 있다. ( 단순하게 유저레벨에서 디버깅이 불가 )



BSOD가 일어나는 이유는 아래와 같다.


1. 유저레벨에서 커널 레벨로 접근시 GDT, IDT를 참고하여 Call Gate를 찾게 되는데 이떄 CS 레지스터가 보정되지 않아 잘못된 포인터의 주소에 접근하면서 Memory Access Violation 발생


2. 접근가능한 메모리 속성이라도 커널 메모리를 올리디버거( 유저레벨 어플리케이션 )이 커널 메모리 접근을 할때 Memory Access Violation 발생


Far Call 부분을 Step In으로 따라 갈 경우 BSOD가 발생하지만


정상적으로 Call Gate가 실행될 경우 Step Over를 할 경우 BSOD 없이 정상적으로 커널의 함수를 호출하고 유저레벨로 권한이 넘어온다. ( 하지만 할일은 다 하고 넘어옴 )


분석가 입장에서는 실제로 어떤 행위를 하고 넘어왔는지 알수가 없기 때문에 분석이 굉장히 어려워 짐.



CALL Gate 호출 방법은 크게 2가지 이다.


1. Far Call 명령을 이용하여 커널로 넘어가는 방법

2. Far Jump 명령을 이용하여 커널로 넘어가는 방법




위의 예의 경우 Far Call 명령을 이용하여 커널에 접근한 예제


) Far Cal l

      CALL FAR FWORD PRT SS:[EBP-XX]  // 스택 어디를 가리켜도 상관없음 ( 유효한 주소여야 함 )

     

      Call Data : Segments:Offset

      Call Data : 16bit( Segments) + 32bit(Offset )

      0x0100:00000000 = 0x1000을 가리키게 됨.






'디바이스 드라이버' 카테고리의 다른 글

CALL Gate를 이용한 행위 은폐 - 1  (0) 2016.09.06
IOCTL_CODE  (0) 2015.04.05
Comments