아래 코드는 HWPScan2 플러그인이 되기 위한 기본 클래스 구조이다. 클래스 내에 아래의 함수 중 하나의 함수라도 선언되어 있지 않으면 동작하지 않는다.
자세한 함수별 설명은 아래 "활용 예시"를 참고하도록 하자.
# -*- coding:utf-8 -*-
class HWPScan :
def init(self) :
return 0
def uninit(self) :
return 0
def format(self) :
return 'ALL'
def scan(self, pps_name, buf) :
return None
첫 번째로 살펴볼 함수는 init/uninit 함수이다. 이 함수들은 HwpScan2를 이용하여 사용자가 만든 플러그인을 참조하여 탐지할 경우 가장 먼저 동작하는 함수이다.
예를 들어 import 한 모듈을 load 하는 작업을 해야 하는 경우 init 함수 내에 작성하면 된다.
예제 코드
# -*- coding:utf-8 -*-
class HWPScan :
#-----------------------------------------------------------------
# 플러그인 초기화 작업을 한다.
#-----------------------------------------------------------------
def init(self) :
return 0
#-----------------------------------------------------------------
# 플러그인 종료화 작업을 한다.
#-----------------------------------------------------------------
def uninit(self) :
return 0
HwpScan2는 3.x 와 5.x 포맷의 한글 파일에 대해 검사를 수행한다.
플러그인 생성자는 해당 플러그인이 어느 포맷에 대해서 scan 함수를 동작하고 싶은지에 return 값을 지정해주면 된다.
3.x의 경우 HWP3을 5.x의 경우 HWP5 모든 한글 포맷에 대해 scan 함수를 동작시키고자 한다면 ALL을 리턴한다.
예제 코드
def format(self) :
return 'HWP5'
HwpScan2에서 취약점 검사 버튼을 누르면 이 함수가 동작한다.
scan 함수를 살펴보면 인자 값 두 개를 받는데, pps_name에는 한글 포맷의 어느 영역인지를 알려준다. (예시 : test.eps)
buf는 해당 영역의 데이터가 입력된다. 압축되어 있다면 해제된 상태로 입력된다.
취약점이 발견되었다면 취약점 이름을, 취약점이 없다면 None을 리턴한다.
예제 코드
def scan(self, pps_name, buf) :
apis = [ \
'UrlDownloadToFile',
'GetTempPath',
'GetWindowsDirectory',
'GetSystemDirectory',
'ShellExecute',
'IsBadReadPtr',
'IsBadWritePtr',
'CreateFile',
'CreateHandle',
'ReadFile',
'WriteFile',
'SetFilePointer',
'VirtualAlloc',
'GetProcAddress',
'LoadLibrary',
]
for api in apis :
if buf.find(api) != -1 : # 발견되었다면
ret = api + ' API'
return ret # 취약점 이름 문자열로 리턴
return None
이제 앞서 작성한 [apistring.py](http://apistring.py) 플러그인이 정상적으로 동작하는지 테스트를 해보도록 하자.
우선 작성한 apistring.py를 HwpScan2가 설치된 경로의 plugins 폴더에 넣어주도록 한다. 이후 HwpScan2를 실행 시켜 취약한 한글 파일을 열고 취약점 검사를 돌린다.
그럼 아래 그림과 같이 정상적으로 탐지를 하는 것을 확인할 수 있다.