Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
dyen — 기본 macOS Python용 인메모리 Mach-O dylib 로더; dlopen 또는 디스크에 쓰기 없이 페이로드를 복호화, 매핑, 실행하며, 선택적으로 암호화된 커버 파일 임베딩을 지원합니다. | Kitploit
도구/GitHubGitHub/cenobyte-vincit/dyen
Payload GenerationIDS/IPS EvasionPost-ExploitationCryptographyBinary AnalysisRed TeamingPayload Development
GitHubcenobyte-vincit/dyen

dyen

기본 macOS Python용 인메모리 Mach-O dylib 로더; dlopen 또는 디스크에 쓰기 없이 페이로드를 복호화, 매핑, 실행하며, 선택적으로 암호화된 커버 파일 임베딩을 지원합니다.

저장소 보기
133일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

dyen

dyen은 macOS의 기본 /usr/bin/python3용 stdlib 전용 인메모리 Mach-O 로더(loader.py)입니다. 일반 dylib, 독립형 DYEN v1 blob(암호화된 봉투), 또는 EOF에 해당 blob이 추가된 커버 파일을 읽어서 익명 mmap으로 호스트 슬라이스를 매핑하고, 클래식 rebase/bind 픽스업을 적용한 다음 ctypes 함수 포인터를 통해 dyld_main을 호출합니다.

by cenobyte [email protected] 2026

https://github.com/cenobyte-vincit/dyen

요약

dyen은 macOS의 기본 /usr/bin/python3용 stdlib 전용 인메모리 Mach-O 로더(loader.py)입니다. 일반 dylib, 독립형 DYEN v1 blob(암호화된 봉투), 또는 EOF에 해당 blob이 추가된 커버 파일을 읽어서 익명 mmap으로 호스트 슬라이스를 매핑하고, 클래식 rebase/bind 픽스업을 적용한 다음 ctypes 함수 포인터를 통해 dyld_main을 호출합니다.

encrypt_dyld.py는 스테이징 도구입니다. dylib을 DYEN blob으로 감싸 stdout으로 출력하거나, blob을 추가한 커버 파일을 dyld_<basename>으로 복사합니다. 번들된 dyld/dyld.c 페이로드는 hello world만 출력합니다. loader.py는 macOS 전용이며, 암호화 도구는 Linux 또는 macOS에서 실행됩니다.

트리 내 로더는 로컬 경로 또는 stdin을 읽습니다. 드로퍼 또는 1단계 스테이지가 네트워크를 통해 커버 파일(또는 원시 바이트)을 가져와 read_dyld_bytes()에 전달하므로, 암호화된 dylib이 대상 시스템에 별도 파일로 저장되지 않습니다.

  • 파일 경로 또는 stdin: 일반 dylib, .dyen, 또는 커버 파일.
  • 성공 시 페이로드의 stdout을 출력합니다(PoC: hello world). 진단 메시지는 stderr로 출력됩니다.
  • 프로세스는 실행 가능한 익명 매핑을 유지합니다. 복호화된 Mach-O는 디스크에 기록되지 않습니다.

요구 사항

런타임 호스트

  • macOS(Darwin)
  • 기본 /usr/bin/python3(stdlib 전용)

빌드 호스트

loader.py는 macOS 전용입니다. PoC dylib을 컴파일하려면 Mac에 Apple clang이 필요합니다. encrypt_dyld.py는 Linux 또는 macOS에서 사전 빌드된 dylib을 대상으로 실행됩니다.

  • clang과 make가 있는 macOS(dyld/dyld.c 컴파일용)
  • encrypt_dyld.py용 Python 3(stdlib 전용)
  • ruff, pylint, cppcheck (brew install ruff pylint cppcheck)

빌드

root@kitploit:~
make

이 명령은 build/libdyld.dylib(유니버설 x86_64 + arm64)을 컴파일하고, build/libdyld.dyen을 작성하며, 동일한 암호화된 dylib을 pdf/dyld_c4611_sample_explain.pdf에 내장합니다. 생성된 PDF는 커밋되지 않습니다. make가 이를 작성하고 make clean이 삭제합니다. 소스 커버 파일은 pdf/c4611_sample_explain.pdf입니다.

일반 dylib은 중간 산출물입니다. 런타임에 로더는 매핑 전에 DYEN blob을 복호화합니다. 이때 독립형 .dyen 파일 또는 끝에 암호화된 dyld가 추가된 커버 파일을 사용합니다.

root@kitploit:~
# Standalone DYEN blob to stdout (Makefile redirects to build/libdyld.dyen)
python3 encrypt_dyld.py build/libdyld.dylib CHANGEMEASAP > build/libdyld.dyen

# Hide encrypted dyld inside a cover file -> pdf/dyld_c4611_sample_explain.pdf
python3 encrypt_dyld.py build/libdyld.dylib CHANGEMEASAP pdf/c4611_sample_explain.pdf

# Use this Mac's serial number as the encryption key instead of a password (local testing)
python3 encrypt_dyld.py build/libdyld.dylib "$(python3 loader.py --serial)" > build/libdyld.dyen

# Use the target Mac's serial number as the encryption key (fictitious serial)
python3 encrypt_dyld.py build/libdyld.dylib C07XH4V2MD6T > build/libdyld.dyen

encrypt_dyld.py는 Linux 또는 macOS에서 실행됩니다. loader.py는 macOS에서만 실행됩니다.

사용법

로더 CLI는 파일 경로 하나를 인자로 받거나 stdin을 읽습니다. 암호 플래그는 없습니다. 복호화는 먼저 이 Mac의 하드웨어 시리얼을 시도한 다음 DEFAULT_DYLD_KEY(CHANGEMEASAP)를 시도합니다. 시리얼을 읽을 수 없으면 하드코딩된 키만 시도합니다. CLI는 항상 입력을 로드하고 dyld_main을 호출합니다. loader.py를 대상 시스템에 복사하세요.

root@kitploit:~
/usr/bin/python3 loader.py build/libdyld.dylib
/usr/bin/python3 loader.py pdf/dyld_c4611_sample_explain.pdf
/usr/bin/python3 loader.py build/libdyld.dyen

cat build/libdyld.dylib | /usr/bin/python3 loader.py
cat pdf/dyld_c4611_sample_explain.pdf | /usr/bin/python3 loader.py
cat build/libdyld.dyen | /usr/bin/python3 loader.py

blob이 추가되지 않은 커버 파일은 실패합니다:

root@kitploit:~
/usr/bin/python3 loader.py pdf/c4611_sample_explain.pdf

loader.py --serial은 이 Mac의 하드웨어 시리얼을 출력합니다(macOS 전용):

root@kitploit:~
python3 loader.py --serial

LOADER_DEBUG에 아무 값이나 설정하면 자세한 stderr 추적을 출력합니다:

root@kitploit:~
LOADER_DEBUG=1 /usr/bin/python3 loader.py build/libdyld.dyen

종료 코드

loader.py 및 encrypt_dyld.py:

CodeMeaning
0성공
1사용법 오류, 복호화 실패, 시리얼 누락 또는 I/O 오류

구성

LOADER_DEBUG(아무 값)는 입력 소스, 헤더/매직 검사, DYEN blob 감지, 복호화, map/bind, 심볼 해석 등의 자세한 추적을 stderr로 출력합니다. make는 기본적으로 encrypt_dyld.py에 LOADER_DEBUG=1을 전달하며, make LOADER_DEBUG=는 암호화 단계 추적을 출력하지 않습니다.

loader.py의 DEFAULT_DYLD_KEY는 CHANGEMEASAP입니다. 암호화에는 encrypt_dyld.py에 명시적인 암호 또는 Mac 시리얼 인자가 필요합니다.

반복 횟수(loader.py의 PBKDF2_ITERATIONS)는 PBKDF2-HMAC-SHA256에 대한 현재 OWASP 암호 저장 치트 시트 권장 사항(600,000회 반복)을 따릅니다. PKCS #5 / RFC 8018은 PBKDF2를 정의하지만 반복 횟수는 배포자에게 맡깁니다. NIST SP 800-63B는 특정 횟수를 규정하지 않고 PBKDF2를 허용합니다. OWASP는 하드웨어가 빨라짐에 따라 점점 높아지는 실용적 목표치를 공개하므로, 이 값은 주기적으로 재검토해야 합니다. 이는 테스트 키에 적용된 암호 스트레칭 지침이며, 영구적인 프로토콜 상수가 아닙니다.

검증

빌드 호스트:

root@kitploit:~
make test
make lint        # cppcheck (C) + ruff + pylint (Python)
make check       # cppcheck only
make lint-python # ruff + pylint

make test는 린터를 실행하고, PoC dylib을 빌드하고, 이를 암호화(독립형 .dyen 및 PDF 내장)한 다음 /usr/bin/python3로 통합 테스트를 실행합니다. 각 로드 테스트는 stdout에 hello world가 포함되어 있는지 확인합니다. 이 테스트는 같은 장소에 있는 Mac에서 실행됩니다. 이는 클린 런타임을 증명하는 것은 아닙니다.

제한 사항

CrowdStrike Falcon macOS는 이 기법을 탐지합니다. 다른 EDR은 테스트되지 않았습니다.

로더는 클래식 LC_DYLD_INFO rebase/bind만 구현합니다. 체인드 픽스업, Objective-C 또는 Swift는 처리하지 않습니다. dlopen은 Apple 서명 시스템 의존성(예: /usr/lib/libSystem.B.dylib)에만 사용됩니다. 페이로드는 dyld에 등록되지 않습니다.

EOF에 추가하는 은닉 방식은 헥스 덤프에서 식별 가능합니다.

무기화: 운영 사용 전에 DYENCRYPT를 변경하세요. DYLD_BLOB_MAGIC(loader.py)의 PoC 매직은 정적 시그니처입니다. YARA 규칙, 파일 스캐너 및 간단한 rfind 휴리스틱이 이를 기반으로 탐지할 수 있습니다. 원하는 고유 값으로 교체하세요(encrypt와 loader의 동기화 유지, 길이는 고정되지 않지만 내장 커버 파일에는 길수록 좋습니다).

트리 내 dylib은 hello world만 출력합니다.

참고 자료

  • ARCHITECTURE.md
  • https://github.com/cenobyte-vincit/dyen
도구 다운로드