작은 메모장
악성HWP문서 분석_PostScript 2,3 본문
그래서 이거 어떻함?
zlib으로 압축했으니, 다시 압축해제하면 됨
압축을 해제하는 python코드의 일부
if문으로 파일의 데이터를 받아오고
압축해제한 데이터를 다시 쓰는 코드형태
인자값을 알맞게 주어 압축해제를 진행
정상적으로 압축이 풀린 모습을 볼 수 있음
스크립트 분석
PostScript는 stack형 스크립트 언어로, 일반적인 프로그래밍 언어와 상당히 다른 문법을 보임
보통 프로그래밍 언어에서, 변수 a를 1로 지정하고 싶다면
int a = 1
인 기본적인 언어를 떠올림
하지만 PostScript는 다르게 동작함
GS>/a
GS<1>1
GS<2>def
이 코드는 PostScript의 인터프리터인 ghostscript의 a = 1을 선언하는 코드임
앞서 ghostscript는 stack형 언어라고 이야기함
처음으로 생성할 변수를 입력
두번째로 변수에 들어갈 값을 입력
마지막으로 두 데이터를 어떻게 할지 입력
이 과정을 거치면 메모리에 a = 1이 저장됨
이 내용을 바탕으로 코드를 분석
1 ~ 6번 코드
1번은 단순히 PostScript임을 나타내는 문구
2번은 변수를 forceput으로 설정하고 { }안의 내용을 입력하겠다 선언
{ }의 내용은 HWP 프로그램의 취약점
사용자가 호출할 순 없지만 { }에 정의된 문법으로 1policy에 정의된 .forceput에 접근
3~6번은 보호모드를 해제하고 사용자에게 파일 입출력 권한을 부여
9 ~ 23번 코드
9번은 "getenv" 함수를 사용하여 appdata 환경변수의 값을 반환받아 "envstr"변수에 저장
"envstr"에는 appdata의 경로가 들어가게 됨
10번은 "envstr"와 악성코드 세팅 파일을 stack에 저장
11번은 두 값의 위치를 변경
12번의 dup명령어로 스택 최상단의 envstr의 값을 복제
13번은 envstr 값, 즉 appdata 경로의 길이를 반환
14번은 인덱스 2번 위치에 있는 값을 복제하는 명령어, 0 1 2로 세므로, 악성코드 세팅 파일의 위치가 스택 최상단에 복제
15번의 명령어로 악성코드 세팅 파일의 위치 길이 또한 반환
16번의 명령어로 두 경로의 길이값이 저장
17번의 명령어로 합친 경로의 길이값만큼 String 문자열을 생성
18번의 명령어로 String 문자열 복제본을 2개 생성
19번의 명령어로 인덱스 4번째의 값을 현재 위치에서 -2 인덱스 위치로 변경
appdata 경로를 담고 있는 envstr가 인덱스 1번으로 이동
20번의 명령어로 envstr의 값을 아래 인덱스의 String에 모두 복사
0, 1, 2인덱스에 envstr값이, 3번 인덱스에 악성코드 세팅 파일의 위치가 존재함
21번의 명령어로 최상단의 envstr의 경로의 길이가 반환
22번의 명령어로 4번 인덱스에 위치만 악성코드 세팅 파일의 위치를 -1번 인덱스, 최상단으로 이동
23번의 명령어로 envstr 30바이트 뒤에 악성코드 세팅 파일이 합쳐짐
결과적으로 appdata의 경로와 악성코드 세팅파일의 경로가 합쳐짐
그리고 26번 코드에서 이를 path1에 저장
28 ~ 43번 코드
똑같은 방식으로, 이번엔 메모장의 경로를 받아들여 이를 path2에 저장
여기까지 왔을 때,
path1에는 시작폴더에 들어갈 bat파일이 들어가며
path2에는 appdata 밑에 존재하는 notepad.txt파일임
45 ~ 47번 코드
45번은 status로 배치파일의 상태를 반환, 그리고 이걸 status1에 저장
46번은 배치파일이 존재하지 않았을 때의 조건문을 실행
47번 명령어로 databuf1이라는 데이터 버퍼를 20748바이트의 크기를 가지를 string형 변수로 선언
49 ~ 58번 코드
49번은 file1 변수를 선언 후 여기에 path1 경로의 파일 포인터(쓰기) 값을 넣음
50번은 file2 변수를 선언 후 여기에 path2 경로의 파일 포인터(쓰기) 값을 넣음
51번은 file2 변수에 적힌 포인터를 이용해 데이터를 저장
52번에서 file2 파일을 닫음
53번은 file2 변수를 선언 후 여기에 path2 경로의 파일 포인터(읽기) 값을 넣음
54번은 file2의 포인터에 해당하는 파일의 값을 아스키코드로 변환한 값을 databuf1에 저장
55번은 file1의 포인터에 databuf1의 값을 씀
56번, 57번으로 file1, 2의 포인터를 닫음
위 과정을 거치면 시작프로그램 폴더에 이런 데이터를 가진 bat 파일이 생성됨
재부팅하면 위 명령을 시행하게 됨
'KISA 사이버 보안 훈련 > 스피어피싱 대응 심화' 카테고리의 다른 글
악성HWP문서 분석_익스플로잇 1 (0) | 2023.05.30 |
---|---|
악성HWP문서 분석_Macro 2 (0) | 2023.05.30 |
악성HWP문서 분석_Macro 1 (0) | 2023.05.30 |
악성HWP문서 분석_PostScript 1 (0) | 2023.05.30 |
악성 HWP문서 분석전략 (0) | 2023.05.26 |