1 minute read

Taint Analysis란?

  • 정의
    • 프로그램에서 사용자 입력값으로 인해 어떤 레지스터와 메모리 영역이 제어 가능한지 확인하는 기법
  • 특징
    • 메모리 성능 확인, 보안 테스트 등에 사용
    • 프로그램 소스 코드 없이 분석 가능
  • 동작 방식
    • Dynamic analysis
      • 환경 및 시스템 호출과 같은 모든 사용자 입력을 수정해야 함
        • 이를 위해 DBI(Dynamic Binary Instrumentation framework) 필요
        • 이를 이용해 각 명령어의 전후에 핸들러를 추가하며 핸들러가 호출되면 명령어, 메모리에 대한 모든 정보를 얻을 수 있음
      • 구문을 IR로 변경 후 해석해야 함
        • Valgrind라는 IR을 사용하는 계측 프레임워크가 있음
    • Static analysis
      • 코드를 파싱하여 제어 흐름 CFG로 모든 분기들을 확인
      • 동적 분석보다 더 많은 코드 범위를 제공한다는 장점이 있음
        • 그러나 레지스터와 메모리 값을 검색할 수 없기 때문에 동적 분석보다 결과의 신뢰도가 낮음

DBI(Dynamic Binary Instrumentation)

  • 개념
    • 런타임에 실행 코드를 삽입하여 바이너리 응용 프로그램의 동작을 분석하는 방법
  • 장점
    • 클라이언트 프로그램을 준비할 필요 없으므로 사용이 편리
    • 모든 클라이언트 코드를 자연스럽게 다룸
      • 코드와 데이터가 섞이거나 다른 모듈을 사용하면 정적으로 모든 코드를 계측하는 것이 어려울 수 있으며 클라이언트가 동적으로 생성된 코드를 사용하면 불가능함
      • 따라서 모든 코드를 계측할 수 있는 기능은 라이브러리를 정확하고 완전하게 처리하는 데 중요함
  • 단점
    • 런타임시 계측 비용 발생
    • 런타임에 실행 코드를 다시 작성하는 것이 어려움
    • 그럼에도, DBI 프레임워크에 의해 극복되었으며 이는 런타임 오버 헤드를 최소화하기 위해 최적화 됨
  • 도구
    • Valgrind
    • DynamoRIO
    • Dyninst
    • PIN

IR(Interediate Representation)

  • IR은 소스 코드를 표현하기 위해 컴파일러 또는 가상 시스템에서 내부적으로 사용하는 데이터 구조나 코드
  • 최적화와 번역 등 추가 처리를 위해 도움이 되도록 설계됨
  • 특정 소스, 대상 언어와 무관하게 소스 코드를 나타낼 수 있음
  • 여러 가지 형태가 있음
    • 메모리 내 데이터 구조
    • 프로그램이 읽을 수 있는 특별한 튜플 또는 스택 기반 코드

Intermediate Language

  • 컴퓨터 프로그램의 분석을 돕기 위해 설계된 추상적 기계 언어
  • 일반적인 기계어와는 다름
    • 각 명령은 하나의 기본 동작을 나타냄
    • 제어 흐름 정보는 명령 집합에 포함되지 않을 수 있음
    • 사용 가능한 프로세서 레지스터 수는 크기가 크거나 무제한일 수 있음
  • 일반적인 형식은 Tree-Address Code 를 따름

Tree-address code (TAC)

  • 컴파일러에서 중간언어로 사용
  • 피연산자는 구체적은 메모리 주소나 프로세서 레지스터가 아니라 레지스터 할당 중 실제 주소로 변환될 수 있는 기호적 주소를 의미
  • TAC는 향상된 코드 변환을 위해 컴파일러를 최적하는 데 사용되는 중간 코드
  • 각 TAC 명령어는 최대 세 개의 피연산자를 가지며 일반적으로 대입 연산자와 이진 연산자를 조합함

1

Leave a comment