본문 바로가기

카테고리 없음

[논문리뷰] VMHunt: A Verifiable Approach to Partially-Virtualized Binary Code Simplification

가상화 난독화

  • 프로그램의 선택된 부분을 새로운 사용자 정의 ISA에서 바이트코드로 변환
  • 실행 시 바이트코드가 실제 머신에서 임베디드 가상머신 또는 인터프리터에 의해 에뮬레이트됨
  • 데이터 인코딩, 메타모르피즘, 제어 흐름 난독화 같은 다른 난독화 기법과 통합되어 전통적인 정적, 동적 분석 기술 적용 어려움
  • 하지만 성능과 호환성이 떨어져 코드의 주요 부분만 가상화
 

기존의 가상화 deobfuscation

1.가상 프로그램 카운터의 현재 값에 따라 바이트코드 조각을 가져오고(디코드), 그 다음 해당 바이트코드를 에뮬레이트하는 머신 코드를 포함하는 핸들러로 디스패치하는 중앙 루프

2.실행 명령어에서 가상화 난독화 계층 제거 
 
=> 두 연구 모두 가상화된 코드의 범위를 알고 있다는 가정
=> 오버헤드를 줄이기 위해 난독화된 프로그램에서 가상화된 코드 부분을 추출하는 방법 필요

 

 

VMHunt

가상화된 코드 섹션을 자동으로 식별하고 단순화하는 새로운 방법 제안
컨텍스트 스위치 기반 가상화된 코드 경계를 찾고, 다중 세분화 심볼릭 실행으로 코드 단순화
 

VMHunt workflow

가상화된 스니펫 경계 탐지: 실행 트레이스를 기록하여 컨텍스트 전환 명령어 감지

 

가상화된 커널 추출: 가상화된 스니펫의 커널(네이티브 프로그램 환경에 영향을 미치는 명령어)을 분석

 

새로운 기호적 실행 방법 제안: 가상화된 스니펫 단순화

 

가상화된 스니펫 경계 탐지

  • Intel Pin(동작 바이너리 instrumentation 프레임워크) 기반
  • 명령어, 레지스터, 메모리를 포함한 런타임 정보
  • 컨텍스트 저장 명령어: 모든 레지스터를 메모리에 저장하는 명령어
  • 컨텍스트 복원 명령어: 모든 레지스터를 메모리에서 복원하는 명령어

 

 

 

 

 

모든 레지스터를 스택에 push/pop하는 명령어 시퀀스를 패턴 매칭 방식으로 찾기
그러나 코드 변형과 같은 난독화 기법으로 숨기고 있음

=> 정규화, 단순화, 클러스터링의 3단계 제안

 

1.정규화: 모든 데이터 전송 명령어(push, pop,xchg) -> mov
2.단순화
      peephole optimize: 패턴 매칭에 기반, 불필요한 명령어 제거
      데이터 흐름 분석기: 피연산자의 정의-사용 정보 기록, 코드 제거
3.클러스터링: 1,2 단계를 거친 trace 바탕으로 명령어 의존성 그래프 구축
 
  • 컨텍스트 저장, 복원 명령어 쌍 만들기
  • 스택 깊이(스택 포인터 레지스터 값)
  • 동일 깊이의 저장, 복원 명령어만 쌍으로 만듦
  • 실행 흐름 전환 명령어
  • jmp, call, ret 뒤에 오는 컨텍스트 전환 명령어만 선택 

가상화된 커널 추출

  • 가상화된 스니펫의 동작: local, global
  • global
    • 외부 네이티브 컨텍스트에 접근하거나 이를 변경
    • 가상화된 스니펫의 핵심 부분 구성 -> “커널”
  • global 동작 명령어 식별 후, 이를 기반으로 trace slice
  • 스택 깊이로 VM 스택 영역/네이티브 스택 영역 구분
    네이티브 스택 영역에 데이터를 쓰는 명령어
    스택 메모리에 데이터 저장하는 명령어
  •  
    커널 크기: 초기 가상화된 스니펫 총 명령어 중 약 1%

 

 

다중 세분화 기호 실행

  • 가상화된 커널에서 기호 실행으로 공식을 얻어 원본 코드와 비교
  • 기존의 기호 실행 방식은 최적화, 성능 문제
  • 비트 단위 연산을 자연스럽게 처리하고 공식의 크기를 줄일 수 있는 새로운 방식 제안
 
1.기호 실행 중 레지스터의 런타임 상태 유지
2.각 명령어의 효과 해석
3.명령어 해석 후 구체적인 값이 되는 경우 중복 기호 제거
 

구현

Intel Pin DBI 프레임워크 기반 C++ 로 작성
기호 실행 엔진의 두 가지 요소 다시 설계
 

Evaluation

RQ1: 가상화된 스니펫 경계를 정확하게 감지하는가 
RQ2: 가상화된 커널을 효과적으로 추출하고 단순화할 수 있는가
RQ3: 오탐지를 얼마나 하는가
RQ4: 얼마나 많은 오버헤드를 발생시키는가
 
  • 모든 테스트베드 프로그램에서 가상화된 스니펫 정확하게 식별
  • 추출한 커널은 전체 trace의 10^-4 크기
  • 다중 기호 실행의 크기, 속도 빠름
 

VMHunt의 한계

  • 동적 분석의 일반적 문제, 불완전성
  • trace logging 공격 => transparent한 환경에서 악성코드 실행
  • 프로그램 전체가 가상화되는 경우: 그러나 일반적으로 흔치 않음
  • 전체 레지스터를 사용하지 않는 경우: 그러나 일반적으로 흔치 않음