tmxklab
Obfuscation(encoding, crypto, packing) 본문
1. Intro
악성코드는 다양한 난독화(Obfuscation)기술을 통해서 탐지하거나 리버싱하기 어렵게 만들도록 한다. 일반적으로 인코딩/암호화/패킹 기술을 사용한다. 주로 다음과 같은 이유로 난독화 기술을 적용한다.
- C&C 통신 은닉
- IDS와 같은 시그니쳐 기반 솔루션 우회
- 설정 파일 은닉
- 몰래 빼내는 정보 암호화
- 바이너리에 있는 문자열 은닉
등등.. 다양한 이유가 있겠지만 탐지나 분석를 어렵게 하거나 중요한 정보를 숨기기 위해서 사용한다.
2. Encoding
대부분 Base64 또는 xor 인코딩과 같은 매우 간단한 인코딩 알고리즘을 사용해 데이터를 모호하게 한다. 이렇게 간단한 알고리즘을 사용하는 이유는 구현이 쉽고 리소스를 조금 소모할 뿐만 아니라 분석가로부터 모호하게 만들 수 있기 때문이다.
1) Caesar cipher
- 가장 간단한 인코딩 기술이며 평문에 있는 각 문자를 고정된 수 위치만큼 이동
- 문자를 암호화할 수 있지만, 바이너리 데이터를 암호화하기엔 충분하지 않음
2) Base64 Encoding
- 바이너리 데이터를 ASCII 문자열 포맷으로 인코딩
- 디코딩하는 방법은 인코딩 반대 과정
- 패딩이 사용되면 '='문자를 Base64 인코딩한 문자열 끝에서 볼 수 있음
- 식별하는 방법은 바이너리에 포함된 문자열 중에서 Base64 인코딩하는데 사용되는 문자 집합 확인(영문자,숫자,+,/)
3) XOR Encoding
- Base64 인코딩 외에도 흔히 사용되는 인코딩
① Single Byte XOR
- 평문의 각 바이트를 암호화 키와 XOR하는 방식
- 키 길이는 1byte(0x1 - 0xff)이므로 모든 키를 무차별 대입하여 의미있는 정보가 나옴으로써 XOR 키 탐색 가능
② Multi Byte XOR
- 앞서 언급한 무차별 대입 기술에 방어력을 높은 멀티 바이트 XOR 사용
- 예를 들어 4byte XOR 키를 사용하게 되면 총 경우의 수가 0xFFFFFFFF개로 늘어남
XOR 인코딩 식별 도구)
3. Crypto
악성코드가 암호화되어 있으면 주로 암/복호화 함수와 암/복호화하는데 사용하는 키를 식별해야 한다. 바이너리에서 암호화 기능의 사용을 확인하고자 다음과 같은 시그니쳐를 식별할 수 있다.
- 암호화 함수를 참조하는 문자열 또는 임포트
- 암호화 상수(Crptographic Constants)
- 암호화 루틴에 사용하는 고유의 명령 순서
암호화 시그니쳐 식별 도구) - signsrch
암호화 시그니쳐는 signsrch.sig에 존재
암호화 상수 탐색 도구) - Findcrypt(IDA Pro plugin)
암호화 시그니쳐 Yara rule 관련)
+) 암호화 상수를 사용하지 않는 RC4와 같은 암호화 알고리즘은 암호화 시그니쳐를 이용해 탐지하기 어렵다. RC4 암호화 알고리즘 구현이 쉽기 때문에 종종 사용된다. 다음 링크 참고
+) CyberChef -> 거의 모든 종류의 인코딩, 암호화, 압축 알고리즘 지원
+) PyCryto(Python 복호화 모듈)
해시 알고리즘 : HMAC, MD2, MD4, MD5, RIPEMD, SHA1, SHA256 등등 지원
암호화 알고리즘 : AES, ARC2, Blowfish, CAST, DES, DES3, IDEA, RC5, ARC4 등등 지원
+) Custom Encoding/Cryto
자신만의 Encoding/Cryto scheme을 사용하게 되면 암호화(또는 키)의 식별이 어려워지고 리버싱도 어려워진다. 이러한 방법 중 하나가 인코딩과 암호화를 조합하는 방법이다.
-> 관련 악성코드 : Etumbo
4. Packing
패킹은 정상 바이너리 파일을 패커를 통해 실행 압축시킨다. 압축파일과는 다르게 압축해제 없이 바로 실행할 수 있다. 패커의 목적은 분석을 어렵게하고 탐지를 회피하기 위해서 사용되며 대부분 악성코드는 패킹된 상태로 발견된다. 패킹된 바이너리는 매우 적은 정보만 노출되어 임포트 함수의 수가 매우 낮아지고 프로그램 명령이 난독화된다. 따라서, 패킹된 바이너리를 분석하기 위해서는 언패킹(난독화 레이어 제거)을 수행해야 한다.
패커 특징)
- 파일의 크기를 축소시키기 위해 압축
- 파일이 실행되는 경우에만 언패킹되어 메모리에 로드
- 정적 분석을 통한 탐지를 어렵게 만듦
- 언패킹하지 않으면 코드 수정 및 확인 x
정상 바이너리가 패커에 전달되면 파일은 압축되고 언패킹 스텁(unpacking stub, 압축해제 루틴)이 추가된다. 그런 다음 패커는 EP(Entry Point)를 스텁 위치로 변경하고 새롭게 패킹된 실행 파일을 생성한다.
패킹한 바이너리를 실행하면 unpacking stub에서 원본 바이너리를 추출한 다음 원래 OEP로 전달하게 된다.
패킹된 바이너리를 언패킹하려면 2가지 방법이 존재한다.
- 수작업으로 언패킹
- 언패커로 언패킹(자동화)
1) 수작업으로 언패킹
① OEP 식별 및 OEP에 도달할 때까지 프로그램 실행
② 언패킹된 프로세스를 디스크로 덤프
③ 덤프한 파일에서 IAT를 수정
OEP를 직접 식별하고 수작업하는 방법보다 x64dbg의 plugin에 Scylla를 이용하여 프로세스 메모리 덤프하는 것이 편함
x64dbg의 Scylla플러그인을 이용해 프로세스 메모리 덤프 뜨는 방법)
2) 자동화된 언패커
VMUnpacker -> 다수의 언패킹 지원(근데 64bit지원안해주는 것 같음, 64bit binary 언패킹안됨)
다른것도 찾아봐야함, 사용해보고 괜찮은 것 있으면 새로 업데이트하기
'Security > 07 Malware Technique' 카테고리의 다른 글
Hooking (악성코드 관련) (0) | 2021.04.22 |
---|---|
DLL Injection using shim (0) | 2021.04.22 |
다양한 인젝션 기술 (0) | 2021.04.20 |
SetWindowsHookEx DLL Injection (0) | 2021.04.20 |
APC Injection (4) | 2021.04.19 |