0. 개요

1. yara 룰 변환

2. yara 룰 추가

3. 예제 ( ELF )





0. 개요


  PE의 경우 종류가 많으며 이에 따라 최적의 분석 방식이 달라질 수 밖에 없기 때문에 관련 툴들이 이미 많이 나와 있다. PEid의 경우 지원은 이미 끝났지만 userdb.txt라는 텍스트 파일에 사용자가 직접 시그니처를 추가할 수 있다는 장점이 있다. exeinfo PE의 경우 개발자가 꾸준히 업데이트를 해주며 질적으로도 가장 쓸만해 보인다. 추가적으로 PEiD의 userdb.txt 파일에 대한 스캐닝도 지원하기 때문에 자율성도 존재한다.


  하지만 exeinfo PE의 경우 GUI 툴이라서 자동화가 쉽지 않고 개인적으로 필요한 만큼 업데이트가 빠르고 다양하지도 않으며 userdb.txt 파일을 사용하는 방식도 쉽지 않았다. 물론 모든 것을 직접 만드는 것 보다는 괜찮은 도구를 사용하는 것이 좋지만 yara라는 좋은 툴이 이미 존재하기 때문에 이미 이 yara와 이미 어느 정도 쓸만한 userdb.txt를 기반으로 추가적인 시그니처를 만들어서 그때그때 추가하기로 했다.





1. yara 룰 변환


  이미 만들어진 userdb.txt를 yara 룰로 변환하는 파이썬 스크립트가 있다. userdb.txt는 exeinfo PE에서 제공되는 최신 DB를 사용하였다.

[ https://blog.didierstevens.com/2015/03/18/update-peid-userdb-to-yara-rules-py/ ]


> peid-userdb-to-yara-rules.py userdb.txt -p > userdb_new.yar


  만들어진 yara 룰을 이용해서 테스트를 해보겠다.

> yara32.exe userdb_new.yar example.exe


  사용해 보면서 알게된 점이지만 시그니처가 다양하기도 하고 짧은 것도 존재하다 보니 적어도 몇 개 씩은 걸린다. 개인적으로는 더 가능성이 높더라도 하나의 결과만 나오는 것 보다는 몇 개 정도의 결과를 가지고 판단할 수 있는 방식이 더 괜찮아 보인다.


  참고로 yara에서 맞지 않아서인지 에러가 나오는 시그니처들이 약간 존재하는데 이 정도는 없어도 될 것 같다는 생각에 그 부분들은 삭제하기로 했다.





2. yara 룰 추가


  룰을 어떤 방식으로 추가할지는 본인의 선택일 것인데 개인적으로 Packer나 Protector들에 대한 분류 보다는 AutoIt이나 AutoHotKey 같이 스크립트를 바이너리로 변환한 것들을 인식하고 싶었으며 이러한 바이너리들은 String 만으로도 충분한 결과들을 볼 수 있기 때문에 그냥 간단하게 만들어 보았다. 사실 이렇게 하는 방식은 좋지 않아 보이지만 어차피 하면서 수정해 나가야 하기 때문에 예시로 사용한다.


  다음은 AutoHotKey의 B 버전에 대한 룰이다.


rule new_AutoHotKey_B_x86

{

    meta:

        description = "[AutoHotKey_B_x86]"

        ep_only = "false"

    strings:

        $version = {76 65 72 73 69 6F 6E 3D 22 31 2E 30 2E}

        $autohotkey = {6E 61 6D 65 3D 22 4D 69 63 72 6F 73 6F 66 74 2E 57 69 6E 64 6F 77 73 2E 41 75 74 6F 48 6F 74 6B 65 79 22 0D 0A 09 74 79 70 65 3D 22 77 69 6E 33 32 22}

        $arch = {70 72 6F 63 65 73 73 6F 72 41 72 63 68 69 74 65 63 74 75 72 65 3D 22 58 38 36 22}

    condition:

        $version and $autohotkey and $arch

}


  각각 다음과 같은 문자열들이다. 오토핫키의 x86 버전은 문자열 정보가 리소스 부분에 잘 나와 있어서 직관적으로 사용하였다. (버전의 경우 1.0 대가 B이며 L 버전이 1.1부터 시작한다)


[ version="1.0. ]

[ name="Microsoft.Windows.AutoHotkey"

type="win32" ]

[ processorArchitecture="X86" ]


  ep_only의 경우 여기서는 "false"를 사용했다. 사실 이것은 PEiD에서 사용된 것으로 보이며 실제 yara에서는 이것보다는 condition 부분이 중요하다. "true"를 사용하는 경우 다음과 같이 변수 뿐만 아니라 추가적인 명시가 필요하다.


condition:

    $a at pe.entry_point


  strings 부분은 변수들에 대해 Hex 값을 지정하였다. 중요한 부분은 condition인데 여기서는 2개의 and 연산을 통해 3 변수 모두 충족되어야 하는 것이 조건이다. and 외에도 or, not 등이 사용될 수 있다. 다음은 3가지 변수 모두 충족됨과 동시에 변수 $ansioruni가 존재하지 않아야 하는 조건이다.


condition:

    ($version and $autohotkey and $arch) and (not $ansioruni)





3. 예제 ( ELF )

  다음은 Avast의 Retdec Team에서 공개한 UPX 시그니처의 일부이다.


import "elf"


rule upx_arm_391_lzma

{

meta:

tool = "P"

name = "UPX"

version = "3.91 [LZMA]"

source = "Made by Retdec Team"

pattern = "00000000F04F2DE930D04DE200308DE50030D0E50250D0E501E0D0E500C09DE514308DE55C309DE50040A0E300408CE5004083E514C09DE50130D0E503308CE0"

start = 380

strings:

$1 = { 00 00 00 00 F0 4F 2D E9 30 D0 4D E2 00 30 8D E5 00 30 D0 E5 02 50 D0 E5 01 E0 D0 E5 00 C0 9D E5 14 30 8D E5 5C 30 9D E5 00 40 A0 E3 00 40 8C E5 00 40 83 E5 14 C0 9D E5 01 30 D0 E5 03 30 8C E0 }

condition:

$1 at elf.entry_point + 380

}


  ELF 포맷에 맞게 "elf"를 import해서 자동으로 EP 즉 elf.entry_point를 지정하여 시그니처 범위를 자동으로 Entry Point로 지정할 수 있다.



Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
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

최근에 올라온 글

최근에 달린 댓글

글 보관함