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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
bfinject — LiberiOS 및 Electra 탈옥과 함께 iOS 11.0 - 11.1.2용 Dylib 주입 | Kitploit
도구/GitHubGitHub/bishopfox/bfinject
Dynamic Analysis (Sandboxing)iOS SecurityExploitationMobile App PentestingPenetration TestingBinary Analysis
GitHubbishopfox/bfinject

bfinject

LiberiOS 및 Electra 탈옥과 함께 iOS 11.0 - 11.1.2용 Dylib 주입

저장소 보기
6411504년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

bfinject

탈옥된 64비트 iOS 11.0 - 11.1.2용 간편한 dylib 주입 도구입니다. Electra 및 LiberiOS 탈옥과 호환됩니다.

bfinject는 실행 중인 App Store 앱에 임의의 dylib를 로드합니다. App Store 앱 복호화를 기본 지원하며, iSpy 및 Cycript가 번들로 포함되어 있습니다.

bfinject는 bfinject4realz를 사용하여 dylib를 주입하기 전에 올바르게 코드사인하는 작업을 처리하는 래퍼입니다. 완전히 독립적이며 jailbreakd, QiLin 등을 필요로 하지 않습니다. 그냥 동작합니다.

참고: "Tweaks"가 활성화된 Electra에서는 bfinject가 작동하지 않습니다. bfinject를 사용하려면 재부팅한 후 트윅 없이 Electra를 다시 실행하십시오. "thread_create" 관련 오류가 보이면 이것이 원인입니다.

참고: bfdecrypt는 여기에서 독립형 dylib로 제공됩니다: https://github.com/BishopFox/bfdecrypt/

목차

  • Electra 설정
  • LiberiOS 설정
  • bfinject 사용
  • bfinject 테스트
  • App Store 앱 복호화
  • Cycript
  • 작동 방식
  • 알려진 문제
  • 크레딧

Electra 설정

  • iOS 11.0 - 11.1.2 기기를 Electra >= b7로 탈옥하십시오.
  • bfinject 타르볼(https://github.com/BishopFox/bfinject/raw/master/bfinject.tar)을 탈옥된 기기에 복사하십시오. Github가 SSL을 강제하지만 Electra 버전의 wget은 SSL을 지원하지 않으므로, 먼저 랩톱으로 복사해야 할 수도 있습니다.
root@kitploit:~
ssh root@your-device-ip # (the password is 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

LiberiOS 설정

  • iOS 11.0 - 11.1.2 기기를 LiberiOS >= 11.0.3으로 탈옥하십시오.
  • bfinject 타르볼(https://github.com/BishopFox/bfinject/raw/master/bfinject.tar)을 탈옥된 기기에 복사하십시오. Github가 SSL을 강제하지만 LiberiOS 버전의 wget은 SSL을 지원하지 않으므로, 먼저 랩톱으로 복사해야 할 수도 있습니다.
root@kitploit:~
ssh root@your-device-ip # (the password is 'alpine')
export PATH=$PATH:/jb/usr/bin:/jb/bin:/jb/sbin:/jb/usr/sbin:/jb/usr/local/bin:
cd /jb
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

bfinject 사용

  • 공유 라이브러리를 주입할 대상 앱을 실행하십시오.
  • 도움말을 보려면 bash bfinject를 입력하십시오.
  • 참고: 명령 앞에 bash를 붙이는 것이 중요합니다. 그렇지 않으면 작동하지 않습니다. 샌드박스 어쩌구저쩌구.
root@kitploit:~
-bash-3.2# bash bfinject
Syntax: bfinject [-p PID | -P appname] [-l /path/to/yourdylib | -L feature]

For example:
   bfinject -P Reddit.app -l /path/to/evil.dylib   # Injects evil.dylib into the Reddit app
     or
   bfinject -p 1234 -L cycript                     # Inject Cycript into PID
     or
   bfinject -p 4566 -l /path/to/evil.dylib         # Injects the .dylib of your choice into PID

Instead of specifying the PID with -p, bfinject can search for the correct PID based on the app name.
Just enter "-P identifier" where "identifier" is a string unique to your app, e.g. "fing.app".

Available features:
  cycript    - Inject and run Cycript
  decrypt    - Create a decrypted copy of the target app
  test       - Inject a simple .dylib to make an entry in the console log
  ispy       - Inject iSpy. Browse to http://<DEVICE_IP>:31337/

간단한 테스트

더 복잡한 작업을 하기 전에 제대로 작동하는지 테스트하십시오. bfinject에는 내장 자체 테스트가 있습니다. Reddit 앱을 대상으로 한 예시는 다음과 같습니다.

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L test
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x12ac5c000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c016e1c0
[+] So long and thanks for all the fish.

기기 화면에 다음과 같은 화면이 보여야 합니다:

그렇지 않다면 뭔가 고장난 것입니다 ;)

App Store 앱 복호화

Electra로 탈옥된 iPhone에서 Reddit 앱을 복호화하는 예시입니다:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L decrypt
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/BCEBDD64-6738-45CE-9B3C-C6F933EA0793/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 3218.
[bfinject4realz] Calling thread_create() on PID 3218
[bfinject4realz] Looking for ROP gadget... found at 0x1016a5110
[bfinject4realz] Fake stack frame at 0x10a06c000
[bfinject4realz] Calling _pthread_set_self() at 0x181303814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1810c3460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c03e1100
[+] So long and thanks for all the fish.

기기에서 다음 화면이 표시됩니다:

완료되면 복호화된 IPA를 다운로드할 수 있는 서비스를 시작할지 묻는 UI 알림이 표시됩니다:

Yes를 탭하면 기기의 31336 포트에서 서비스가 시작됩니다. 연결하면 IPA의 원본 복사본이 전송되며 다음과 같이 netcat으로 다운로드할 수 있습니다:

root@kitploit:~
carl@calisto-3 /tmp $ nc 192.168.1.33 31336 > decrypted.ipa
carl@calisto-3 /tmp $ ls -l decrypted.ipa
-rw-r--r--  1 carl  wheel  14649063 Jan 25 16:57 decrypted.ipa
carl@calisto-3 /tmp $ file decrypted.ipa
decrypted.ipa: iOS App Zip archive data, at least v2.0 to extract

또는 기기의 콘솔 로그를 확인하면 복호화된 IPA가 저장된 위치를 알 수 있습니다. 예:

root@kitploit:~
[dumpdecrypted] Wrote /var/mobile/Containers/Data/Application/6E6A5887-8B58-4FC5-A2F3-7870EDB5E8D1/Documents/decrypted-app.ipa

다음과 같이 파일시스템에서 IPA를 검색할 수도 있습니다:

root@kitploit:~
find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa

.ipa를 기기에서 가져오려면 netcat을 사용할 수 있습니다. 랩톱에서 리스너 서비스를 설정하십시오:

root@kitploit:~
ncat -l 0.0.0.0 12345 > decrypted.ipa

그리고 탈옥된 기기에서:

root@kitploit:~
cat /path/to/decrypted.ipa > /dev/tcp/<IP_OF_YOUR_COMPUTER>/12345

.ipa는 App Store의 원본 .ipa 복제본이지만, 메인 바이너리와 함께 포함된 모든 프레임워크 및 공유 라이브러리는 복호화됩니다. 이전에 암호화된 각 파일에서 CRYPTID 플래그는 0이 됩니다. .ipa를 가져와 앱을 추출하고, 필요에 따라 수정한 다음, 자신의 개발자 인증서로 다시 서명하고, 필요에 따라 탈옥되지 않은 기기에 배포할 수 있습니다.

Cycript

bfinject의 기능 중 하나는 Cycript와 같은 일반적인 펜테스팅 도구를 통합하는 것입니다. 시간이 지나면서 더 추가될 예정입니다. Cycript를 사용하려면 MacBook에 Cycript 명령줄 클라이언트(http://www.cycript.org/)가 설치되어 있어야 합니다. 그런 다음 테스트 기기에 bfinject가 설치되면 Reddit 앱에 Cycript를 주입하는 다음 예시와 같이 하면 됩니다:

root@kitploit:~
Cs-iPhone:~ root# bash bfinject -P Reddit -L cycript
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c01786c0
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c4179680
[+] So long and thanks for all the fish.

Cycript가 주입되면 기기에 다음 메시지가 표시됩니다:

MacBook에서 다음과 같이 Cycript에 연결할 수 있습니다(Cycript를 ~/bin/에 설치했다고 가정):

root@kitploit:~
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#

작동 방식

대략적으로 말하면, bfinject4realz는 실행 중인 Apple 서명 App Store 앱에 자체 서명된 .dylib를 사이드로드합니다.

이 과정은 두 단계로 이루어집니다.

1. 주입할 dylib 서명

iOS의 코드사인 검사는 사용자 공간 서비스(amfid)와 커널 서비스(AppleMobileFileIntegrity)로 구성됩니다. LiberiOS와 Electra 모두 사용자 공간의 amfid 프로세스를 패치하여 코드사인 검사를 우회하지만, 커널이 수행하는 추가 검사가 여전히 남아 있습니다.

그러나 Electra와 LiberiOS는 KPPless입니다. 즉, 커널에서 어떤 것도 패치하지 않습니다. 단 한 바이트도 패치하지 않습니다. 이는 커널 패치를 탐지하고 차단하기 위해 정교한 커널 내부 검사를 수행하는 Apple의 보안 기술인 KPP(Kernel Patch Protection) 때문입니다. 그 결과 커널 코드사인 검사는 그대로 유지됩니다.

다행히도 커널은 amfid가 dylib의 자격에 첨부된 암호화 서명의 유효성을 이미 검증했다고 가정하는 것으로 보입니다. 따라서 커널이 이를 수락하도록 하려면 dylib에 두 가지 자격을 자체 서명하기만 하면 됩니다:

  • 첫 번째는 platform-application 자격입니다. dylib가 Apple 소프트웨어임을 나타내는 것으로 생각됩니다.
  • 두 번째는 코드를 주입할 대상 코드를 서명하는 데 사용된 서명 인증서의 Team ID입니다. 예를 들어 Reddit 앱은 Team ID 2TDUX39LX8로 서명됩니다. 따라서 Reddit 앱에 dylib를 주입하려면 dylib를 동일한 Team ID(2TDUX39LX8)로 서명해야 합니다.

bfinject가 모든 서명 관련 복잡한 작업을 처리해 주므로 편리합니다.

2. 올바르게 서명된 dylib를 대상 프로세스에 주입

  • task_for_pid()를 사용하여 대상 프로세스의 mach 포트를 얻습니다.
  • 해당 포트를 사용하여 대상 프로세스의 스레드와 비실행 메모리 세그먼트를 조작합니다.
    • 참고: 커널 패치 없이는 프로세스의 실행 코드를 수정할 수 없습니다.
    • 결과적으로 원하는 코드를 실행하려면 ROP 트릭을 사용해야 합니다.
  • 임시 스택을 위해 원격 프로세스에 일부 메모리 페이지를 할당합니다.
  • "/path/to/my.dylib" 문자열을 스택의 알려진 위치에 배치합니다.
  • 몇 가지 트릭을 사용하여 원격 프로세스에서 dlopen()의 주소를 조회합니다.
  • 실행 가능한 페이지에서 간단한 RET ROP 가젯을 찾습니다(arm64에서 RET = "\xc0\x03\x5f\xd6").
  • 대상 프로세스에 새 스레드를 생성합니다.
  • 스레드의 CPU 레지스터를 설정합니다:
    • $pc = dlopen()의 주소
    • $x0 = dlopen의 매개변수 1: 임시 스택에 있는 "/path/to/dylib" 문자열의 주소
    • $x1 = dlopen의 매개변수 2: RTLD_LAZY | RTLD_GLOBAL 값
    • $sp = 임시 스택의 중간
    • $fp = 임시 스택의 1/4 지점
    • $lr = ROP 가젯의 주소
  • 스레드를 재개합니다. 그러면 다음이 발생합니다:
    • dlopen()을 위한 스레딩을 설정하기 위해 _pthread_set_self가 호출됩니다.
    • 악성 공유 라이브러리를 주입하기 위해 dlopen()이 호출됩니다.
    • dlopen()은 $lr 레지스터의 값(또 다른 RET 명령)으로 RET합니다.
    • RET는 RET로, 다시 RET로... 무한히 반환합니다.
  • 스레드의 레지스터를 폴링하여 $pc == ROP 가젯의 주소(RET 명령)인지 확인합니다.
  • 가젯이 실행되면 스레드를 종료하고 메모리를 해제하면 작업이 끝납니다.

낮은 수준의 설명은 소스를 참조하십시오.

알려진 문제

참고: Electra에서 jtool(@morpheus의 코드사인 멀티툴) 버전은 플랫폼 바이너리 자격을 지원하지 않으므로, bfinject는 LiberiOS의 jtool을 제공하여 대신 사용합니다. bfinject는 Electra의 inject_criticald를 사용하지 않습니다.

크레딧

  • dumpdecrypted의 원래 아이디어와 코드를 제공한 Stefan Esser (10n1c) (https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
  • lorgnette를 제공한 Dmitry Rodionov (https://github.com/rodionovd/liblorgnette/)
  • LiberiOS 탈옥을 제공한 Jonathan Levin (http://newosxbook.com/liberios/)
  • async_wake 익스플로잇을 제공한 Ian Beer (https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
  • 훌륭한 모바일 OS를 만들어 준 Apple
도구 다운로드