From 7c52c66c8728ad511173d69af63ac617f28e2d65 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 11 Jul 2024 00:12:37 +0000 Subject: [PATCH] Translated ['macos-hardening/macos-security-and-privilege-escalation/mac --- .../README.md | 217 +++++++++++------- 1 file changed, 128 insertions(+), 89 deletions(-) diff --git a/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md b/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md index 1f8dddaa6..cb835a923 100644 --- a/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md +++ b/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md @@ -2,15 +2,15 @@
-htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요 +htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 처음부터 전문가까지 배우세요 htARTE (HackTricks AWS Red Team Expert)! HackTricks를 지원하는 다른 방법: -* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! -* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요 +* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! +* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 -* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요. -* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요. +* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. +* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
@@ -18,11 +18,11 @@ HackTricks를 지원하는 다른 방법:
-[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, 회사나 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 무료 기능을 제공합니다. +[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 활용한 검색 엔진으로, **무료** 기능을 제공하여 회사나 고객이 **스틸러 악성 소프트웨어**에 의해 **침해**당했는지 확인할 수 있습니다. -WhiteIntel의 주요 목표는 정보를 도난당한 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다. +WhiteIntel의 주요 목표는 정보 도난 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다. -그들의 웹사이트를 확인하고 **무료**로 엔진을 시험해 볼 수 있습니다: +그들의 웹사이트를 방문하여 엔진을 **무료**로 사용해 볼 수 있습니다: {% embed url="https://whiteintel.io" %} @@ -30,13 +30,11 @@ WhiteIntel의 주요 목표는 정보를 도난당한 악성 코드로 인한 ## 정적 분석 -### otool +### otool & objdump & nm ```bash otool -L /bin/ls #List dynamically linked libraries otool -tv /bin/ps #Decompile application ``` -### objdump - {% code overflow="wrap" %} ```bash objdump -m --dylibs-used /bin/ls #List dynamically linked libraries @@ -47,10 +45,21 @@ objdump -d /bin/ls # Dissasemble the binary objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour ``` {% endcode %} +```bash +nm -m ./tccd # List of symbols +``` +### jtool2 & Disarm -### jtool2 - -이 도구는 **codesign**, **otool**, **objdump**의 **대체**로 사용될 수 있으며 몇 가지 추가 기능을 제공합니다. [**여기에서 다운로드하세요**](http://www.newosxbook.com/tools/jtool.html) 또는 `brew`를 사용하여 설치하세요. +[**여기에서 disarm을 다운로드할 수 있습니다**](https://newosxbook.com/tools/disarm.html). +```bash +ARCH=arm64e disarm -c -i -I --signature /path/bin # Get bin info and signature +ARCH=arm64e disarm -c -l /path/bin # Get binary sections +ARCH=arm64e disarm -c -L /path/bin # Get binary commands (dependencies included) +ARCH=arm64e disarm -c -S /path/bin # Get symbols (func names, strings...) +ARCH=arm64e disarm -c -d /path/bin # Get disasembled +jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info +``` +[**jtool2를 여기서 다운로드하세요**](http://www.newosxbook.com/tools/jtool.html) 또는 `brew`로 설치할 수 있습니다. ```bash # Install brew install --cask jtool2 @@ -67,10 +76,14 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom # Get MIG information jtool2 -d __DATA.__const myipc_server | grep MIG ``` +{% hint style="danger" %} +**jtool은 disarm을 사용하는 것이 권장됩니다.** +{% endhint %} + ### Codesign / ldid -{% hint style="danger" %} -**`Codesign`**은 **macOS**에 있고 **`ldid`**는 **iOS**에 있습니다. +{% hint style="success" %} +**`Codesign`**은 **macOS**에, **`ldid`**은 **iOS**에 있습니다. {% endhint %} ```bash # Get signer @@ -105,39 +118,44 @@ ldid -S/tmp/entl.xml ### hdiutil -이 도구를 사용하면 Apple 디스크 이미지(**.dmg**) 파일을 **마운트**하여 실행하기 전에 내용을 검사할 수 있습니다: +이 도구를 사용하면 Apple 디스크 이미지(**.dmg**) 파일을 실행하기 전에 검사할 수 있습니다: ```bash hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg ``` -### Objective-C +### 패킹된 이진 파일 -#### 메타데이터 +* 고엔트로피를 확인합니다. +* 문자열을 확인합니다 (거의 이해할 수 없는 문자열이 있는지 확인하여 패킹된지 확인). +* MacOS용 UPX 패커는 "\_\_XHDR"이라는 섹션을 생성합니다. + +## 정적 Objective-C 분석 + +### 메타데이터 {% hint style="danger" %} Objective-C로 작성된 프로그램은 [Mach-O 이진 파일](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)로 컴파일될 때 클래스 선언을 유지합니다. 이러한 클래스 선언에는 다음이 포함됩니다: {% endhint %} -* 클래스 -* 클래스 메소드 -* 클래스 인스턴스 변수 +* 정의된 인터페이스 +* 인터페이스 메소드 +* 인터페이스 인스턴스 변수 +* 정의된 프로토콜 -[class-dump](https://github.com/nygard/class-dump)을 사용하여 이 정보를 얻을 수 있습니다: -```bash -class-dump Kindle.app -``` -#### 함수 호출 +이러한 이름들은 바이너리의 역공학을 어렵게 만들기 위해 난독화될 수 있습니다. -Objective-C를 사용하는 이진 파일에서 함수가 호출될 때, 컴파일된 코드는 해당 함수를 호출하는 대신 **`objc_msgSend`**를 호출합니다. 이는 최종 함수를 호출할 것입니다: +### 함수 호출 + +Objective-C를 사용하는 바이너리에서 함수가 호출될 때, 컴파일된 코드는 해당 함수를 호출하는 대신 **`objc_msgSend`**를 호출합니다. 이는 최종 함수를 호출할 것입니다: ![](<../../../.gitbook/assets/image (305).png>) 이 함수가 기대하는 매개변수는 다음과 같습니다: -* 첫 번째 매개변수인 (**self**)은 "메시지를 받을 클래스의 **인스턴스를 가리키는 포인터**"입니다. 간단히 말하면, 메소드가 호출되는 객체입니다. 메소드가 클래스 메소드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이며, 인스턴스 메소드의 경우 self는 클래스의 인스턴스로서 구체화된 인스턴스를 가리킵니다. -* 두 번째 매개변수인 (**op**)은 "메시지를 처리하는 메소드의 셀렉터"입니다. 다시 말해, 이것은 그냥 **메소드의 이름**입니다. -* 나머지 매개변수는 메소드에서 필요로 하는 **값들**입니다 (op). +* 첫 번째 매개변수 (**self**)는 "메시지를 수신할 클래스의 인스턴스를 가리키는 포인터"입니다. 간단히 말해, 메소드가 호출되는 객체입니다. 메소드가 클래스 메소드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이며, 인스턴스 메소드의 경우 self는 클래스의 인스턴스로 가리킬 것입니다. +* 두 번째 매개변수인 (**op**)은 "메시지를 처리하는 메소드의 셀렉터"입니다. 간단히 말해, 이것은 메소드의 **이름**입니다. +* 나머지 매개변수는 메소드에서 필요한 **값**입니다 (op). -ARM64에서 **`lldb`**를 사용하여 이 정보를 쉽게 얻는 방법은 이 페이지에서 확인할 수 있습니다: +ARM64에서 **`lldb`를 사용하여 이 정보를 쉽게 얻는 방법**은 다음 페이지에서 확인할 수 있습니다: {% content-ref url="arm64-basic-assembly.md" %} [arm64-basic-assembly.md](arm64-basic-assembly.md) @@ -145,9 +163,9 @@ ARM64에서 **`lldb`**를 사용하여 이 정보를 쉽게 얻는 방법은 이 x64: -| **인자** | **레지스터** | **(objc\_msgSend에 대해)** | +| **인자** | **레지스터** | **(objc\_msgSend용) 인자** | | ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ | -| **1번째 인자** | **rdi** | **self: 메소드가 호출되는 객체** | +| **1번째 인자** | **rdi** | **self: 메소드가 호출되는 객체** | | **2번째 인자** | **rsi** | **op: 메소드의 이름** | | **3번째 인자** | **rdx** | **메소드에 대한 1번째 인자** | | **4번째 인자** | **rcx** | **메소드에 대한 2번째 인자** | @@ -155,15 +173,42 @@ x64: | **6번째 인자** | **r9** | **메소드에 대한 4번째 인자** | | **7번째+ 인자** |

rsp+
(스택 상에)

| **메소드에 대한 5번째+ 인자** | +### ObjectiveC 메타데이터 덤프 + ### Dynadump -[**Dynadump**](https://github.com/DerekSelander/dynadump)은 dylibs에서 Objc-Classes를 가져오는 도구입니다. +[**Dynadump**](https://github.com/DerekSelander/dynadump)는 Objective-C 이진 파일을 클래스 덤프하는 도구입니다. 깃허브에서는 dylibs를 지정하지만 실행 파일에서도 작동합니다. +```bash +./dynadump dump /path/to/bin +``` +현재 이것이 **가장 잘 작동하는 것**입니다. -### Swift +#### 일반 도구 +```bash +nm --dyldinfo-only /path/to/bin +otool -ov /path/to/bin +objdump --macho --objc-meta-data /path/to/bin +``` +#### class-dump + +[**class-dump**](https://github.com/nygard/class-dump/)은 ObjetiveC 형식의 코드에서 클래스, 카테고리 및 프로토콜에 대한 선언을 생성하는 원본 도구입니다. + +이 도구는 오래되었고 유지되지 않았으므로 제대로 작동하지 않을 수 있습니다. + +#### ICDump + +[**iCDump**](https://github.com/romainthomas/iCDump)은 현대적이고 크로스 플랫폼 Objective-C 클래스 덤프입니다. 기존 도구와 비교하여 iCDump는 Apple 생태계와 독립적으로 실행되며 Python 바인딩을 노출합니다. +```python +import icdump +metadata = icdump.objc.parse("/path/to/bin") + +print(metadata.to_decl()) +``` +## 정적 Swift 분석 Swift 이진 파일의 경우 Objective-C 호환성이 있기 때문에 때로는 [class-dump](https://github.com/nygard/class-dump/)를 사용하여 선언을 추출할 수 있지만 항상 그렇지는 않습니다. -**`jtool -l`** 또는 **`otool -l`** 명령줄을 사용하여 **`__swift5`** 접두어로 시작하는 여러 섹션을 찾을 수 있습니다: +**`jtool -l`** 또는 **`otool -l`** 명령줄을 사용하면 **`__swift5`** 접두사로 시작하는 여러 섹션을 찾을 수 있습니다: ```bash jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO @@ -177,7 +222,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture ``` 더 많은 정보를 [**이 블로그 게시물**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)에서 찾을 수 있습니다. -또한, **Swift 이진 파일에는 심볼이 포함**될 수 있습니다 (예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). **심볼에는 일반적으로 함수 이름과 속성에 대한 정보**가 지저분한 방식으로 포함되어 있어 매우 유용하며, "**디멩글러"**가 원래 이름을 가져올 수 있습니다: +또한, **Swift 이진 파일에는 심볼이 포함**될 수 있습니다 (예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). **심볼에는 일반적으로 함수 이름과 속성에 대한 정보**가 포함되어 있어서 매우 유용하며 "**디멩글러"**가 원래 이름을 가져올 수 있습니다: ```bash # Ghidra plugin https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py @@ -185,56 +230,50 @@ https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py # Swift cli swift demangle ``` -### 패킹된 이진 파일 - -* 고 엔트로피를 확인합니다. -* 문자열을 확인합니다 (거의 이해할 수 없는 문자열이 있는 경우, 패킹됨). -* MacOS용 UPX 패커는 "\_\_XHDR"이라는 섹션을 생성합니다. - ## 동적 분석 {% hint style="warning" %} -바이너리를 디버깅하려면 **SIP를 비활성화**해야 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 바이너리를 임시 폴더로 복사하고 `codesign --remove-signature `로 서명을 제거하거나 바이너리의 디버깅을 허용해야 합니다 (이 스크립트를 사용할 수 있습니다). +바이너리를 디버깅하려면 **SIP를 비활성화**해야 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 바이너리를 임시 폴더로 복사하고 `codesign --remove-signature `로 서명을 **제거**하거나 바이너리의 디버깅을 허용해야 합니다 ([이 스크립트](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)를 사용할 수 있습니다). {% endhint %} {% hint style="warning" %} -macOS에서 **시스템 바이너리를 instrument**하려면 (`cloudconfigurationd`와 같은) **SIP를 비활성화**해야 합니다 (서명을 제거하는 것만으로는 작동하지 않습니다). +macOS에서 **시스템 바이너리를 조작**하려면 (`cloudconfigurationd`와 같은) **SIP를 비활성화**해야 합니다 (서명을 제거하는 것만으로는 작동하지 않습니다). {% endhint %} -### API +### APIs macOS는 프로세스에 대한 정보를 제공하는 몇 가지 흥미로운 API를 노출합니다: -* `proc_info`: 각 프로세스에 대한 많은 정보를 제공하는 주요 API입니다. 다른 프로세스 정보를 얻으려면 루트여야 하지만 특별한 권한이나 mach 포트가 필요하지는 않습니다. -* `libsysmon.dylib`: XPC 노출 함수를 통해 프로세스 정보를 얻을 수 있게 해줍니다. 그러나 `com.apple.sysmond.client` 엔터티가 필요합니다. +* `proc_info`: 각 프로세스에 대한 많은 정보를 제공하는 주요 API입니다. 다른 프로세스 정보를 얻으려면 루트 사용자여야 하지만 특별한 권한이나 mach 포트가 필요하지는 않습니다. +* `libsysmon.dylib`: XPC 노출 함수를 통해 프로세스에 대한 정보를 얻을 수 있게 해줍니다. 그러나 `com.apple.sysmond.client` 엔터티먼트가 필요합니다. ### Stackshot 및 microstackshots -**Stackshotting**은 모든 실행 중인 스레드의 콜 스택을 포함하여 프로세스의 상태를 캡처하는 기술입니다. 이는 디버깅, 성능 분석 및 특정 시점에서 시스템의 동작을 이해하는 데 특히 유용합니다. iOS 및 macOS에서는 **`sample`** 및 **`spindump`**와 같은 여러 도구 및 방법을 사용하여 stackshotting을 수행할 수 있습니다. +**Stackshotting**은 프로세스의 상태를 캡처하는 기술로, 모든 실행 중인 스레드의 콜 스택을 포함합니다. 이는 디버깅, 성능 분석 및 특정 시점에서 시스템의 동작을 이해하는 데 특히 유용합니다. iOS 및 macOS에서는 **`sample`** 및 **`spindump`**와 같은 도구 및 방법을 사용하여 stackshotting을 수행할 수 있습니다. ### Sysdiagnose 이 도구(`/usr/bini/ysdiagnose`)는 기본적으로 `ps`, `zprint` 등 수십 가지 다른 명령을 실행하여 컴퓨터에서 많은 정보를 수집합니다. -**루트**로 실행해야 하며 `/usr/libexec/sysdiagnosed` 데몬에는 `com.apple.system-task-ports` 및 `get-task-allow`와 같은 매우 흥미로운 엔터티가 있습니다. +루트로 실행해야 하며 `/usr/libexec/sysdiagnosed` 데몬에는 `com.apple.system-task-ports` 및 `get-task-allow`와 같은 매우 흥미로운 엔터티먼트가 있습니다. 그 plist는 `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`에 있으며 3개의 MachServices를 선언합니다: * `com.apple.sysdiagnose.CacheDelete`: /var/rmp의 이전 아카이브를 삭제합니다. * `com.apple.sysdiagnose.kernel.ipc`: 특별 포트 23 (커널) -* `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-C 클래스를 통한 사용자 모드 인터페이스. 사전에 세 개의 인수를 전달할 수 있습니다 (`compress`, `display`, `run`). +* `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-C 클래스를 통한 사용자 모드 인터페이스. 딕셔너리에 세 개의 인수를 전달할 수 있습니다 (`compress`, `display`, `run`). ### 통합 로그 -MacOS는 응용 프로그램을 실행할 때 매우 유용한 로그를 생성합니다. **응용 프로그램이 무엇을 하는지** 이해하려고 할 때 매우 유용합니다. +MacOS는 응용 프로그램을 실행할 때 매우 유용한 로그를 생성합니다. -또한, 일부 로그에는 `` 태그가 포함되어 **사용자** 또는 **컴퓨터** **식별 가능한** 정보를 **숨기기** 위한 것입니다. 그러나 **인증서를 설치하여 이 정보를 공개**할 수 있습니다. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)의 설명을 따르세요. +또한, 일부 로그에는 **사용자** 또는 **컴퓨터** **식별 가능한** 정보를 **숨기기** 위해 `` 태그가 포함될 수 있습니다. 그러나 **인증서를 설치하여 이 정보를 공개**할 수 있습니다. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)의 설명을 따르세요. ### Hopper #### 왼쪽 패널 -Hopper의 왼쪽 패널에서는 이진 파일의 심볼(**레이블**), 프로시저 및 함수 목록(**Proc**) 및 문자열(**Str**)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분(예: _cstring 또는 objc_methname)에 정의된 문자열이 아니라 모든 문자열은 아닙니다. +Hopper의 왼쪽 패널에서는 바이너리의 심볼(**레이블**), 프로시저 및 함수 목록(**Proc**) 및 문자열(**Str**)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분(예: _cstring 또는_ `objc_methname`)에 정의된 문자열이지만 모든 문자열이 아닙니다. #### 가운데 패널 @@ -242,21 +281,21 @@ Hopper의 왼쪽 패널에서는 이진 파일의 심볼(**레이블**), 프로
-코드 객체를 마우스 오른쪽 버튼으로 클릭하면 해당 객체에 대한 **참조/참조**를 볼 수 있거나 이름을 변경할 수 있습니다 (디컴파일된 의사 코드에서는 작동하지 않음): +코드 객체를 마우스 오른쪽 버튼으로 클릭하면 해당 객체에 대한 **참조/참조**를 볼 수 있거나 이름을 변경할 수 있습니다(디컴파일된 의사 코드에서는 작동하지 않음):
-또한 **가운데 아래에서 파이썬 명령을 작성**할 수 있습니다. +또한, **가운데 아래에서 python 명령을 작성**할 수 있습니다. #### 오른쪽 패널 -오른쪽 패널에서는 **탐색 기록** (현재 상황에 도달하는 방법을 알 수 있음), **호출 그래프** (이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있음) 및 **로컬 변수** 정보와 같은 흥미로운 정보를 볼 수 있습니다. +오른쪽 패널에서는 **탐색 기록**(현재 상황에 도달한 방법을 알 수 있음), **호출 그래프**(이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있는 그래프) 및 **로컬 변수** 정보와 같은 흥미로운 정보를 볼 수 있습니다. ### dtrace -Dtrace는 사용자가 응용 프로그램에 **매우 낮은 수준**에서 액세스할 수 있도록하며 사용자가 **프로그램을 추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **커널 전체에 배치된** 프로브를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다. +사용자들에게 매우 **낮은 수준**의 응용 프로그램 액세스 권한을 부여하고 프로그램을 **추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **커널 전체에 배치된** 프로브를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다. -DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입점과 종료점에서 발생**할 수 있습니다. DTrace와의 상호 작용은 루트 사용자에게만 사용 가능한 /dev/dtrace를 통해 이루어집니다. +DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입점과 종료점**에서 발사될 수 있습니다. DTrace와의 상호 작용은 루트 사용자에게만 사용 가능한 /dev/dtrace를 통해 이루어집니다. {% hint style="success" %} SIP 보호를 완전히 비활성화하지 않고 Dtrace를 활성화하려면 복구 모드에서 다음을 실행할 수 있습니다: `csrutil enable --without dtrace` @@ -274,9 +313,9 @@ ID PROVIDER MODULE FUNCTION NAME 43 profile profile-97 44 profile profile-199 ``` -프로브 이름은 네 부분으로 구성됩니다: 제공자, 모듈, 함수 및 이름(`fbt:mach_kernel:ptrace:entry`). 이름의 일부를 지정하지 않으면 Dtrace는 해당 부분을 와일드카드로 적용합니다. +프로브 이름은 네 가지 부분으로 구성됩니다: 제공자, 모듈, 함수 및 이름(`fbt:mach_kernel:ptrace:entry`). 이름의 일부를 지정하지 않으면 Dtrace가 해당 부분을 와일드카드로 적용합니다. -프로브를 활성화하고 발생할 때 수행할 작업을 지정하려면 D 언어를 사용해야 합니다. +프로브를 활성화하고 그들이 발생할 때 수행할 작업을 지정하려면 D 언어를 사용해야 합니다. 더 자세한 설명과 예제는 [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)에서 찾을 수 있습니다. @@ -334,29 +373,29 @@ dtruss -c -p 1000 #get syscalls of PID 1000 ``` ### kdebug -커널 추적 시설입니다. 문서화된 코드는 **`/usr/share/misc/trace.codes`**에서 찾을 수 있습니다. +이것은 커널 추적 시설입니다. 문서화된 코드는 **`/usr/share/misc/trace.codes`**에서 찾을 수 있습니다. `latency`, `sc_usage`, `fs_usage`, `trace`와 같은 도구들이 내부적으로 사용합니다. -`kdebug`와 상호 작용하기 위해 `sysctl`은 `kern.kdebug` 네임스페이스를 통해 사용되며 사용할 MIB는 `sys/sysctl.h`에서 찾을 수 있으며 해당 기능은 `bsd/kern/kdebug.c`에 구현되어 있습니다. +`kdebug`와 상호 작용하기 위해 `sysctl`을 사용하며 `kern.kdebug` 네임스페이스를 통해 MIB를 사용할 수 있으며, 해당 함수는 `bsd/kern/kdebug.c`에 구현되어 있습니다. 일반적으로 사용자 지정 클라이언트로 kdebug와 상호 작용하기 위해 다음 단계를 따릅니다: * 기존 설정을 `KERN_KDSETREMOVE`로 제거합니다. * `KERN_KDSETBUF` 및 `KERN_KDSETUP`으로 추적을 설정합니다. * 버퍼 항목 수를 얻으려면 `KERN_KDGETBUF`를 사용합니다. -* 추적에서 자체 클라이언트를 가져오려면 `KERN_KDPINDEX`를 사용합니다. +* `KERN_KDPINDEX`로 추적에서 자체 클라이언트를 가져옵니다. * `KERN_KDENABLE`로 추적을 활성화합니다. * `KERN_KDREADTR`를 호출하여 버퍼를 읽습니다. * 각 스레드를 해당 프로세스와 일치시키려면 `KERN_KDTHRMAP`을 호출합니다. 이 정보를 얻기 위해 Apple 도구 **`trace`** 또는 사용자 지정 도구 [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**를** 사용할 수 있습니다. -**Kdebug는 한 번에 한 명의 고객만 사용할 수 있습니다.** 따라서 한 번에 하나의 k-debug 기능 도구만 실행할 수 있습니다. +**Kdebug는 한 번에 1명의 고객만 사용할 수 있습니다.** 따라서 한 번에 하나의 k-debug 기능 도구만 실행할 수 있습니다. ### ktrace -`ktrace_*` API는 `libktrace.dylib`에서 가져오며 `Kdebug`의 API를 래핑합니다. 그런 다음 클라이언트는 `ktrace_session_create` 및 `ktrace_events_[single/class]`를 호출하여 특정 코드에 콜백을 설정한 다음 `ktrace_start`로 시작할 수 있습니다. +`ktrace_*` API는 `libktrace.dylib`에서 가져오며 이는 `Kdebug`의 것을 래핑합니다. 그런 다음 클라이언트는 `ktrace_session_create` 및 `ktrace_events_[single/class]`를 호출하여 특정 코드에 콜백을 설정한 다음 `ktrace_start`로 시작할 수 있습니다. **SIP가 활성화된 상태에서도** 이를 사용할 수 있습니다. @@ -370,7 +409,7 @@ ktrace trace -s -S -t c -c ls | grep "ls(" 이것은 커널 레벨 프로파일링을 수행하는 데 사용되며 `Kdebug` 호출을 사용하여 구축됩니다. -기본적으로 전역 변수 `kernel_debug_active`가 확인되고 설정되면 `Kdebug` 코드와 호출하는 커널 프레임의 주소와 함께 `kperf_kdebug_handler`를 호출합니다. `Kdebug` 코드가 선택한 코드와 일치하면 "actions"가 비트맵으로 구성된 것을 가져옵니다 (옵션은 `osfmk/kperf/action.h`를 확인하십시오). +기본적으로 전역 변수 `kernel_debug_active`가 확인되고 설정되면 `Kdebug` 코드와 호출하는 커널 프레임의 주소와 함께 `kperf_kdebug_handler`를 호출합니다. `Kdebug` 코드가 선택한 코드와 일치하는 경우 "actions"가 비트맵으로 구성된 것을 가져옵니다 (옵션은 `osfmk/kperf/action.h`를 확인하십시오). Kperf에는 sysctl MIB 테이블도 있습니다: (루트로) `sysctl kperf`. 이 코드는 `osfmk/kperf/kperfbsd.c`에서 찾을 수 있습니다. @@ -378,7 +417,7 @@ Kperf에는 sysctl MIB 테이블도 있습니다: (루트로) `sysctl kperf`. ### ProcessMonitor -[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)는 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새 프로세스를 모니터링). +[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)는 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새 프로세스 모니터링). ### SpriteTree @@ -410,23 +449,23 @@ fs_usage -w -f network curl #This tracks network actions ``` ### TaskExplorer -[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html)는 이진 파일이 사용하는 **라이브러리**, 사용 중인 **파일** 및 **네트워크** 연결을 볼 수 있는 유용한 도구입니다.\ -또한 바이너리 프로세스를 **virustotal**에 대해 확인하고 해당 바이너리에 대한 정보를 표시합니다. +[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html)는 이진 파일이 사용하는 **라이브러리**, 사용 중인 **파일** 및 **네트워크** 연결을 확인하는 데 유용합니다.\ +또한 바이너리 프로세스를 **virustotal**에 대해 확인하고 바이너리에 대한 정보를 표시합니다. ## PT\_DENY\_ATTACH -[**이 블로그 게시물**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)에서는 SIP가 비활성화되어 있더라도 디버깅을 방지하기 위해 **`PT_DENY_ATTACH`**를 사용하는 실행 중인 데몬을 **디버깅**하는 예제를 찾을 수 있습니다. +[**이 블로그 게시물**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)에서는 SIP가 비활성화되어 있더라도 **`PT_DENY_ATTACH`**를 사용하여 디버깅을 방지하는 **실행 중인 데몬을 디버깅하는** 예제를 찾을 수 있습니다. ### lldb -**lldb**는 **macOS** 이진 파일 **디버깅**을 위한 사실상의 도구입니다. +**lldb**는 **macOS** 이진 파일 **디버깅**의 **사실상 표준 도구**입니다. ```bash lldb ./malware.bin lldb -p 1122 lldb -n malware.bin lldb -n malware.bin --waitfor ``` -**`.lldbinit`**이라는 파일을 홈 폴더에 만들고 다음 줄을 추가하여 lldb를 사용할 때 intel 플레이버를 설정할 수 있습니다: +다음 줄을 포함하는 홈 폴더에 **`.lldbinit`**이라는 파일을 만들어 lldb를 사용할 때 intel 플레이버를 설정할 수 있습니다: ```bash settings set target.x86-disassembly-flavor intel ``` @@ -434,10 +473,10 @@ settings set target.x86-disassembly-flavor intel lldb 내에서 `process save-core`를 사용하여 프로세스 덤프 {% endhint %} -
(lldb) 명령어설명
run (r)중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.
continue (c)디버깅 중인 프로세스의 실행을 계속합니다.
nexti (n / ni)다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.
stepi (s / si)다음 명령을 실행합니다. nexti 명령과 달리, 이 명령은 함수 호출 내부로 진입합니다.
finish (f)현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.
control + c실행을 일시 중지합니다. 프로세스가 실행 중이거나 계속 중인 경우, 프로세스가 현재 실행 중인 위치에서 중지됩니다.
breakpoint (b)

b main # main 함수 호출

b `main # 바이너리의 main 함수

b set -n main --shlib # 지정된 바이너리의 main 함수

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l # 중단점 목록

br e/dis # 중단점 활성화/비활성화

breakpoint delete

help

help breakpoint # 중단점 명령어 도움말

help memory write # 메모리 쓰기 도움말

reg

reg read

reg read $rax

reg read $rax --format format

reg write $rip 0x100035cc0

x/s 메모리를 널 종료된 문자열로 표시합니다.
x/i 어셈블리 명령으로 메모리를 표시합니다.
x/b 바이트로 메모리를 표시합니다.
print object (po)

매개변수로 참조된 객체를 출력합니다.

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Apple의 대부분의 Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. po가 유효한 출력을 생성하지 않으면 x/b를 사용하세요.

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기
memory write -f s $rip+0x11f+7 "AAAA" # 주소에 AAAA 쓰기
disassembly

dis # 현재 함수를 어셈블합니다

dis -n # 함수 어셈블

dis -n -b # 함수 어셈블
dis -c 6 # 6줄 어셈블
dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지
dis -p -c 4 # 현재 주소에서 어셈블 시작

parrayparray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인
+
(lldb) 명령어설명
run (r)중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.
continue (c)디버깅 중인 프로세스의 실행을 계속합니다.
nexti (n / ni)다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.
stepi (s / si)다음 명령을 실행합니다. nexti 명령과 달리, 이 명령은 함수 호출 내부로 진입합니다.
finish (f)현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.
control + c실행을 일시 중지합니다. 프로세스가 실행 중이거나 계속되고 있다면, 현재 실행 중인 위치에서 프로세스를 중지시킵니다.
breakpoint (b)

b main # main 함수 호출

b <binname>`main # 바이너리의 main 함수

b set -n main --shlib <lib_name> # 지정된 바이너리의 main 함수

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l # 중단점 목록

br e/dis <num> # 중단점 활성화/비활성화

breakpoint delete <num>

help

help breakpoint # 중단점 명령어 도움말

help memory write # 메모리 쓰기 도움말

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/memory address>메모리를 널 종료된 문자열로 표시합니다.
x/i <reg/memory address>어셈블리 명령으로 메모리를 표시합니다.
x/b <reg/memory address>바이트로 메모리를 표시합니다.
print object (po)

매개변수로 참조된 객체를 출력합니다

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

대부분의 Apple Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. 의미 있는 출력이 나오지 않으면 x/b를 사용하세요

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기
memory write -f s $rip+0x11f+7 "AAAA" # 주소에 AAAA 쓰기
disassembly

dis # 현재 함수를 어셈블합니다

dis -n <funcname> # 함수 어셈블

dis -n <funcname> -b <basename> # 함수 어셈블
dis -c 6 # 6줄 어셈블
dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지
dis -p -c 4 # 현재 주소에서 어셈블 시작

parrayparray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인
{% hint style="info" %} -**`objc_sendMsg`** 함수를 호출할 때 **rsi** 레지스터는 널 종료된 ("C") 문자열로 메서드의 이름을 보유합니다. lldb를 통해 이름을 출력하려면 다음을 수행합니다: +**`objc_sendMsg`** 함수를 호출할 때, **rsi** 레지스터는 널 종료된 ("C") 문자열로 **메서드 이름**을 보유합니다. lldb를 통해 이름을 출력하려면: `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"` @@ -451,20 +490,20 @@ lldb 내에서 `process save-core`를 사용하여 프로세스 덤프 #### VM 탐지 -* **`sysctl hw.model`** 명령은 호스트가 MacOS인 경우 "Mac"을 반환하고 VM인 경우 다른 값을 반환합니다. +* **`sysctl hw.model`** 명령은 **호스트가 MacOS**인 경우 "Mac"을 반환하고 VM인 경우 다른 값을 반환합니다. * 일부 악성 코드는 **`hw.logicalcpu`** 및 **`hw.physicalcpu`** 값을 조작하여 VM인지 여부를 감지하려고 합니다. -* 일부 악성 코드는 MAC 주소(00:50:56)를 기반으로 기계가 VMware인지 여부를 감지할 수 있습니다. -* 간단한 코드로 **프로세스가 디버깅되고 있는지** 확인할 수 있습니다: +* 일부 악성 코드는 MAC 주소(00:50:56)를 기반으로 **VMware**인지 여부를 감지할 수 있습니다. +* 간단한 코드로 **프로세스가 디버깅 중인지** 확인할 수 있습니다: * `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }` * **`ptrace`** 시스템 호출을 **`PT_DENY_ATTACH`** 플래그와 함께 호출할 수도 있습니다. 이는 디버거가 첨부되고 추적되는 것을 방지합니다. -* **`sysctl`** 또는 **`ptrace`** 함수가 **가져오기(imported)**되었는지 확인할 수 있습니다(그러나 악성 코드는 동적으로 가져올 수 있음). +* **`sysctl`** 또는 **`ptrace`** 함수가 **가져오기(imported)**되었는지 확인할 수 있습니다(그러나 악성 코드는 동적으로 가져올 수 있음) * 이 글에서 언급된 대로, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\ “_메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 **PT\_DENY\_ATTACH**를 사용하고 있음을 나타내는 신호입니다_” ## 코어 덤프 코어 덤프는 다음과 같은 경우에 생성됩니다: -- `kern.coredump` sysctl이 1로 설정되어 있는 경우 (기본값) +- `kern.coredump` sysctl이 1로 설정된 경우 (기본값) - 프로세스가 suid/sgid가 아니거나 `kern.sugid_coredump`가 1로 설정된 경우 (기본값은 0) - `AS_CORE` 제한이 작동을 허용하는 경우. `ulimit -c 0`을 호출하여 코어 덤프 생성을 억제하고, `ulimit -c unlimited`로 다시 활성화할 수 있습니다. @@ -474,11 +513,11 @@ lldb 내에서 `process save-core`를 사용하여 프로세스 덤프 ### [ReportCrash](https://ss64.com/osx/reportcrash.html) -ReportCrash는 **충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장**합니다. 충돌 보고서에는 충돌 원인을 **진단하는 데 도움이 되는 정보**가 포함되어 있습니다.\ -개인 사용자 런치드 컨텍스트에서 실행되는 응용 프로그램 및 기타 프로세스의 경우, ReportCrash는 런치 에이전트로 실행되어 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\ -데몬, 시스템 런치드 컨텍스트에서 실행되는 다른 프로세스 및 다른 권한이 있는 프로세스의 경우, ReportCrash는 런치 데몬으로 실행되어 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다. +ReportCrash는 **크래시하는 프로세스를 분석하고 크래시 보고서를 디스크에 저장**합니다. 크래시 보고서에는 **크래시 원인을 진단하는 데 도움이 되는 정보**가 포함되어 있습니다.\ +개인 사용자 런치드 컨텍스트에서 실행되는 응용 프로그램 및 기타 프로세스의 경우, ReportCrash는 런치 에이전트로 실행되어 사용자의 `~/Library/Logs/DiagnosticReports/`에 크래시 보고서를 저장합니다.\ +데몬, 시스템 런치드 컨텍스트에서 실행되는 다른 프로세스 및 다른 권한이 있는 프로세스의 경우, ReportCrash는 런치 데몬으로 실행되어 시스템의 `/Library/Logs/DiagnosticReports`에 크래시 보고서를 저장합니다. -Apple로 **보내지는 충돌 보고서**에 대해 걱정된다면 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 **서버가 어떻게 충돌했는지 파악하는 데 유용**할 수 있습니다. +Apple로 크래시 보고서가 전송되는 것을 우려한다면 비활성화할 수 있습니다. 그렇지 않으면 크래시 보고서는 **서버가 어떻게 크래시했는지 파악하는 데 유용**할 수 있습니다. ```bash #To disable crash reporting: launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist @@ -596,20 +635,20 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash WhiteIntel의 주요 목표는 정보를 도난당한 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다. -그들의 웹사이트를 방문하여 **무료**로 엔진을 시도해 볼 수 있습니다: +그들의 웹사이트를 방문하여 **무료**로 엔진을 시험해 볼 수 있습니다: {% embed url="https://whiteintel.io" %}
-htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **히어로**까지 AWS 해킹을 배우세요! +htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **히어로**까지 **AWS 해킹 배우기**! HackTricks를 지원하는 다른 방법: * **회사를 HackTricks에 광고하거나 PDF로 다운로드하려면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요! -* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구입하세요 +* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요 * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션 * **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요. -* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 저장소에 PR을 제출하세요. +* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.