BumbleCrypt
Bumblebee에서 영감을 받은 Crypter
배경
BumbleCrypt는 Bumblebee의 crypter에서 영감을 받았습니다. Bumblebee의 경우, 메인 Bumblebee DLL이 메모리에 로드되어 다음과 같은 방식으로 실행됩니다:
- Heap에 페이로드를 복호화하여 기록합니다
- NtOpenFile, NtCreateSection, NtMapViewOfSection 세 가지 NtApi를 후킹합니다
- LoadLibraryW("gdiplus.dll")를 호출합니다. LoadLibrary()가 라이브러리를 로드할 때 위 세 가지 API를 사용하므로 인라인 후크가 트리거됩니다.
- 그런 다음 인라인 후크와 LoadLibrary 자체가 "gdiplus.dll" 대신 메인 Bumblebee DLL을 로드합니다.
- 마지막으로 제어는 메인 Bumblebee DLL의 내보낸 함수 "SetPath"로 전달됩니다.
BumbleCrypt의 작동 방식
BumbleBee의 crypter를 분석하면서, Bumblebee Crypter에서 사용된 세 개의 인라인 후크 대신 "NtMapViewOfSection" 하나만으로도 복호화된 DLL을 로드할 수 있다는 것을 깨달았습니다.
그 결과 "BumbleCrypt"가 개발되었습니다.
BumbleCrypt의 동작:
-
BumbleCrypt는 먼저 .rsrc 섹션에서 암호화된 리소스를 로드한 다음 최종 DLL 페이로드를 복호화합니다: encrypted res -> Base64 decode -> Rc4 Decrypt -> xor decrypt
-
Crypter는 Bumblebee의 crypter처럼 Heap을 활용하여 복호화된 DLL 페이로드를 저장합니다.
-
최종 페이로드가 복호화되면 BumbleCrypt는 NtApi "NtMapViewOfSection"을 후킹합니다. 이 API는 섹션의 뷰를 가상 주소 공간에 매핑하는 데 사용됩니다.
-
그런 다음 BumbleCrypt는 LoadLibraryW("msimg32.dll")를 호출합니다. 이제 인라인 후크가 어떻게 트리거되는지 이해해 보겠습니다:
- LoadLibraryW()는 먼저 NtOpenFile을 호출하여 인수로 전달된 모듈의 핸들을 얻습니다.
- 그런 다음 NtCreateSection을 사용하여 모듈의 핸들로 섹션 객체를 생성합니다.
- 섹션이 생성되면 LoadLibrary는 섹션의 뷰를 메모리에 매핑하기 위해 NtMapViewOfSection을 호출합니다.
- 여기서 NtMapViewOfSection에 대한 후크가 트리거되며, 프록시 함수는 다음 작업을 수행합니다:
- 먼저 NtMapViewOfSection의 후크를 해제합니다.
- NtCreateSection()을 사용하여 필요한 크기의 섹션을 생성합니다.
- 그런 다음 (이전에 후크를 해제한) NtMapViewOfSection을 사용하여 생성된 섹션의 뷰를 가상 주소 공간에 매핑합니다.
- 마지막으로 이전에 복호화된 최종 DLL을 메모리 매핑된 섹션의 기본 주소에 수동으로 매핑한 다음 LoadLibraryW에 NTSTATUS_SUCCESS를 반환하고 프록시 함수에서 종료합니다.
- 그런 다음 LoadLibraryW는 NtMapViewOfSection에 대한 응답으로 NTSTATUS_SUCCESS를 수신하고, 복호화된 악성 DLL이 메모리에 존재하는 메모리 매핑된 섹션의 기본 주소도 수신합니다. 이후 LoadLibrary는 반환 값에 따라 DLL을 로드하며, 그 결과 로드된 모듈에 msimg32.dll이 보이지만 실제로는 복호화된 페이로드를 가리키게 됩니다. 또한 Crypter는 내보낸 함수 "CallPath"를 실행하여 복호화된 DLL로 제어를 전달합니다.
-
이제 BumbleCrypt의 로드된 모듈 스크린샷을 보면 "msimg32.dll"이 포함되어 있지만 기본 주소가 복호화된 악성 페이로드를 가리키는 것을 확인할 수 있습니다.
스크린샷


PoC - BumbleCrypter

정말 감사합니다! 마음에 드셨길 바랍니다 =D
Ciao.
피드백이나 의견이 있으시면 Twitter로 연락해 주세요.
Twitter: https://twitter.com/knight0x07
참고
교육 목적으로만 사용하세요. 개인 주말 프로젝트입니다 =)