[리버싱] DynamoRIO, Lighthouse로 코드커버리지 분석하기

코드 커버리지(code coverage)

코드 커버리지는 개발 단계에서 테스트 코드나 도구를 이용해서 실행 가능한 모든 코드를 테스트하는 지표 중 하나이다. ‘코드가 얼마나 실행되었는지’ 살펴볼 수 있고 수치를 통해서 확인할 수 있다.

개발 환경에서는 코드를 볼 수 있기 때문에 ‘화이트 박스 테스트’가 가능하지만, 이미 컴파일된 바이너리를 분석할 때는 코드를 직접 살펴보는 것이 아니기 때문에 ‘블랙박스 테스트’로 진행해야 한다.

코드의 구조는 구문(Statement), 조건(Condition), 결정(Decision)의 구조로 되어 있다. 코드 커버리지는 이 요소들을 얼마나 넓게 커버하고 있느냐에 따라 측정한다.

  • 구문(Statement) : 모든 라인이 한 번 이상 실행
  • 조건(Condition) : 조건식의 내부 조건이 참/거짓을 가지면 충족
  • 결정(Decision) : (=브랜치(Branch))모든 조건 식의 참/거짓을 가지면 충족

DynamoRIO

DynamoRIO는 실행 중인 프로그램(런타임)에서 실행 과정을 트레이싱하게 해준다. Dynamic Binary Instrumentation 플랫폼이며, 동적 분석 영역에서 많이 사용된다.

운영체제와 바이너리 사이에서 동작하며 바이너리 코드를 코드 버퍼에 복사하는 방식으로 타겟 프로그램의 실행을 시뮬레이팅한다. 동적으로 실행 과정을 시뮬레이팅하는 과정에서 분석 필요에 따라 바이너리의 실행 상태를 모니터링하거나 수정할 수 있다.

IA-32, AMD64, ARM 등 다양한 아키텍처를 지원하고 프로그램에 대한 명령어 조작 기능 또한 제공한다.

https://github.com/DynamoRIO/dynamorio

[*] 2022년 7월 기준 최신 버전(9)의 경우 IDA 플러그인 실행 시 파싱에러가 발생한다. 8버전으로 다운받는다.
https://github.com/DynamoRIO/dynamorio/releases/download/release_8.0.0-1/DynamoRIO-Windows-8.0.0-1.zip

 

Lighthouse

DynamoRIO와 같은 동적 분석 도구로 생성한 코드 커버리지를 IDA에서 볼 수 있게 시각화해주는 IDA Plugin이다.

https://github.com/gaasedelen/lighthouse

다운받은 후 %[IDA가 설치된 경로]\plugins 경로에 복사한다. IDA가 실행중인 경우 다시시작한다.

실행 결과 로그 파일

IDA 실행 후 File - Load File - Load Coverage File - [.log 파일] 하게되면 코드 커버리지 정보를 로드한다.

코드 실행 여부에 따라 IDA에서 정적분석한 결과와 함께 볼 수 있다. Hex-Rays와 함께 볼 수 있어 분석에 용이하다.

반응형