목차
0. AutoHotkey1 파일 실행
1. 오토핫키 이해
2. OllyDbg 디버깅
3. 오토핫키 스크립트 사용법
4. 오토핫키 취약점
[Review] (6주차) 실습
[IDA Pro] chap.06 악성코드 정적분석 툴 사용법(Ransomware, reversing.kr)
목차 0. Ransomware 파일 내부 1) file 정보 2) readme.txt 파일 3) run.exe 파일 1. run.exe 파일 실행 1) Exeinfo.exe 설치 2) HxD 설치 3) UPX 설치 4) OllyDbg 설치 5) WOW64 설치 2. IDA run.exe 파일 분석 3..
sarahee.tistory.com
0. AutoHotkey1 파일 실행
readme.txt 파일 확인
Decrypt, EXE Key는 md5 값이며, 해당 md5를 복호화하여 인증키 획득 가능
문제에서 요구하는 key 값: decrypt, exe
AutoHotKey는 해당 언어로 된 소스코드를 exe로 컴파일할 때 비밀번호 지정(무분별한 디컴파일 방지를 위해)
→ DecryptKey: 디컴파일 시 필요한 비밀번호, 바이너리가 실행될 때 메모리 상에서 평문 형태로 존재
→ EXE's Key: 디컴파일된 소스코드 내 사용자에게 요구하는 값, 소스코드에서 확인 가능
1. 오토핫키(AutoHotkey) 이해
- 윈도우 응용 프로그램 및 매크로를 만드는 오픈 소스 자유 소프트웨어이자 스크립트 언어
- 사용자가 반복작업을 자동으로 할 수 있도록 도와줌, 간략하게 매크로 프로그램이라고 이해
참고. 접근성
// C Language
#include <stdio.h>
int main(void) {
print("Hello world!");
return 0;
}
// AutoHotKey
Msgbox, Hello world!
다운로드
스크립트 확장자는 .ahk이고, 설치하면 Compiler 폴더의 Ahk2Exe를 사용하여 ahk를 exe로 컴파일 가능
→ AutoHotKey 프로그램에 비밀번호를 설정한 후, 입력 값 일치하면 프로그램을 실행할 수 있도록 하는 기능
따라서 ahk.exe 파일에 입력해야 하는 비밀번호가 decript's key가 됨
- Exe2Aut.exe 디컴파일러
- ank의 password: decript's key
ahk.exe 파일 확인
입력 창에 임의의 문자를 입력한 후, OK 버튼을 누르면 프로그램이 종료
패킹된 파일을 그대로 디버거로 로드하면, 함수나 문자열 등 제대로 확인하기 어려움
파일을 제대로 분석하기 위해서는, 디버깅 상태에서 다음과 같은 명령어를 확인해야 함
- F2: 브레이크 포인트 설정
- F7: 디버깅 중 프로그램을 한 줄 실행시킴
- F8: 디버깅 중 프로그램을 한 줄 실행시킴(call 명령어가 있을 경우에는 해당 함수로 들어가지 않음)
UPX(Ultimate Packer for eXecutables): 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램
exe 파일이 압축되어 있어서 내부 구조 확인하기 어려움
(패킹: -o, 언패킹: -d 옵션)
다시 exe 파일 실행 시 출력 화면이 다음과 같이 변경
파일 검증하는 CRC 체크 부분에서, 위와 같은 EXE corrupted 문구 출력
컴파일 후 변조가 되면 해당 문자열 출력
HS_EXEArc_Read::Open 함수에서 체크하여, 이후 어떤 분기문으로 이동할 지 스크립트를 실행시킴
→ UPX 언패킹한 바이너리 분석 시 CRC 체크 영역에 걸려서 에러
오토핫키 프로그램은 컴파일 시 자동으로 UPX 패커를 적용시키기 때문에 언패킹을 한 이후 분석을 하면 DecryptKey를 찾을 수 없음(디컴파일 시 필요한 비밀번호이므로)
+ 알고리즘을 숨기고 복원하는 과정에서 힌트를 얻고 디컴파일을 수행할 수 있겠지만, 해당 프로그램 특성 상 언패킹 시 분기문에서 탈락하도록 설정했으므로 의미 없음
하단의 >AUTOHOTKEY SCRIPT< , >AHK WITH ICON<
특정 함수의 반환값을 조건으로 "EXE corrupted" 메시지 박스를 띄우고 종료하는 분기
">AUTOHOTKEY SCRIPT<" 문자열을 사용하는 함수를 호출하는 분기
2. OllyDbg 디버깅
OllyDbg: 바이너리 코드 분석을 위한 x86 디버거(소스 코드가 없을 때 주로 사용)
- 레지스터 추적, 함수/API 호출, 문자열 인식, 오브젝트 파일과 라이브러리 내 루틴 위치 검색
바로 Debug Run할 경우, (or F9 단축키)
Options > Debugging options (or) Alt + O > Events 버튼 클릭하여 Make first pause at: Entry point of main module 체크
* 제어가 운영 체제에서 컴퓨터 프로그램으로 이동하는 것 → 패킹된 파일의 실제 프로그램 시작 부분
OllyDbg 활용 OEP 확인
OEP란? unpacking에서 가장 중요한 부분(Original Entry Point)
packing되기 전으로 돌아간 곳, 덤프를 통해 packing 해제된 파일을 만듦
UPX로 압축하면 PUSHAD와 POPAD 어셈블리어는 필수적으로 생성
PUSHAD 실행 이후 맨 위의 스택 주소를 덤프하여 BYTE H/W BreakPoint를 지정하고 실행해서 POPAD 다음에서 멈추도록 함
JMP 명령어를 통해 OEP로 이동
* 스택에서 레지스터들이 POP이 되는 순간을 캐치하면 OEP로 진입할 수 있는 힌트를 찾아낼 수 있을 것
Entry point breakpoint
PUSHAD로 시작하는 첫번째 instruction 조회
PUSHAD 명령어: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 모든 레지스터를 stack에 PUSH하는 역할
일반적인 packer는 특정 위치의 레지스터들의 백업을 만들어 놓기 위해 처음에 PUSH 명령을 이용하여 저장
(∵ 패킹된 파일이 루프를 돌면서 연산을 하게 됨, 기존 레지스터가 수정될 수 있기 때문에 저장, 루틴이 모두 끝나고 정상 코드를 실행시킬 때 이 레지스터들을 돌려 받기 위함)
→ 파일 메인 프로그램이 실행되기 전에 POP instruction으로 레지스터를 복귀
(참고) System breakpoint 설정했을 경우
- 2사분면(Code Window) 왼쪽: 주소 창(명령어가 실행되는 주소)
- 2사분면(Code Window) 가운데: 기계어(OP 코드 창)
- 2사분면(Code Window) 오른쪽: 어셈블리어(디스어셈블리 창)
- 1사분면(Register Window): 레지스터 값 표시
- 3사분면(Dump Window): 메모리 덤프 창 - 특정 시점에 작업 중이던 메모리 상태(주소, Hex dump, hex to ASCII 해석 내용) 기록
- 4사분면(Stack Window): 스택 주소 값, comment 순으로 출력
PUSHAD 위아래 추가 설명
POPAD 명령어 실행 전 루프문들이, 압축된 코드를 해제하는 과정
Dump Window의 Ctrl+G > (Enter expression to follow in Dump:) ESP 입력 후 확인
* 스택 프레임의 끝지점 주소가 저장되는 최상단 구간(ESP)
Hex dump 부분 우클릭 > Breakpoint > Hardware, on access > Byte
다시 Run하면 하드웨어 브레이트 특성 상 Breakpoint 설정 명령어 이후 제어가 멈추므로 0x00471BCC에서 Paused됨
아래로 스크롤하다 보면 거의 마지막 코드에 POPAD
JMP 명령어 뒤에 오는 주소가 OEP임(ahk.00442B4F)
해당 주소로 점프(Ctrl+G)하여 조회
Ctrl+A: 코드 분석(다시 읽기)
Ctrl+F: POPAD 찾기
Compressed code?
Quick statistical test of module 'ahk' reports that its code section is either compressed, encrypted, or contains large amount of embedded data. Results of code analysis can be very unreliable or simply wrong. Do you want to continue analysis?
AutoHotKey의 패킹된 바이너리를 실행해서 OEP까지 간 다음 CRC 체크를 통해 에러가 발생했을 때 출력되는 문자열 영역을 기준으로,
바로 위에 있는 CRC 체크 함수 내부를 분석
hash 처리된 값 하나가 EBX에 추가됨
publicKeyToken="6595b64144ccf1df"
Exe's key = 54593f6b9413fc4ff2b4dec2da337806
decrypt key = 220226394582d7117410e3c021748c2a
MD5로 decrypt 수행
https://www.md5online.org/md5-decrypt.html
→ pawn isolated
3. 오토핫키 스크립트 사용법
오토핫키 스크립트는 오토핫키 소스코드가 보관되어 있는 곳
프로그램이 실행될 때 스크립트를 열어서 소스코드를 확인하면서 돌아가는 것
바탕화면 우클릭하여 새로 만들기(W) > AutoHotKey Script
새 script 생성(이름 바꾸기)
우클릭 > 더 많은 옵션 표시 or Shift+F10 단축키 클릭하여 Edit Script
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
본래 내용을 지우고 다음과 같이, F1버튼을 눌렀을 때 hello라는 메시지 창이 나오도록 코드 작성
이후 저장하고 창 닫기
- .ahk 파일 우클릭하여 Compile Script 하면 .exe 파일이 생성
- .exe 파일을 관리자 권한으로 실행하여 하단 바에 AutoHotKey icon 생성
F1 단축키 클릭 시 다음과 같은 화면 출력
4. 오토핫키 취약점
CVE-2020-18174 취약점
AutoHotkey 1.1.32.00의 setup.exe에 있는 프로세스 주입 취약점으로 인해 공격자가 권한을 상승시킬 수 있음
reversing.kr에서 다운로드 받은 파일 버전: 1.0.48.5
'Security & Analysis > IDA Pro' 카테고리의 다른 글
[IDA] 분석 과정 단축키 모음 (0) | 2022.12.25 |
---|---|
[IDA] MIPS 레지스터 및 주요 명령어 정리 (0) | 2022.12.20 |
[IDA Pro] chap.06 악성코드 정적분석 툴 사용법(Ransomware, reversing.kr) (0) | 2022.08.24 |
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF) (0) | 2022.08.06 |
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review) (0) | 2022.07.19 |