😡angr-PT

개요

AngrPT의 핵심기능은 다음과 같습니다.

  • IOCTL RIP범위 추적

  • IOCTL 제약조건 분석

  • 전역변수 종속성 분석

IOCTL RIP 추적

Kernel Driver는 IoControl을 이용하여 유저와 상호작용을 하기 때문에 분석에 있어서 가장 중요한 것은 드라이버가 특정 IoControl Code를 통해 어떠한 동작을 하는지 식별하는 것입니다.

Kernel Driver는 다양한 기능을 지원하기 위해서 적게는 몇 개, 많게는 수십개의 IoControl Code를 가집니다.

IDA Hex Ray결과 아래와 같이 switch / case문으로 표현되는 경우도 있었지만,

대부분의 Driver코드가 다음과 같이 각 IoControl Code가 특정 변수에서 Offset을 빼는식으로 계산이 되어 분석에 큰 어려움이 있었습니다.

때문에 저희는 각 IoControl Code를 식별하고 IDA Hex Ray결과에서 IoControl Code별 바이너리상의 Offset을 제시하여 분석가의 편의를 제공합니다.

분석 결과는 다음과 같이 나타납니다.

IOCTL 제약조건 분석

각 IoControl Code에는 서로 다른 제약 조건이 있고, 각 제약조건을 분석하는 데에는 시간이 상당히 소요됩니다. 이러한 시간소모를 줄이기 위해 Symbolic Execution을 적용하여 IRP구조체의 IoStatus Code를 Symbolic Variable로 만듦으로써 각 IOCTL의 제약조건을 자동으로 분석하도록 하였습니다.

분석 결과를 사용하여 Fuzzing 과정 중에 유효한 코드 부분을 실행하도록 하였고, 더 높은 커버리지를 얻고, Crash를 발견할 확률을 높일 수 있습니다.

제약조건을 구하기 위한 기준은 아래 기준에 따라 판단하였습니다.

분석 결과는 다음과 같이 나타납니다.


전역변수 종속성 분석

일부 Kernel Driver는 IOCTL 간 종속성으로 인해 버그가 발생하는 경우도 존재합니다.

이 때 '종속성'이란 이전 코드의 실행 결과가 다음 코드의 결과에 영향을 미치는 것을 의미합니다. 예를 들어 case C: 에서 발생하는 BUG(); 가 트리거되기 위해서는 case A:, case B:가 순차적으로 먼저 트리거되었어야 합니다.

Kernel Driver에서이러한 종속성은 동일한 전역변수를 공유한다는 특징에서 발생하였습니다. MS Fuzzer에서는 Symbolic Execution을 적용하여 IOCTL을 그룹화하였고, 이를 고려하여 Fuzzing하도록 적용하였습니다.

분석 결과는 다음과 같이 나타납니다.

Last updated