정보보호-8. 악성코드와 난독화

백지원·2023년 6월 10일
0

PE 파일의 구조

PE파일?

  • 윈도우의 실행 파일.
    ex) .exe
    파일 내부에 다양한 정보들 존재. (각각 섹션으로 불림)
  1. 헤더
    바이너리에 대한 메타데이터들 존재

    바이너리 : 컴퓨터에서 정보는 이진 형태로 저장되며, 바이너리는 이진 파일을 의미.

    각 섹션들의 위치, 크기 등
    실행하게 될 명령어의 시작 주소 : Entry Point (중요)

    👇헤더 속 정보 예시

  2. 리소스
    바이너리와 관련한 이미지, 소리, 문자열 등

  3. 실행코드 (.text 섹션)
    바이너리의 동작을 결정하는 어셈블리 코드

    어셈블리 코드 : 어셈블리어 또는 어셈블러 언어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어


패킹

프로그램이 메모리에 올라간 이후, 실제 모습을 감춤

-> 정적분석을 방해함

패킹 도구들

도구들마다 목적 상이

  • UPX -> 바이너리의 크기를 줄이기 위함
  • Themida -> 바이너리의 분석을 방해하기 위함
  • MPRESS
  • PELock

UPX

-> 오픈소스 패커

  • 보안의 목적보다 압축효과에 목표를 둠
  • 실행파일의 크기를 줄임

장단점?

UPX의 장점:

  • 오픈 소스 및 무료: 무료로 사용할 수 있는 오픈 소스 패커로, 라이선스 비용 없이 개발자와 사용자가 액세스할 수 있다.
  • 여러 플랫폼 지원: Windows, Linux, macOS 등 여러 운영 체제와 호환 가능.
  • 상당한 압축률: 실행 파일의 크기를 최대 50% 이상 줄일 수 있다. 다양한 실행 파일을 압축하는 데 탁월하며 특히 대규모 응용 프로그램의 경우 효율적인 결과를 얻을 수 있다.
  • 쉬운 사용: 간단한 명령줄 인터페이스 사용. 빌드 프로세스 또는 자동화 스크립트에 비교적 쉽게 통합 가능. 다양한 개발 도구와의 통합을 제공하여 압축 작업 흐름을 단순화.

UPX의 단점:

  • 암호화 기능 없음: UPX는 암호화 기능을 제공하지 않는다. 어느 정도의 코드 난독화를 제공하지만 압축된 데이터를 암호화하지는 않기 때문에 지적 재산이나 민감한 코드를 보호하는 것이 목표라면 UPX 압축과 함께 추가 조치가 필요하다.
  • 로드 시간 증가: 몇몇 패커는 빠른 압축 해제 및 짧은 로드 시간을 위한 다양한 압축 알고리즘 또는 최적화를 사용한다. 이에 비해 UPX는 로드 시간이 더 길 수 있다.
  • 제한된 고급 기능: 압축의 기본 요구 사항은 다루지만 다른 패커에서 제공하는 일부 고급 기능이 부족하다. 예를 들어 일부 패커는 암호화 기능, 보다 정교한 안티 디버깅 기술, 압축 알고리즘에 대한 사용자 지정 옵션을 제공하기도 한다.
  • 거짓 긍정: 맬웨어가 사용하는 압축 기술의 유사성으로 인해 UPX 압축 실행 파일을 일부 백신 프로그램에서 악의적인 것으로 표시할 수 있다.
  • 압축률 제한: 이미 압축되었거나 고도로 최적화된 바이너리와 같은 일부 파일은 UPX 압축으로 크기가 크게 줄어들지 않을 수 있다.

난독화 예시

소스코드 레벨(기반)

  1. 생소한 문법 사용
  2. 수식의 복잡화
    사실 간단한 수식이지만 일부러 복잡하게 표현
  3. 소스코드의 가독성저하
    고의적으로 사람의 눈으로 봤을 때 이해하기 어렵게 만듬

바이너리 기반

Basic Block : 반드시 한 묶음으로 실행되는 코드들
  1. Control Flow Flattening
    모든 베이직 블록들이 동일한 부모 베이직 블록을 갖도록 변형
    -> 베이직 블록들간의 순서/종속관계가 직접적으로 보이지 않게 만듬

왼쪽은 관계가 잘 보이지만 오른쪽은 안보임.

  1. Instruction Substitution
    명령어를 더 복잡한 버전으로 치환

  2. Bogus Control Flow

  • 가짜 분기문 추가

  • 매우 복잡하지만 반드시 True인 if문에 원본 코드 삽입(반드시 실행)

  • 매우 복잡하지만 반드시 False인 if문에 가짜 코드를 삽입(실행되지 않음)

    	분기문 : 조건문과 반복문에 중간에서 주어진 조건의 흐름을 바꿀 수 있는 구문

LLVM Obfuscator

  • 오픈소스 난독화 도구
    리눅스 바이너리에 대해서 적용 가능
  • 아래 프로그램의 실행결과가 어떻게 될 지 예상해보기

가상화기반 난독화

프로그램은 많은 바이너리 코드들로 이루어져 있다. 컴퓨터 내의 CPU라는 놈이 이 명령어들을 한땀 한땀... 한줄 한줄 실행한다. 그렇게 함으로써 우리가 <그림 3>과 같이 calc.exe를 실행할 수 있게 되는 것이다.
가상화기반 난독화의 경우는 프로그램을 만든 후, 이를 컴파일하여 실행파일을 만드는데, 코드 가상화 기법은 컴파일 과정에서 어셈블리 코드를 살짝 바꾼다. intel CPU용 어셈블리가 아니라, 가상화 CPU용 어셈블리로. 이것은 기존의 역공학 도구로 코드복원이 불가능하다. 따라서 작성한 코드를 안전하게 보호할 수 있게 된다. 또한 이렇게 가상화된 코드는 원래의 CPU에서 실행할 수 없다. 가상 CPU는, 프로그램 내에 소프트웨어적으로 구현되어 있다.

  1. 원래의 코드를 가상화 CPU용 코드로 변환합니다.
  2. 가상화 CPU는 그 코드를 실제 CPU가 이해할 수 있도록 해석합니다.
  3. 해석된 코드는 실제 CPU에게 읽히며, 프로그램이 실행됩니다.
  1. 분석을 불가능에 가깝게
    ex) 카카오톡 PC 버전

  2. 독자적인 ISA (Instruction Set Architecture)

    ISA : 어떠한 CPU에 대한 명령어 집합

  3. 가상의 CPU 계층을 소프트웨어적으로 하나 더 만듬
    CPU가 마치 2개가 있는 것과 같은 효과.

  4. 자바 가상머신
    자바 가상머신을 이용한 난독화

    색깔로 구분
    일반적인 가상화기반 난독화
    자바 가상머신을 이용한 난독화

  • 대상 언어
    C/C++, .NET 등 다양한 프로그래밍 언어로 작성된 코드에 적용
    Java 바이트코드에 중점을 두고 Java Virtual Machine 명령을 난독화
  • 가상 머신 아키텍처
    난독화된 코드를 위해 맞춤형 가상 머신이 특별히 설계됨. 프로그램을 실행하기 위해 사용자 지정 바이트 코드 또는 어셈블리 유사 명령을 해석하거나 JIT(Just-In-Time)로 컴파일.
    기존 JVM(Java Virtual Machine) 아키텍처를 활용하고 이미 JVM과 호환되는 바이트코드를 난독화
  • 난독화 기술
    명령 변환, 추가 간접 계층 추가, 가상화된 코드 암호화, 맞춤형 가상 머신 내 제어 흐름 난독화
    이름 바꾸기, 제어 흐름 난독화, 문자열 암호화, Java 바이트 코드에 특정한 상수 난독화
  • 런타임 환경
    특수 가상 머신 및 관련 지원 라이브러리를 포함하는 맞춤형 런타임 환경에 의존. 가상 머신은 가상화된 코드를 실행하고 필요한 런타임 서비스를 제공
    표준 JVM(Java Virtual Machine) 런타임 환경 활용.
  • 호환성 및 이식성
    가상화된 코드를 실행하기 위해 맞춤형 런타임 환경이 필요하기 때문에 호환성 및 이식성 측면에서 제한이 있을 수 있다.
    Java 가상 머신이 있는 모든 시스템과 호환. 난독화된 코드는 Java를 지원하는 모든 플랫폼에서 실행될 수 있다.

안티디버깅

디버깅을 방해하는 기술
디버깅을 못하게 한다 -> 양날의 검
유료 라이센스 프로그램 관점에선 좋은 기술
악성코드 관점에선 나쁜 기술

API 기반 안티디버깅

  1. FindWindow API
    인기 있는 디버거 응용 프로그램과 관련된 특정 창 클래스 이름 또는 창 제목이 있는지 확인
    FindWindow 함수를 호출하고 디버거와 관련된 창 클래스 이름 또는 제목(예: "OLLYDBG", "IDA Pro" 등)을 검색하여 프로그램은 디버거 창이 열려 있거나 실행 중인지 감지
  2. Registry Value
    디버거가 일반적으로 수정하거나 액세스하는 특정 레지스트리 값을 확인
    디버거는 종종 시스템 레지스트리에 흔적을 남겨 자신의 존재를 나타내거나 디버깅 세션과 관련된 정보를 저장한다.
    특정 레지스트리 키 또는 값을 검사하여 애플리케이션은 디버깅 관련 아티팩트가 존재하는지 확인하여 디버거의 존재를 감지
  3. IsDebuggerPresent API
    프로그램 실행 흐름의 초기 검사를 통해 디버깅 시도 감지
    디버거 감지 시 해당 동작을 종료하거나 수정

익셉션 기반 안티디버깅

  1. INT 3 (CC) 스캐닝

    INT 3 명령어(opcode CC) : 디버거에서 중단점으로 사용되는 소프트웨어 인터럽트 명령어

    프로그램 실행 중에 INT 3 명령어를 만나면 프로그램 실행을 일시 중단하고 제어.

  2. TRAP Flag 기반

    TRAP 플래그 : x86 아키텍처의 EFLAGS 레지스터에 있는 플래그

    TF 플래그가 설정되면 프로세서는 단일 단계 모드로 작동하여 각 명령 실행 후 트랩을 생성
    디버거는 종종 단일 단계 모드를 사용하여 명령별로 프로그램 명령의 실행을 추적하기 때문에 TRAP Flag 기반 안티디버깅 기술은 TF 플래그 값을 주기적으로 확인하여 예기치 않게 설정되었는지 감지
    프로그램이 예상하지 못한 TF 플래그가 설정되어 있는 경우, 디버거가 있음을 확인.

플래그 레지스터?
프로세서 작동과 관련된 다양한 상태 플래그를 보유하는 x86 아키텍처의 특수 레지스터

자료구조 기반 안티디버깅

Process Environment Block 내부 변수확인


안티가상화

가상화를 방해하는 기술


가상화

다양한 맥락에서 사용 (혼동되지 말아야 함)
1. 자바 가상머신
2. 클라우드 가상머신
3. 가상화 기반 난독화

여기서 말하는 가상화?
-> VMWare류의 가상머신 (클라우드에서의 가상머신)

  • 한 컴퓨터로 여러 대의 컴퓨터를 사용하는 효과
  • 복수의 운영체제 사용 가능 (리눅스, 윈도우7, 윈도우10, ...)

가상머신

정식 용어: 하이퍼바이저(hypervisor)

악성코드와 무슨 관계인가?

  • Sandbox 환경 구축
  • 무슨 일이 일어나도 원상복구 가능

가상머신 탐지

1.악성코드의 입장에서의 가상머신?

  • 분석환경으로 치부
  • 악성코드는 좋아하지 않음
  • 가상머신 내부임을 알아채면 종료

2.가상머신 환경에서의 실행?

  • 악성코드는 정상 환경이 아니라고 판단함
  • 악성코드 입장에서는 분석환경으로 인지

3.가상머신의 유행
AWS 등 클라우드 환경에서는 가상머신이 정상 환경
가상머신 탐지에 미치는 영향은?


안티에뮬레이션

에뮬레이션을 방해하는 기술

0개의 댓글