2022. 1. 28. 05:29ㆍ보안 연구/Reversing
본 티스토리 블로그는 PC 환경에 최적화되어 있습니다.
모바일 유저분들은 아래 네아버 블로그를 이용해 주세요.
안녕하세요! ICMP입니다!
개인적인 귀차니즘이 있어서 개인적인 연구 차원에서 이렇게 기록을 남깁니다.
리버싱 문제를 풀다 보면 일차적으로 패킹이 걸려 있는지 확인, 압축 해제한 뒤 OEP로 이동하여 본격적인 분석을 진행합니다.
물론 upx와 같은 유명한 방식이거나 ida와 같은 디버거의 플러그인을 활용하면 언패킹이 가능하지만 개발자 직접 제작한 패킹 또는 암호화 방식이면 즉각적인 대응이 불가능합니다.
물론 동적분석 또는 샌드박스로 갈 수 있지만, 악성코드에 이러한 경우가 존재한다면 언패킹 자동화 기술은 상당히 유용할 것입니다.
국내, 해외 논문을 확인해 보니 조금 오래되긴 했지만 상당히 유용한 방식이 존재해서 여기에다 소개를 할까 합니다.
크게 실행 중 메모리를 체크하는 방법과 엔트로피의 변화량을 체크하는 두 가지가 존재하는데 여기서는 엔트로피 방식만 언급하도록 하겠습니다.
1. 엔트로피의 정의
들어가기 전, 엔트로피 정의를 이해하기 위해서는 "정보"와 "정보량"에 대한 정의를 알고 있어야 합니다.
정보 : 정보는 특정 목적을 위하여 광(光) 또는 전자적 방식으로 처리되어 부호, 문자, 음성, 음향 및 영상 등을 표현하는 모든 종류의 자료 또는 지식을 말한다.
정보량 : 컴퓨터에서는 정보를 표기하기 위해 필요한 비트 수를 의미 한다.
(이것이 바로 정보이론에서 말하는 엔트로피의 정의 입니다.)
예를 들어 on, off 정보를 기록하기 위해서는 0,1 즉 1개의 비트만 있으면 되겠죠? 이를 일반적인 파일에 적용하기 위해 샤논이라는 유명한 교수님께서 정보이론에 다음과 같이 식을 정의하셨습니다.
사진에서 나오는 p는 확률이고 log의 밑은 2로 수정하여 계산을 진행하시면 됩니다.
(10이 아닌 2를 밑으로 쓰는 이유는 컴퓨터가 이진수를 사용하여 데이터를 기록하기 때문이기에 비트를 기준으로 잡는 것입니다.)
2. 소스코드 구현
아래는 파이썬으로 파일의 엔트로피를 계산하는 과정을 구현하였습니다.
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 27 06:06:27 2022
@author: kimse
파일의 엔트로피를 계산해보자!!!
"""
import math
import os
def entropy_cal(file_dir):
f = open(file_dir, "rb")
entropy = [0 for i in range(256)]
for i in f.read():
for j in range(256): #파일 바이너리의 빈도값을 분석한다.
if(i == j):
entropy[i] += 1
print("- Byte Frequency")
for i in range(256):
if(entropy[i]==0):
continue
else:
print(str(i)+" : "+str(entropy[i])) #바이트 빈도값을 출력한다.
sum_entropy = 0
size = os.path.getsize(file_dir)
for i in range(256):
if(entropy[i]!=0):
sum_entropy += (entropy[i]/size) * math.log2(entropy[i]/size)
#p(x) = entropy[i]/size
#log2(p(x)) = math.log2(entropy[i]/size)
#참고로 math.log2인자에 0이 들어가면 domain 에러 발생하므로 주의.
print("Total ENTROPY : ",end='')
print(sum_entropy * (-1))
if __name__ == "__main__":
file_dir = str(input("파일 경로를 입력해 주세요. : "))
entropy_cal(file_dir)
아래는 엔트로피 계산을 위해 사용된 파일과 실행 결과입니다.
파일의 바이트 빈도수를 전체 파일 크기(byte)로 나누면 p(x)를 구할 수 있고, 실행 예제에서도 보았듯이 정확하게 계산된 모습입니다.
다음 포스팅에서는 언패킹 기법에 엔트로피가 어떤 방식으로 활용되는지 알아보도록 하겠습니다.
이상! ICMP였습니다!
감사합니다!