목차
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. OllyDbg run.exe 파일 분석
4. Key값 구하기
5. 소스코드 정리 및 연산 수행
6. 최종 실행 및 Flag 확인
[Review] (5주차) 실습
2022.08.06 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)
0. Ransomware 파일 내부
zip 파일의 압축을 풀면 다음과 같이 file 및 txt, exe 총 3개의 파일 생성
file에 파일 확장자가 없기 때문에 바이너리 형식으로 암호화되었다고 판단
따라서 16진 편집기인 HxD 사용 예정
1) file 정보
2) readme.txt 파일
file 확장자가 exe
ui 파일을 .py로 변경(Pyutic)
3) run.exe 파일
1. run.exe 파일 실행
IAT: Import Address Table, 프로그램이 어떤 라이브러리에서 어떤 함수를 쓰는지 기술한 테이블
프로그램이 특정 API를 실행하고자 할 때 IAT를 불러옴
압축되어 있어서 확인 불가
해당 파일이 압축되어 있어서, 내부 정보 확인이 불가
1) Exeinfo PE 파일 다운로드하여 정보 확인
https://exeinfo-pe.kr.uptodown.com/windows
파일이 UPX로 패킹되어 있음
(언패킹된 프로그램을 출력 시 컴파일된 언어 등 조회 가능)
2) HxD 설치
Window 용 16진 편집기, 디스크/메모리 편집기, 프로세스 실행에 사용되는 메모리를 표시하고 편집할 수 있음
https://mh-nexus.de/en/downloads.php?product=HxD20
3) UPX 설치
하단 Unpack info
Big sec. 2 [ UPX1 ] , unpack "upx.exe -d" from http://upx.github.io or any UPX/Generic unpacker
해당 사이트에 접속하여 설치 진행
UPX란?
the Ultimate Packer for eXecutables, 오픈 소스 실행 파일 압축 프로그램
upx.exe -d run.exe
4) OllyDbg 설치
https://www.ollydbg.de/download.htm
5) WOW64 설치
운영체제의 하위 시스템, 32비트 윈도우와 64비트 윈도우의 차이 보완
모든 64비트 버전의 마이크로소프트 윈도우에서 32비트 응용 프로그램들이 돌아가도록 도와줌
https://ko.dll-files.com/wow64.dll.html
zip 파일 압축 해제 후, regsvr32 wow64.dll
2. IDA run.exe 파일 분석
cmd 명령어에서 확인한 Key 문자열 검색하여 알고리즘 확인
Key의 입력값이 byte_44D370에 저장
call [접근할 함수 주소]
file 문자열 확인
StartAddress Functions 내부 file open
함수 시작 부분에 코드 반복 ← 파일 크기 키우고, 분석에 어려움을 주기 위함
rb는 file을 읽는 형식
read binary, 즉 바이너리 형식으로 파일을 읽겠다는 의미
좌측 printf: '파일을 찾을수 없다!' 문자열 출력 구문
하단 Stream
* Stream: 컴퓨터 처리 환경에서, 시간이 지남에 따라 사용할 수 있게 되는 일련의 데이터 요소
fseek: fopen으로 호출된 파일의 위치 변경
ftell: 스트림 위치 지정자의 현재 위치(파일 포인터)
feof: stream(FILE)의 파일 끝 플래그가 설정되었는지 여부 표시, 파일의 끝 위치 확인
fgetc: 파일에서 글자를 하나씩 읽는 함수
→ feof를 이용해 파일의 끝에 도달할 때까지 fgetc 함수를 통해 1byte씩 file 파일로부터 읽어들임
wb, binary 형식으로 file을 쓰겠다는 의미
- 좌측 하단 printf: '파일을 복구했다! ~' 문자열 출력
- 우측에 핵심 부분으로 복호화를 수행하는 loop 존재
알고리즘 loop
1) xor edx, edx - ebp+Stream 등.. 의미 없음(모두 0이 되므로, 초기화하는 과정)
2) div [ebp+var_C] - 입력한 key가 DIV 연산에 의해 끝 byte에 도달했을 때, 처음 byte로 돌아감
3) xor ecx, edx - input으로 입력한 key 중 한 byte와 XOR 연산 수행(ecx: 입력값(반복 카운터), edx: key값)
4) xor edx, 0FFh - 위의 결과와 0xFF XOR 연산 수행
XOR 연산의 성질에 의해, Key를 찾기 위해 file 파일과 0xFF를 XOR
Original File을 바이트 단위로 XOR
Original File은? readme.exe 파일의 hint에 의해 복호화된 파일은 exe 파일(PE구조)이라는 것을 판단
3. OllyDbg run.exe 파일 분석
4. Key값 구하기
file이 exe 포맷이므로, header 구조는 다른 exe 파일과 동일할 것
00000000 ~ 00000070까지 대부분 동일한 헤더값을 가지며,(00000030의 F0, 80 차이)
키 값을 모르기 때문에 0x20 크기 복호화
- 복호화 되어야 할 값:
- 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 F0 00 00 00
0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68
69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F
74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20
6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00
- 암호화된 값:
- DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B
34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
9E 86 9C 97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 9C
97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 6C 97 9A 8C
82 8C 20 85 8C 3B 9A 53 A7 24 96 D6 41 AD C7 F2
E2 FF AF E3 EC E9 FB E5 FB E1 AC F0 FB E5 E2 E0
E7 BE E4 F9 B7 E8 F9 E2 B3 F3 E5 AC CB DC CD A6
F1 F8 FE E9 A2 9E 97 81 A8 8F 93 9E 86 9C 97 9A
5. 소스 코드 정리 및 연산 수행
해당 파일이 최종 구현된 소스코드
key = input('Key : ').encode()
f = open('./ransomware/file', 'rb')
enc_content = f.read()
f.close()
dec_content = []
for i in range(len(enc_content)):
dec_content.append(enc_content[i] ^ key[i % len(key)] ^ 0xFF)
dec_content = bytes(dec_content)
f = open('file', 'wb')
f.write(dec_content)
f.close()
de_file[i] = en_file[i] ^ key[i] ^ 0xFF → key[i] = en_file[i] ^ de_file[i] ^ 0xFF
원본 데이터가 반복이라면, key 값만 달라지기 때문에 key의 길이만큼 동일 데이터가 반복될 것
# sol1
# 20 bytes
# 암호화된 값 : DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
# 복호화 되어야 할 값: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
enc_content = [0xDE, 0xC0, 0x1B, 0x8C, 0x8C, 0x93, 0x9E, 0x86, 0x98, 0x97, 0x9A, 0x8C, 0x73, 0x6C, 0x9A, 0x8B, 0x34, 0x8F, 0x93, 0x9E, 0x86, 0x9C, 0x97, 0x9A, 0xCC, 0x8C, 0x93, 0x9A, 0x8B, 0x8C, 0x8F, 0x93]
dec_content = [0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
key = ''
for i in range(len(enc_content)):
key += chr(dec_content[i] ^ enc_content[i] ^ 0xFF)
print(key)
# sol2
enc_content = "DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93".split(' ')
dec_content = "4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00".split(' ')
for i in range(len(enc_content)):
enc_content[i] = int(enc_content[i], 16)
dec_content[i] = int(dec_content[i], 16)
enc_content[i] = enc_content[i] ^ 0xFF
enc_content[i] = enc_content[i] ^ dec_content[i]
print(chr(enc_content[i]), end="")
결과값: letsplaychess 반복
6. 최종 실행 및 Flag 확인
기존의 file을 확장자 변경(exe) 후 실행하면, 다음과 같이 실행 불가
run.exe 파일 실행 후 결과값(Key : letplaychess) 입력
'Security & Analysis > IDA Pro' 카테고리의 다른 글
[IDA] MIPS 레지스터 및 주요 명령어 정리 (0) | 2022.12.20 |
---|---|
[IDA Pro] chap.07 악성코드 정적분석 툴 사용법(AutoHotkey1, reversing.kr) (0) | 2022.10.06 |
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF) (0) | 2022.08.06 |
[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review) (0) | 2022.07.19 |
[IDA Pro] 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (0) | 2022.07.04 |