728x90
반응형
목차
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)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

목차 1. Easy ELF 실습 - 실습을 위한 사전 단계(Linux 파일 실행) 2. 분기문 분석 3. byte 및 배열 정리 4. 소스코드 작성(어셈블리어 기반) [Review] (4주차) 이론 - 총정리 2022.07.19 - [Security & Analysis/..

sarahee.tistory.com


0. Ransomware 파일 내부

랜섬웨어 암호화 file 및 txt, exe 파일

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

 

Exeinfo PE (Windows)

Exeinfo PE을 위한 Windows을 무료로 다운로드하세요. .exe 파일 확인하기. Exeinfo PE는 여러분이 .exe 파일들을 확인하여 그 속성을 살펴볼 수 있는 프로그램입니다. 또한, 해당 파일의 이름을 변경하고

exeinfo-pe.kr.uptodown.com

파일이 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, 오픈 소스 실행 파일 압축 프로그램

Download latest release > upx-3.96-win64.zip
다운로드 받은 upx.exe 파일을 unpacking하고자 하는 exe 파일에 위치

upx.exe -d run.exe

Not packed, 내부 정보 확인 가능

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 파일 분석

run.exe file open


4. Key값 구하기

file이 exe 포맷이므로, header 구조는 다른 exe 파일과 동일할 것

upx.exe, run.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

 

file

  • 암호화된 값: 
  • 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) 입력

 

 

728x90
728x90

+ Recent posts