Notice
Recent Posts
Recent Comments
Link
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags
more
Archives
Today
Total
관리 메뉴

Dev

yara와 yara의 대체를 찾아서(1) 본문

Cyber Security

yara와 yara의 대체를 찾아서(1)

flutterbylily 2023. 2. 12. 18:50

yara는 나한테 애증의 툴이다.

AICT에서 진행하던 프로젝트에서 유일하게 발목 잡았던 부분이었고

프로젝트가 흔들렸던 시점도 yara 투입부터였다.

그때 당시는 시간이 없어서 그랬는지 yara의 대체할 수단을 찾아볼 생각을 못했는데

이제와서 이 프로젝트를 회생시키려 하니... 필요시 대체하겠다는 다짐을 했다.

우선 1장은 yara에 대해서 전반적으로 정리해보도록 하자.

 


yara는 간단하게 말해서 악성코드의 시그니처(Signature)를 이용해 악성파일 분류하는 툴이다.

악성코드의 시그니처를 이용한다고 했는데 샘플 파일, 프로세스에 포함되어 있는 string이나 binary 패턴을 

 

💫Yara의 정의

간단하게 말해서 악성코드의 시그니처를 이용하여 악성 파일을 분류하는 툴.

 

  • 악성코드의 시그니처(Signature)란?

    악성코드 샘플 파일, 프로세스에 포함된 string 또는 binary 패턴.

    따라서 탐지하고자 할 때, string 탐지와 binary 탐지로 분류.

 

 

시그니처 외에도 특정 Entry Point 값을 지정하거나, 파일 오프셋(File Offset), 가상메모리 주소(Virtual Memory Address)를 제시하고 정규표현식(Regular Expression)을 이용해 효율적인 패턴 매칭 가능.

 

💫시그니처 기반 탐지

 

1) String 탐지

Value의 String들을 탐지하는 방법.

 

2) Binary 탐지

파일 내부의 Hex값을 탐지하는 방법. 

 

 

💫Yara 사용

yara는 Linux, Mac, Windows OS에서 모두 사용 가능.

소스코드를 직접 컴파일 하거나 yara 실행파일을 직접 실행, 또는 python 확장을 통해 yara 사용 가능.

 

  • Yara Rule 작성

    C, Python으로 작성. yara rule을 작성할 때 갖춰야 하는 최소한의 형태는 다음과 같다.

 

  • 최소한의 Yara rule 작성
rule 룰_이름
{
    condition:
    	Boolean 값
}

 

악성을 판별할 파일이 rule의 condition 조건에 true가 될 경우, yara 명령 실행시 규칙에 맞음을 출력.

false가 되면 출력하지 않는다.

 

  • 기본적인 Yara rule 작성
rule 룰_이름
{
	strings:
    	$str = " "
        $hex = { 00 00 00 00 }
        $re = /   /
    condition:
    	Boolean 값
}

1) 룰_이름

영문자와 숫자, 밑줄 문자 포함 가능, 첫번째 문자는 숫자를 사용할 수 없다.

(예약어 키워드도 사용할 수 x)

 

 

2) strings:

텍스트 스트링 형태, hex 스트링 형태, 정규 표현식 형태로 작성 가능.

식별자 $를 앞에 붙여 구문을 작성한다.

 

(1) 텍스트 스트링 형태

" " 사이에 ASCII 인코딩, 대소문자를 구분하는 문자열을 표현. 

대소문자 구별하지 않을 시 " " 뒤에 nocase 키워드 작성.

 

(2) hex 스트링 형태

{ } 사이에 16진수 문자열 hex 값 입력.

Wild-cards, Jumps, Alternatives 등 3가지를 이용하여 대체 가능.

 

① Wild-Cards

hex값을 알지 못하거나 어떠한 바이트가 있더라도 상관이 없을 때는 Wild-Cards를 사용.

물음표(?)를 이용하여 바이트를 대체 가능.

ex) ?? or ?4 등.

 

② Jumps

물음표(?)로 나타낼 수 있는 정확한 길이를 모르는 경우는 Jumps를 사용.

최대 [0-255]까지 허용하지만 너무 범위가 크게 설정되어 있으면 패턴 매칭 성능 저하가 우려되므로 적절한 범위 설정 필요

ex) { ... E4 [ 2-5 ]  AE ... } -> E4와 AE 사이에 2~5바이트의 길이가 랜덤으로 들어갈 수 있다는 의미.

 

③ Alternatives

OR( | )를 사용하여 하나의 글자 또는 여러 글자를 조건에 부합시킬 수 있음.

ex) { AE (00|22) FF } : { AE 00 FF } 와 { AE 22 FF }

 

(3) Regex(정규표현식, Regular expression)

특정한 규칙을 가진 문자열의 집합을 표현할 때 사용하는 형식 언어, 즉 정규표현식을 사용.

/   /(두 개의 슬래시) 사이에 나타냄. 정규표현식에 'nocase', 'wide', 'ascii', 'fullword'의 기능 사용가능.

 

 

3) Conditions:

결과값이 참인지 거짓인지 (True or False) 판별, 즉 Boolean 값으로 결과가 나타난다.

C 연산자 모두 사용 가능(AND, OR, NOT, != ...)

 

* 연산자 # : 해당 식별자가 등장하는 횟수

ex) #a == 10 (a라는 식별자가 파일에서 10번 등장함을 의미)

 


계속 추가할 부분이 있으면 수정하겠지만.

다음장에서는 yara와 다른 툴을 비교하고 더 자세히 다뤄보는걸로 마무리.