공부/리버싱

Petya 랜섬웨어 분석

B612 2021. 9. 8. 10:35

공백이 한 달쯤 있었던 것 같다.. 나는 그 동안 petya 랜섬웨어를 분석했다. 

첫 랜섬웨어 분석이라 지인의 도움을 받았음에도 많이 헤멨고, 아직 완벽하게 분석을 끝내지도 못했다.

추후에 추가 분석을 진행하기로 하고, 며칠 미뤘던 분석 정리를 하려고 한다.

 

분석은 2021.08.04 ~ 2021.08.27 동안 진행됐다.

(사실 앞 2주간은 어떻게 하는건지 감 잡으면서 한창 삽질만 했고 마지막 일주일에 거의 모든 내용이 나왔다)

(나중에 추가/수정 해야하는 부분은 녹색으로 적겠다)

 

목차

  1. Petya란
  2. 분석 환경
  3. 정적 분석
  4. 동적 분석

1. Petya란

페트야(petya)는 마이크로소프트 윈도우 기반 시스템을 대상으로 하며 마스터 부트 레코드(MBR)를 감염시켜 하드 드라이브의 파일 시스템 테이블을 암호화하고 윈도우의 부팅을 차단하는 페이로드를 실행시킨다. 복구를 위해 비트코인을 요구한다.[각주:1]

 

2. 분석 환경

OS Windows 7
Tools Exeinfo PE, PEview, HxD, x32dbg, IDA PRO (32-bit)

분석 환경

파일명 petya.dll
파일 크기 47.0 KB
파일 형식 application extension (.dll)
MD5 7899d6090efae964024e11f6586a69ce
Sha256 542a38bf52afa6a4a008089a6fbf22c9d68ef5d6c634dd2c0773d859a8ae2bbf

분석 대상

 

3. 정적 분석

EXEINFO PE

패킹이 되어 있지 않으며, C++ 또는 C로 작성되어 있음을 예상할 수 있다.

PEVIEW

일반 파일과 다른 .xxxx 섹션을 확인했다.

(.xxxx 섹션이 무엇인지는 확인하지 못했다)

정상 하드디스크

페트야를 분석하기 전, 정상 하드디스크를 확인할 수 있다.

감염된 MBR 부트코드의 실행화면

4. 동적 분석

petya.dll을 x32dbg로 실행해 그림1을 통해 알아냈던 EntryPoint로 이동한 후, 주요 부분으로 이동한다.

petya.71BD88EE 함수를 호출한다.

petya.71DE88EE

CreateFile 함수를 호출해 핸들을 받아온다. ReadFile 함수를 호출한 후, 받아온 핸들을 이용해 물리 디스크를 읽어온다.

ReadFile 인자

petya.71BD88EE 함수를 호출해 하드 디스크의 MBR을 읽어온다.

읽어온 MBR

정적 분석에서 확인한 정상 MBR과 동일한 것을 확인할 수 있다.

MBR 암호화 부분

읽어온 MBR값을 0x37과 하나씩 xor 연산을 수행한다. 0인 eax를 1씩 증가시키며 eax값이 ebp값인 0x200이 될 때까지 반복문을 실행한다.

암호화되고 있는 MBR
암호화가 완료된 MBR
하드디스크 암호화 부분

그림 8은 petya.dll에서 하드디스크에 값을 덮어 씌우는 부분이다.

xor 연산을 수행해 esi값을 0으로 설정한 후, esi값을 1만큼 증가시키며 코드를 시작한다. petya.71DE88EE 함수를 호출해 첫 번째 섹터부터의 값을 읽어온다.

섹터 연산 부분

xor 연산을 수행해 ecx 값을 0으로 설정한다.

읽어온 섹터 값

[esp+ecx+248] 주소에 저장되어 있는 값인 0x01과 37을 xor 연산해 0x36을 얻어낸다.

ecx 값을 1씩 증가시키며 섹터 하나의 크기인 0x200(512)와 비교해 작은 경우 반복문을 실행하며 [esp+ecx+37]0x36으로 채운다.

반복문을 탈출하면 petya.715F8963 함수를 호출한다.

petya.71DE8963

CreateFile 함수를 호출해 핸들을 받아온다. 이 핸들을 이용해 WriteFile 함수를 호출해 첫 번째 섹터부터 값을 덮어 씌운다.

WriteFile 인자
값이 덮어 씌워진 섹터

esi 값을 0x22(34)와 비교해 작으면 반복문을 실행하며 위의 과정을 반복한다. 그림 16의 반복문에 의해 섹터 1부터 섹터 34까지 값이 덮어 씌워지게 된다.

petya.71BD8963 함수를 호출해 MBR을 암호화 시킨다.

암호화 된 MBR

CreateFile 함수를 호출해 핸들을 받아온다.

전 과정에서 얻은 핸들을 이용해, WriteFile 함수를 호출해 섹터 34부터 값을 덮어 씌운다.

WriteFile 인자

WriteFile의 두 번째 인자는 lpBuffer로 파일이나 장치에 기록할 데이터를 가지고 있는 버퍼의 포인터이다.

주소 19B100

19B100주소로 이동하면 어떤 값이 저장되어 있는 것을 확인할 수 있다.

WriteFIle 함수를 실행시키면 섹터 34부터 주소 19B100에 저장되어 있는 값으로 덮어 씌워진 것을 확인할 수 있다.

랜섬 노트

또한, 랜섬 노트를 확인할 수 있다.

petya.70EE8FD8 함수를 호출한다.

petya.70EE8FD8

GetCurrentProcess 함수를 호출해 현재 실행되고 있는 프로세스의 핸들을 얻는다.

OpenProcessToken 함수를 호출해 프로세스의 권한값을 획득하고, LookupPrivilegeValueA 함수를 호출해 엑세스 토큰의 권한 리스트에 SeShutdownPrivilege 권한이 있는 지 검색한다. 그 후, 얻은 권한값을 이용해 AdjustTokenPrivileges 함수를 호출해 권한을 조정한다.

LookupPrivilegeValueA 인자

GetLastError 함수를 호출해 오류가 있다면 반환하고, 없다면 0을 반환한다. test 명령어를 통해 오류 유무를 확인하고, 오류가 있다면 권한 얻는 과정을 다시 수행한다.

GetModuleHandleA 함수를 호출해 NTDLL.DLL에 대한 모듈 핸들을 검색한다.

GetModuleHandleA 인자

GetProcAddress 함수를 호출해 NTDLL.DLL에서 내보내기 된 NtRaiseHardError의 주소를 가져오고, 리턴값으로 함수의 주소값이 반환된다.

GetProcessAddress 인자

NtRaiseHardError로 인해 GUI에 메시지가 표시됨을 예상할 수 있다.

 

 

빠진게 좀 많았는데.. 지금은 생각이 안난다..;; 나중에 기회가 된다면 세세한 부분까지 분석을 완료하고자 한다..

지적 매우 환영합니다.. 제가 분석이 첨이라 잘 몰라요😭😭

'공부 > 리버싱' 카테고리의 다른 글

PE 구조  (0) 2023.05.28