mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-21 20:23:18 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
9716ce6253
commit
2a6ccbfac0
1 changed files with 163 additions and 162 deletions
|
@ -1,16 +1,16 @@
|
|||
# macOS 앱 - 검사, 디버깅 및 Fuzzing
|
||||
# macOS Apps - Inspecting, debugging and Fuzzing
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 배우고 실습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 배우고 실습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 레포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
@ -19,17 +19,17 @@ GCP 해킹 배우고 실습하기: <img src="/.gitbook/assets/grte.png" alt="" d
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 기반으로 한 검색 엔진으로, 회사나 그 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)는 **다크 웹** 기반의 검색 엔진으로, 기업이나 고객이 **탈취 악성코드**에 의해 **침해**되었는지 확인할 수 있는 **무료** 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보를 도난당한 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
WhiteIntel의 주요 목표는 정보 탈취 악성코드로 인한 계정 탈취 및 랜섬웨어 공격에 맞서 싸우는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 엔진을 **무료**로 시험해 볼 수 있습니다:
|
||||
그들의 웹사이트를 확인하고 **무료**로 엔진을 사용해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
***
|
||||
|
||||
## 정적 분석
|
||||
## Static Analysis
|
||||
|
||||
### otool & objdump & nm
|
||||
```bash
|
||||
|
@ -49,9 +49,9 @@ objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemb
|
|||
```bash
|
||||
nm -m ./tccd # List of symbols
|
||||
```
|
||||
### jtool2 및 Disarm
|
||||
### jtool2 & Disarm
|
||||
|
||||
[**여기에서 disarm을 다운로드할 수 있습니다**](https://newosxbook.com/tools/disarm.html).
|
||||
You can [**여기에서 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
|
||||
|
@ -60,7 +60,7 @@ 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`로 설치하세요.
|
||||
여기에서 [**jtool2를 다운로드하세요**](http://www.newosxbook.com/tools/jtool.html) 또는 `brew`로 설치할 수 있습니다.
|
||||
```bash
|
||||
# Install
|
||||
brew install --cask jtool2
|
||||
|
@ -78,13 +78,13 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
|
|||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
**jtool은 disarm을 사용하는 것이 권장됩니다.**
|
||||
**jtool은 disarm을 위해 더 이상 사용되지 않습니다**
|
||||
{% endhint %}
|
||||
|
||||
### Codesign / ldid
|
||||
|
||||
{% hint style="success" %}
|
||||
**`Codesign`**은 **macOS**에, **`ldid`**는 **iOS**에 있습니다.
|
||||
**`Codesign`**은 **macOS**에서 찾을 수 있으며 **`ldid`**는 **iOS**에서 찾을 수 있습니다
|
||||
{% endhint %}
|
||||
```bash
|
||||
# Get signer
|
||||
|
@ -114,49 +114,51 @@ ldid -S/tmp/entl.xml <binary>
|
|||
```
|
||||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)은 **.pkg** 파일(설치 프로그램)을 검사하고 설치하기 전에 내부를 확인하는 데 유용한 도구입니다.\
|
||||
이러한 설치 프로그램에는 일반적으로 악성 코드 제작자가 악용하는 `preinstall` 및 `postinstall` bash 스크립트가 포함되어 있습니다.
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)는 **.pkg** 파일(설치 프로그램)을 검사하고 설치하기 전에 내부 내용을 확인하는 데 유용한 도구입니다.\
|
||||
이 설치 프로그램에는 맬웨어 작성자가 일반적으로 **persist** **the** **malware**를 악용하는 `preinstall` 및 `postinstall` bash 스크립트가 포함되어 있습니다.
|
||||
|
||||
### hdiutil
|
||||
|
||||
이 도구를 사용하면 Apple 디스크 이미지(**.dmg**) 파일을 **마운트**하여 실행하기 전에 내용을 확인할 수 있습니다:
|
||||
이 도구는 Apple 디스크 이미지(**.dmg**) 파일을 **mount**하여 실행하기 전에 검사할 수 있도록 합니다:
|
||||
```bash
|
||||
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
||||
```
|
||||
### 패킹된 이진 파일
|
||||
It will be mounted in `/Volumes`
|
||||
|
||||
* 고엔트로피를 확인합니다.
|
||||
* 문자열을 확인합니다 (거의 이해할 수 없는 문자열이 있는지 확인하여 패킹된지 확인).
|
||||
* MacOS용 UPX 패커는 "\_\_XHDR"이라는 섹션을 생성합니다.
|
||||
### Packed binaries
|
||||
|
||||
## 정적 Objective-C 분석
|
||||
* 높은 엔트로피 확인
|
||||
* 문자열 확인 (이해할 수 있는 문자열이 거의 없으면, 패킹됨)
|
||||
* MacOS용 UPX 패커는 "\_\_XHDR"라는 섹션을 생성합니다.
|
||||
|
||||
### 메타데이터
|
||||
## Static Objective-C analysis
|
||||
|
||||
### Metadata
|
||||
|
||||
{% hint style="danger" %}
|
||||
Objective-C로 작성된 프로그램은 [Mach-O 이진 파일](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)로 컴파일될 때 클래스 선언을 유지합니다. 이러한 클래스 선언에는 다음이 포함됩니다:
|
||||
Objective-C로 작성된 프로그램은 [Mach-O binaries](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)로 컴파일될 때 **클래스 선언을 유지**합니다. 이러한 클래스 선언에는 다음의 이름과 유형이 **포함**됩니다:
|
||||
{% endhint %}
|
||||
|
||||
* 정의된 인터페이스
|
||||
* 인터페이스 메소드
|
||||
* 인터페이스 메서드
|
||||
* 인터페이스 인스턴스 변수
|
||||
* 정의된 프로토콜
|
||||
|
||||
이러한 이름들은 바이너리의 역공학을 어렵게 만들기 위해 난독화될 수 있습니다.
|
||||
이 이름들은 이진 파일의 리버싱을 더 어렵게 만들기 위해 난독화될 수 있습니다.
|
||||
|
||||
### 함수 호출
|
||||
### Function calling
|
||||
|
||||
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)
|
||||
|
@ -164,27 +166,27 @@ ARM64에서 **`lldb`를 사용하여 이 정보를 쉽게 얻는 방법**은 다
|
|||
|
||||
x64:
|
||||
|
||||
| **인자** | **레지스터** | **(objc\_msgSend용) ** |
|
||||
| **Argument** | **Register** | **(for) objc\_msgSend** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1번째 인자** | **rdi** | **self: 메소드가 호출되는 객체** |
|
||||
| **2번째 인자** | **rsi** | **op: 메소드의 이름** |
|
||||
| **3번째 인자** | **rdx** | **메소드에 대한 1번째 인자** |
|
||||
| **4번째 인자** | **rcx** | **메소드에 대한 2번째 인자** |
|
||||
| **5번째 인자** | **r8** | **메소드에 대한 3번째 인자** |
|
||||
| **6번째 인자** | **r9** | **메소드에 대한 4번째 인자** |
|
||||
| **7번째+ 인자** | <p><strong>rsp+</strong><br><strong>(스택 상에)</strong></p> | **메소드에 대한 5번째+ 인자** |
|
||||
| **1st argument** | **rdi** | **self: 메서드가 호출되는 객체** |
|
||||
| **2nd argument** | **rsi** | **op: 메서드의 이름** |
|
||||
| **3rd argument** | **rdx** | **메서드에 대한 1번째 인수** |
|
||||
| **4th argument** | **rcx** | **메서드에 대한 2번째 인수** |
|
||||
| **5th argument** | **r8** | **메서드에 대한 3번째 인수** |
|
||||
| **6th argument** | **r9** | **메서드에 대한 4번째 인수** |
|
||||
| **7th+ argument** | <p><strong>rsp+</strong><br><strong>(스택에서)</strong></p> | **메서드에 대한 5번째+ 인수** |
|
||||
|
||||
### ObjectiveC 메타데이터 덤프
|
||||
### Dump ObjectiveC metadata
|
||||
|
||||
### Dynadump
|
||||
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump)는 Objective-C 이진 파일을 클래스 덤프하는 도구입니다. 깃허브에서는 dylibs를 지정하지만 실행 파일에서도 작동합니다.
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump)는 Objective-C 이진 파일을 클래스 덤프하는 도구입니다. GitHub에서는 dylibs를 명시하지만, 실행 파일에서도 작동합니다.
|
||||
```bash
|
||||
./dynadump dump /path/to/bin
|
||||
```
|
||||
현재 이것이 **가장 잘 작동하는 것**입니다.
|
||||
At the time of the writing, this is **현재 가장 잘 작동하는 것**.
|
||||
|
||||
#### 일반 도구
|
||||
#### Regular tools
|
||||
```bash
|
||||
nm --dyldinfo-only /path/to/bin
|
||||
otool -ov /path/to/bin
|
||||
|
@ -192,24 +194,24 @@ objdump --macho --objc-meta-data /path/to/bin
|
|||
```
|
||||
#### class-dump
|
||||
|
||||
[**class-dump**](https://github.com/nygard/class-dump/)은 ObjetiveC 형식의 코드에서 클래스, 카테고리 및 프로토콜에 대한 선언을 생성하는 원본 도구입니다.
|
||||
[**class-dump**](https://github.com/nygard/class-dump/)는 ObjetiveC 형식의 코드에서 클래스, 카테고리 및 프로토콜에 대한 선언을 생성하는 원래 도구입니다.
|
||||
|
||||
이 도구는 오래되었고 유지되지 않았으므로 제대로 작동하지 않을 수 있습니다.
|
||||
오래되었고 유지 관리되지 않아서 제대로 작동하지 않을 가능성이 높습니다.
|
||||
|
||||
#### ICDump
|
||||
|
||||
[**iCDump**](https://github.com/romainthomas/iCDump)은 현대적이고 크로스 플랫폼 Objective-C 클래스 덤프입니다. 기존 도구와 비교하여 iCDump는 Apple 생태계와 독립적으로 실행되며 Python 바인딩을 노출합니다.
|
||||
[**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 분석
|
||||
## Static Swift analysis
|
||||
|
||||
Swift 이진 파일의 경우 Objective-C 호환성이 있기 때문에 때로는 [class-dump](https://github.com/nygard/class-dump/)를 사용하여 선언을 추출할 수 있지만 항상 그렇지는 않습니다.
|
||||
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
|
||||
|
@ -221,9 +223,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
|||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
당부 섹션에 저장된 정보에 대한 자세한 내용은 [이 블로그 게시물](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html)에서 찾을 수 있습니다.
|
||||
이 섹션에 저장된 [**정보에 대한 추가 정보는 이 블로그 게시물에서 확인할 수 있습니다**](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
|
||||
|
@ -234,74 +236,74 @@ swift demangle
|
|||
## 동적 분석
|
||||
|
||||
{% hint style="warning" %}
|
||||
바이너리를 디버깅하려면 **SIP를 비활성화**해야 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 바이너리를 임시 폴더로 복사하고 `codesign --remove-signature <binary-path>`로 서명을 **제거**하거나 바이너리의 디버깅을 허용해야 합니다(이 스크립트를 사용할 수 있습니다 [여기](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)).
|
||||
이진 파일을 디버깅하려면 **SIP를 비활성화해야** 합니다 (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 이진 파일을 임시 폴더로 복사하고 **서명을 제거해야** 합니다 `codesign --remove-signature <binary-path>` 또는 이진 파일의 디버깅을 허용해야 합니다 ( [이 스크립트](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)를 사용할 수 있습니다).
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
macOS에서 **시스템 바이너리를 instrument**하려면(`cloudconfigurationd`와 같은) **SIP를 비활성화**해야 합니다(서명을 제거하는 것만으로는 작동하지 않습니다).
|
||||
macOS에서 **시스템 이진 파일**(예: `cloudconfigurationd`)을 **계측**하려면 **SIP를 비활성화해야** 합니다 (서명만 제거하는 것은 작동하지 않습니다).
|
||||
{% endhint %}
|
||||
|
||||
### APIs
|
||||
### API
|
||||
|
||||
macOS는 프로세스에 대한 정보를 제공하는 몇 가지 흥미로운 API를 노출합니다:
|
||||
|
||||
* `proc_info`: 각 프로세스에 대한 많은 정보를 제공하는 주요 API입니다. 다른 프로세스 정보를 얻으려면 루트여야 하지만 특별한 권한이나 mach 포트가 필요하지는 않습니다.
|
||||
* `libsysmon.dylib`: XPC 노출 함수를 통해 프로세스 정보를 얻을 수 있게 해줍니다. 그러나 `com.apple.sysmond.client` 엔터티가 필요합니다.
|
||||
* `proc_info`: 각 프로세스에 대한 많은 정보를 제공하는 주요 API입니다. 다른 프로세스 정보를 얻으려면 root 권한이 필요하지만 특별한 권한이나 mach 포트는 필요하지 않습니다.
|
||||
* `libsysmon.dylib`: XPC로 노출된 함수를 통해 프로세스에 대한 정보를 얻을 수 있게 해주지만, `com.apple.sysmond.client` 권한이 필요합니다.
|
||||
|
||||
### Stackshot & microstackshots
|
||||
### 스택샷 및 마이크로스택샷
|
||||
|
||||
**Stackshotting**은 프로세스의 상태를 캡처하는 기술로, 모든 실행 중인 스레드의 콜 스택을 포함합니다. 이는 디버깅, 성능 분석 및 특정 시점에서 시스템의 동작을 이해하는 데 특히 유용합니다. iOS 및 macOS에서는 **`sample`** 및 **`spindump`**와 같은 도구 및 방법을 사용하여 stackshotting을 수행할 수 있습니다.
|
||||
**스택샷팅**은 프로세스의 상태를 캡처하는 기술로, 모든 실행 중인 스레드의 호출 스택을 포함합니다. 이는 디버깅, 성능 분석 및 특정 시점에서 시스템의 동작을 이해하는 데 특히 유용합니다. iOS 및 macOS에서는 **`sample`** 및 **`spindump`**와 같은 여러 도구와 방법을 사용하여 스택샷팅을 수행할 수 있습니다.
|
||||
|
||||
### Sysdiagnose
|
||||
|
||||
이 도구(`/usr/bini/ysdiagnose`)는 기본적으로 `ps`, `zprint` 등 수십 가지 다른 명령을 실행하여 컴퓨터에서 많은 정보를 수집합니다.
|
||||
이 도구 (`/usr/bini/ysdiagnose`)는 기본적으로 `ps`, `zprint`와 같은 수십 개의 다양한 명령을 실행하여 컴퓨터에서 많은 정보를 수집합니다.
|
||||
|
||||
**루트**로 실행해야 하며 `/usr/libexec/sysdiagnosed` 데몬에는 `com.apple.system-task-ports` 및 `get-task-allow`와 같은 매우 흥미로운 엔터티가 있습니다.
|
||||
**root**로 실행해야 하며, 데몬 `/usr/libexec/sysdiagnosed`는 `com.apple.system-task-ports` 및 `get-task-allow`와 같은 매우 흥미로운 권한을 가지고 있습니다.
|
||||
|
||||
그 plist는 `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`에 있으며 3개의 MachServices를 선언합니다:
|
||||
그의 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.CacheDelete`: /var/rmp의 오래된 아카이브를 삭제합니다.
|
||||
* `com.apple.sysdiagnose.kernel.ipc`: 특별 포트 23 (커널)
|
||||
* `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-C 클래스를 통한 사용자 모드 인터페이스. 사전 정의된 세 가지 인수(`compress`, `display`, `run`)를 전달할 수 있습니다.
|
||||
|
||||
### Unified Logs
|
||||
### 통합 로그
|
||||
|
||||
MacOS는 응용 프로그램을 실행할 때 매우 유용한 로그를 생성합니다.
|
||||
MacOS는 애플리케이션을 실행할 때 **무엇을 하고 있는지** 이해하는 데 매우 유용할 수 있는 많은 로그를 생성합니다.
|
||||
|
||||
또한, 일부 로그에는 `<private>` 태그가 포함되어 **사용자** 또는 **컴퓨터** **식별 가능한** 정보를 **숨기기** 위해 사용됩니다. 그러나 **인증서를 설치하여 이 정보를 공개**할 수 있습니다. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)의 설명을 따르세요.
|
||||
또한, `<private>` 태그가 포함된 로그가 있어 **사용자** 또는 **컴퓨터** **식별 가능한** 정보를 **숨깁니다**. 그러나 이 정보를 **공개하기 위해 인증서를 설치할 수 있습니다**. [**여기**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log)에서 설명을 따르세요.
|
||||
|
||||
### Hopper
|
||||
### 호퍼
|
||||
|
||||
#### 왼쪽 패널
|
||||
|
||||
Hopper의 왼쪽 패널에서는 바이너리의 심볼(**라벨**), 프로시저 및 함수 목록(**Proc**) 및 문자열(**Str**)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분(예: _cstring 또는 `objc_methname`)에 정의된 문자열 중 일부입니다.
|
||||
호퍼의 왼쪽 패널에서는 이진 파일의 기호(**Labels**), 절차 및 함수 목록(**Proc**), 문자열(**Str**)을 볼 수 있습니다. 이들은 모든 문자열이 아니라 Mac-O 파일의 여러 부분에서 정의된 문자열입니다 (예: _cstring 또는_ `objc_methname`).
|
||||
|
||||
#### 가운데 패널
|
||||
#### 중간 패널
|
||||
|
||||
가운데 패널에서는 **어셈블리 코드**를 볼 수 있습니다. 그리고 **원시** 어셈블리, **그래프**, **디컴파일** 및 **바이너리**로 볼 수 있습니다. 각각의 아이콘을 클릭하여:
|
||||
중간 패널에서는 **디스어셈블된 코드**를 볼 수 있습니다. 원시 디스어셈블, 그래프, 디컴파일된 코드 및 이진 파일로 각각의 아이콘을 클릭하여 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (343).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
코드 객체를 마우스 오른쪽 버튼으로 클릭하면 해당 객체에 대한 **참조/참조**를 볼 수 있거나 이름을 변경할 수 있습니다(디컴파일된 의사 코드에서는 작동하지 않음):
|
||||
코드 객체를 오른쪽 클릭하면 **해당 객체에 대한 참조**를 보거나 이름을 변경할 수 있습니다 (이것은 디컴파일된 의사 코드에서는 작동하지 않습니다):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
또한, **가운데 아래에서 python 명령을 작성**할 수 있습니다.
|
||||
또한, **중간 하단에서 파이썬 명령을 작성할 수 있습니다**.
|
||||
|
||||
#### 오른쪽 패널
|
||||
|
||||
오른쪽 패널에서는 **탐색 기록**(현재 상황에 도달한 방법을 알 수 있음), **호출 그래프**(이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있는 그래프) 및 **로컬 변수** 정보와 같은 흥미로운 정보를 볼 수 있습니다.
|
||||
오른쪽 패널에서는 **탐색 기록**(현재 상황에 도달한 방법을 알 수 있음), **호출 그래프**(이 함수를 호출하는 모든 함수와 이 함수가 호출하는 모든 함수), **지역 변수** 정보를 포함한 흥미로운 정보를 볼 수 있습니다.
|
||||
|
||||
### dtrace
|
||||
|
||||
Dtrace는 사용자가 **매우 낮은 수준**에서 응용 프로그램에 액세스할 수 있게 하며 프로그램을 **추적**하고 실행 흐름을 심지어 변경할 수 있는 방법을 제공합니다. Dtrace는 **커널 전체에 배치된** 프로브를 사용하며 시스템 호출의 시작과 끝과 같은 위치에 있습니다.
|
||||
dtrace는 사용자가 애플리케이션에 매우 **저수준**으로 접근할 수 있게 해주며, 사용자가 **프로그램을 추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **프로브**를 사용하며, 이는 **커널 전역에 배치**되어 시스템 호출의 시작과 끝과 같은 위치에 있습니다.
|
||||
|
||||
DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입점과 종료점**에서 발사될 수 있습니다. DTrace와의 상호 작용은 루트 사용자에게만 사용 가능한 /dev/dtrace를 통해 이루어집니다.
|
||||
DTrace는 각 시스템 호출에 대한 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입 및 종료 지점**에서 발사될 수 있습니다. DTrace와의 상호작용은 /dev/dtrace를 통해 이루어지며, 이는 root 사용자만 사용할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
SIP 보호를 완전히 비활성화하지 않고 Dtrace를 활성화하려면 복구 모드에서 다음을 실행할 수 있습니다: `csrutil enable --without dtrace`
|
||||
|
||||
또한 **컴파일한 바이너리**를 **`dtrace`** 또는 **`dtruss`**할 수 있습니다.
|
||||
또한 **`dtrace`** 또는 **`dtruss`** 이진 파일을 **컴파일한 경우** 사용할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
dtrace의 사용 가능한 프로브는 다음과 같이 얻을 수 있습니다:
|
||||
|
@ -314,17 +316,15 @@ 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 언어를 사용해야 합니다.
|
||||
DTrace를 구성하여 프로브를 활성화하고 프로브가 작동할 때 수행할 작업을 지정하려면 D 언어를 사용해야 합니다.
|
||||
|
||||
더 자세한 설명과 예제는 [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)에서 찾을 수 있습니다.
|
||||
자세한 설명과 더 많은 예제는 [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html)에서 확인할 수 있습니다.
|
||||
|
||||
#### 예시
|
||||
#### 예제
|
||||
|
||||
`man -k dtrace`를 실행하여 **사용 가능한 DTrace 스크립트 목록**을 확인합니다. 예: `sudo dtruss -n binary`
|
||||
|
||||
* 한 줄에서
|
||||
`man -k dtrace`를 실행하여 **사용 가능한 DTrace 스크립트**를 나열합니다. 예: `sudo dtruss -n binary`
|
||||
```bash
|
||||
#Count the number of syscalls of each running process
|
||||
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
|
||||
|
@ -374,33 +374,33 @@ 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`와 같은 도구들이 내부적으로 사용합니다.
|
||||
`latency`, `sc_usage`, `fs_usage` 및 `trace`와 같은 도구는 내부적으로 이를 사용합니다.
|
||||
|
||||
`kdebug`와 상호 작용하기 위해 `sysctl`을 사용하며 `kern.kdebug` 네임스페이스를 통해 MIB를 사용할 수 있으며, 해당 함수는 `bsd/kern/kdebug.c`에 구현되어 있습니다.
|
||||
`kdebug`와 인터페이스하기 위해 `sysctl`은 `kern.kdebug` 네임스페이스를 통해 사용되며, 사용할 MIB는 `bsd/kern/kdebug.c`에 구현된 함수가 있는 `sys/sysctl.h`에서 찾을 수 있습니다.
|
||||
|
||||
일반적으로 사용자 지정 클라이언트와 상호 작용하기 위한 단계는 다음과 같습니다:
|
||||
커스텀 클라이언트로 kdebug와 상호작용하기 위한 일반적인 단계는 다음과 같습니다:
|
||||
|
||||
* 기존 설정을 `KERN_KDSETREMOVE`로 제거합니다.
|
||||
* `KERN_KDSETBUF` 및 `KERN_KDSETUP`으로 추적을 설정합니다.
|
||||
* 버퍼 항목 수를 얻기 위해 `KERN_KDGETBUF`를 사용합니다.
|
||||
* 추적에서 자체 클라이언트를 가져오려면 `KERN_KDPINDEX`를 사용합니다.
|
||||
* `KERN_KDENABLE`로 추적을 활성화합니다.
|
||||
* `KERN_KDREADTR`를 호출하여 버퍼를 읽습니다.
|
||||
* 각 스레드를 해당 프로세스와 일치시키려면 `KERN_KDTHRMAP`을 호출합니다.
|
||||
* KERN\_KDSETREMOVE로 기존 설정 제거
|
||||
* KERN\_KDSETBUF 및 KERN\_KDSETUP으로 추적 설정
|
||||
* KERN\_KDGETBUF로 버퍼 항목 수 가져오기
|
||||
* KERN\_KDPINDEX로 추적에서 자신의 클라이언트 가져오기
|
||||
* KERN\_KDENABLE로 추적 활성화
|
||||
* KERN\_KDREADTR 호출로 버퍼 읽기
|
||||
* 각 스레드를 프로세스와 매칭하기 위해 KERN\_KDTHRMAP 호출.
|
||||
|
||||
이 정보를 얻기 위해 Apple 도구 **`trace`** 또는 사용자 지정 도구 [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**를** 사용할 수 있습니다.
|
||||
이 정보를 얻기 위해 Apple 도구 **`trace`** 또는 커스텀 도구 [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**를 사용할 수 있습니다.**
|
||||
|
||||
**Kdebug는 한 번에 1명의 고객만 사용할 수 있습니다.** 따라서 동시에 실행되는 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가 활성화된 상태에서도** 이를 사용할 수 있습니다.
|
||||
**SIP가 활성화된 상태에서도 이 도구를 사용할 수 있습니다.**
|
||||
|
||||
`ktrace` 유틸리티를 클라이언트로 사용할 수 있습니다:
|
||||
클라이언트로는 유틸리티 `ktrace`를 사용할 수 있습니다:
|
||||
```bash
|
||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||
```
|
||||
|
@ -408,76 +408,76 @@ Or `tailspin`.
|
|||
|
||||
### kperf
|
||||
|
||||
이는 커널 레벨 프로파일링을 수행하는 데 사용되며 `Kdebug` 호출을 사용하여 구축됩니다.
|
||||
이것은 커널 수준 프로파일링을 수행하는 데 사용되며 `Kdebug` 호출을 사용하여 구축됩니다.
|
||||
|
||||
기본적으로 전역 변수 `kernel_debug_active`가 확인되고 설정되면 `Kdebug` 코드와 호출하는 커널 프레임의 주소와 함께 `kperf_kdebug_handler`를 호출합니다. `Kdebug` 코드가 선택한 코드와 일치하는 경우 "actions"가 비트맵으로 구성된 것을 가져옵니다 (옵션은 `osfmk/kperf/action.h`를 확인하십시오).
|
||||
기본적으로, 전역 변수 `kernel_debug_active`가 확인되고 설정되면 `Kdebug` 코드와 호출하는 커널 프레임의 주소로 `kperf_kdebug_handler`를 호출합니다. `Kdebug` 코드가 선택된 것과 일치하면 비트맵으로 구성된 "작업"을 가져옵니다(옵션은 `osfmk/kperf/action.h`를 확인하십시오).
|
||||
|
||||
Kperf에는 sysctl MIB 테이블도 있습니다: (루트로) `sysctl kperf`. 이 코드는 `osfmk/kperf/kperfbsd.c`에서 찾을 수 있습니다.
|
||||
|
||||
또한 Kperfs 기능의 하위 집합은 기계 성능 카운터에 대한 정보를 제공하는 `kpc`에 있습니다.
|
||||
게다가, Kperf의 기능의 일부는 `kpc`에 존재하며, 이는 머신 성능 카운터에 대한 정보를 제공합니다.
|
||||
|
||||
### ProcessMonitor
|
||||
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)는 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새 프로세스를 모니터링).
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor)는 프로세스가 수행하는 프로세스 관련 작업을 확인하는 데 매우 유용한 도구입니다(예: 프로세스가 생성하는 새로운 프로세스를 모니터링).
|
||||
|
||||
### SpriteTree
|
||||
|
||||
[**SpriteTree**](https://themittenmac.com/tools/)는 프로세스 간 관계를 출력하는 도구입니다.\
|
||||
**`sudo eslogger fork exec rename create > cap.json`**과 같은 명령을 사용하여 맥을 모니터링해야 합니다 (이를 시작하는 터미널에 FDA가 필요함). 그런 다음이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:
|
||||
[**SpriteTree**](https://themittenmac.com/tools/)는 프로세스 간의 관계를 인쇄하는 도구입니다.\
|
||||
**`sudo eslogger fork exec rename create > cap.json`**와 같은 명령으로 Mac을 모니터링해야 합니다(이를 실행하는 터미널은 FDA가 필요합니다). 그런 다음 이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
### FileMonitor
|
||||
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)는 파일 이벤트 (생성, 수정, 삭제 등)를 모니터링하여 해당 이벤트에 대한 자세한 정보를 제공합니다.
|
||||
[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor)는 파일 이벤트(생성, 수정 및 삭제와 같은)를 모니터링하여 이러한 이벤트에 대한 자세한 정보를 제공합니다.
|
||||
|
||||
### Crescendo
|
||||
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Microsoft Sysinternal의 _Procmon_에서 Windows 사용자가 알 수 있는 룩 앤 필을 가진 GUI 도구입니다. 이 도구를 사용하면 다양한 이벤트 유형의 녹화를 시작하고 중지할 수 있으며 파일, 프로세스, 네트워크 등과 같은 범주별로 이러한 이벤트를 필터링할 수 있으며 녹화된 이벤트를 json 형식으로 저장할 수 있습니다.
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Microsoft Sysinternal의 _Procmon_에서 Windows 사용자가 알 수 있는 모양과 느낌을 가진 GUI 도구입니다. 이 도구는 다양한 이벤트 유형의 기록을 시작하고 중지할 수 있으며, 파일, 프로세스, 네트워크 등과 같은 카테고리별로 이러한 이벤트를 필터링할 수 있는 기능을 제공하고, 기록된 이벤트를 json 형식으로 저장할 수 있는 기능을 제공합니다.
|
||||
|
||||
### Apple Instruments
|
||||
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html)은 Xcode의 개발자 도구의 일부로, 애플리케이션 성능을 모니터링하고 메모리 누수를 식별하며 파일 시스템 활동을 추적하는 데 사용됩니다.
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html)는 Xcode의 개발자 도구의 일부로, 애플리케이션 성능 모니터링, 메모리 누수 식별 및 파일 시스템 활동 추적에 사용됩니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (1138).png>)
|
||||
|
||||
### fs\_usage
|
||||
|
||||
프로세스가 수행하는 작업을 따를 수 있게 합니다:
|
||||
프로세스가 수행하는 작업을 추적할 수 있습니다:
|
||||
```bash
|
||||
fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
|
||||
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 <a href="#page-title" id="page-title"></a>
|
||||
|
||||
[**이 블로그 게시물**](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)에서는 **`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
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
lldb 내에서 `process save-core`를 사용하여 프로세스 덤프를 수행합니다.
|
||||
lldb 내부에서 `process save-core`로 프로세스를 덤프합니다.
|
||||
{% endhint %}
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 명령어</strong></td><td><strong>설명</strong></td></tr><tr><td><strong>run (r)</strong></td><td>중단점이 만나거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.</td></tr><tr><td><strong>continue (c)</strong></td><td>디버깅 중인 프로세스의 실행을 계속합니다.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>다음 명령을 실행합니다. 이 명령은 함수 호출을 건너뜁니다.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>다음 명령을 실행합니다. nexti 명령과 달리, 이 명령은 함수 호출 내부로 진입합니다.</td></tr><tr><td><strong>finish (f)</strong></td><td>현재 함수("프레임")의 남은 명령을 실행하고 중지합니다.</td></tr><tr><td><strong>control + c</strong></td><td>실행을 일시 중지합니다. 프로세스가 실행 중이거나 계속되고 있으면 현재 실행 중인 위치에서 프로세스를 중지시킵니다.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main # main 함수 호출</p><p>b <binname>`main # 바이너리의 main 함수</p><p>b set -n main --shlib <lib_name> # 지정된 바이너리의 main 함수</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l # 중단점 목록</p><p>br e/dis <num> # 중단점 활성화/비활성화</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # 중단점 명령어 도움말</p><p>help memory write # 메모리 쓰기 도움말</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address</strong></td><td>메모리를 널 종료된 문자열로 표시합니다.</td></tr><tr><td><strong>x/i <reg/memory address</strong></td><td>어셈블리 명령으로 메모리를 표시합니다.</td></tr><tr><td><strong>x/b <reg/memory address</strong></td><td>바이트로 메모리를 표시합니다.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>매개변수로 참조된 객체를 출력합니다.</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Apple의 대부분의 Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. 의미 있는 출력이 생성되지 않는 경우 <code>x/b</code>를 사용하세요.</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA를 씁니다<br>memory write -f s $rip+0x11f+7 "AAAA" # 해당 주소에 AAAA를 씁니다</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 현재 함수의 어셈블리 코드 표시</p><p>dis -n <funcname> # 함수의 어셈블리 코드 표시</p><p>dis -n <funcname> -b <basename> # 함수의 어셈블리 코드 표시<br>dis -c 6 # 6줄 어셈블리 코드 표시<br>dis -c 0x100003764 -e 0x100003768 # 한 주소부터 다른 주소까지 어셈블리 코드 표시<br>dis -p -c 4 # 현재 주소부터 어셈블리 코드 표시 시작</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) 명령어</strong></td><td><strong>설명</strong></td></tr><tr><td><strong>run (r)</strong></td><td>중단점에 도달하거나 프로세스가 종료될 때까지 계속 실행을 시작합니다.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>진입점에서 중단하며 실행을 시작합니다.</td></tr><tr><td><strong>continue (c)</strong></td><td>디버깅 중인 프로세스의 실행을 계속합니다.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>다음 명령어를 실행합니다. 이 명령어는 함수 호출을 건너뜁니다.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>다음 명령어를 실행합니다. nexti 명령어와 달리 이 명령어는 함수 호출로 들어갑니다.</td></tr><tr><td><strong>finish (f)</strong></td><td>현재 함수(“프레임”)의 나머지 명령어를 실행하고 반환 후 중단합니다.</td></tr><tr><td><strong>control + c</strong></td><td>실행을 일시 중지합니다. 프로세스가 실행(run)되었거나 계속(continue)되었으면, 현재 실행 중인 위치에서 프로세스가 중단됩니다.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> # main이라는 이름의 함수</p><p><code>b <binname>`main</code> # 바이너리의 main 함수</p><p><code>b set -n main --shlib <lib_name></code> # 지정된 바이너리의 main 함수</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> # 모든 NSFileManager 메서드</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # 해당 라이브러리의 모든 함수에서 중단</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> # 중단점 목록</p><p><code>br e/dis <num></code> # 중단점 활성화/비활성화</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint # 중단점 명령어 도움말</p><p>help memory write # 메모리에 쓰기 도움말</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>메모리를 null로 종료된 문자열로 표시합니다.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>메모리를 어셈블리 명령어로 표시합니다.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>메모리를 바이트로 표시합니다.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>이 명령어는 매개변수로 참조된 객체를 출력합니다.</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>대부분의 Apple의 Objective-C API 또는 메서드는 객체를 반환하므로 “print object” (po) 명령어를 통해 표시해야 합니다. po가 의미 있는 출력을 생성하지 않으면 <code>x/b</code>를 사용하세요.</p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기<br>memory write -f s $rip+0x11f+7 "AAAA" # 해당 주소에 AAAA 쓰기</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis # 현재 함수의 디스어셈블리</p><p>dis -n <funcname> # 함수의 디스어셈블리</p><p>dis -n <funcname> -b <basename> # 함수의 디스어셈블리<br>dis -c 6 # 6줄 디스어셈블리<br>dis -c 0x100003764 -e 0x100003768 # 한 주소에서 다른 주소까지<br>dis -p -c 4 # 현재 주소에서 디스어셈블리 시작</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인</td></tr><tr><td><strong>image dump sections</strong></td><td>현재 프로세스 메모리의 맵을 출력합니다.</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> # CoreNLP의 모든 기호 주소 가져오기</td></tr></tbody></table>
|
||||
|
||||
{% hint style="info" %}
|
||||
**`objc_sendMsg`** 함수를 호출할 때 **rsi** 레지스터는 널 종료된 ("C") 문자열로 메서드의 이름을 보유합니다. lldb를 통해 이름을 출력하려면 다음을 수행합니다:
|
||||
**`objc_sendMsg`** 함수를 호출할 때, **rsi** 레지스터는 null로 종료된 (“C”) 문자열로서 **메서드의 이름**을 보유합니다. lldb를 통해 이름을 출력하려면 다음과 같이 하세요:
|
||||
|
||||
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
|
@ -489,36 +489,37 @@ lldb 내에서 `process save-core`를 사용하여 프로세스 덤프를 수행
|
|||
|
||||
### 동적 분석 방지
|
||||
|
||||
#### 가상 머신 탐지
|
||||
#### VM 탐지
|
||||
|
||||
* **`sysctl hw.model`** 명령은 호스트가 MacOS인 경우 "Mac"을 반환하고 VM인 경우 다른 값을 반환합니다.
|
||||
* 일부 악성 코드는 **`hw.logicalcpu`** 및 **`hw.physicalcpu`** 값을 조작하여 VM인지 여부를 감지하려고 합니다.
|
||||
* 일부 악성 코드는 MAC 주소(00:50:56)를 기반으로 기계가 VMware인지 여부를 감지할 수 있습니다.
|
||||
* **`sysctl hw.model`** 명령어는 **호스트가 MacOS**일 때 "Mac"을 반환하지만 VM일 때는 다른 값을 반환합니다.
|
||||
* **`hw.logicalcpu`** 및 **`hw.physicalcpu`**의 값을 조작하여 일부 악성코드는 VM인지 감지하려고 합니다.
|
||||
* 일부 악성코드는 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)**되었는지 확인할 수 있습니다(그러나 악성 코드는 동적으로 가져올 수 있음).
|
||||
* 이 글에서 언급된 대로, “[Anti-Debug 기술 무력화: macOS ptrace 변형](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
“_메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 **PT\_DENY\_ATTACH**를 사용하고 있음을 나타내는 신호입니다_”
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //디버깅 중인 프로세스 }`
|
||||
* **`ptrace`** 시스템 호출을 **`PT_DENY_ATTACH`** 플래그와 함께 호출할 수도 있습니다. 이는 디버거가 연결하고 추적하는 것을 **방지**합니다.
|
||||
* **`sysctl`** 또는 **`ptrace`** 함수가 **가져와지는지** 확인할 수 있습니다 (하지만 악성코드는 동적으로 가져올 수 있습니다).
|
||||
* 이 글에서 언급된 바와 같이, “[디버그 방지 기술 무력화: macOS ptrace 변형](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
“_Process # exited with **status = 45 (0x0000002d)** 메시지는 디버그 대상이 **PT\_DENY\_ATTACH**를 사용하고 있다는 신호입니다._”
|
||||
|
||||
## 코어 덤프
|
||||
|
||||
코어 덤프는 다음과 같은 경우에 생성됩니다:
|
||||
|
||||
- `kern.coredump` sysctl이 1로 설정된 경우 (기본값)
|
||||
- 프로세스가 suid/sgid가 아니거나 `kern.sugid_coredump`가 1인 경우 (기본값은 0)
|
||||
- `AS_CORE` 제한이 작동을 허용하는 경우. `ulimit -c 0`를 호출하여 코어 덤프 생성을 억제하고, `ulimit -c unlimited`로 다시 활성화할 수 있습니다.
|
||||
* `kern.coredump` sysctl이 1로 설정되어 있을 때 (기본값)
|
||||
* 프로세스가 suid/sgid가 아니거나 `kern.sugid_coredump`가 1일 때 (기본값은 0)
|
||||
* `AS_CORE` 제한이 작업을 허용할 때. `ulimit -c 0`을 호출하여 코드 덤프 생성을 억제할 수 있으며, `ulimit -c unlimited`로 다시 활성화할 수 있습니다.
|
||||
|
||||
이러한 경우에는 코어 덤프가 `kern.corefile` sysctl에 따라 생성되며, 일반적으로 `/cores/core/.%P`에 저장됩니다.
|
||||
이 경우 코어 덤프는 `kern.corefile` sysctl에 따라 생성되며 일반적으로 `/cores/core/.%P`에 저장됩니다.
|
||||
|
||||
## 퍼징
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrash는 **충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장**합니다. 충돌 보고서에는 충돌 원인을 **진단하는 데 도움이 되는 정보**가 포함되어 있습니다.\
|
||||
사용자별 launchd 컨텍스트에서 실행되는 응용 프로그램 및 기타 프로세스의 경우, ReportCrash는 LaunchAgent로 실행되어 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\
|
||||
데몬, 시스템 launchd 컨텍스트에서 실행되는 기타 프로세스 및 다른 권한이 있는 프로세스의 경우, ReportCrash는 LaunchDaemon으로 실행되어 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다.
|
||||
ReportCrash는 **충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장합니다**. 충돌 보고서에는 **개발자가 충돌 원인을 진단하는 데 도움이 되는 정보**가 포함되어 있습니다.\
|
||||
사용자별 launchd 컨텍스트에서 **실행되는 애플리케이션 및 기타 프로세스**에 대해 ReportCrash는 LaunchAgent로 실행되며 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\
|
||||
데몬, 시스템 launchd 컨텍스트에서 **실행되는 기타 프로세스** 및 기타 권한 있는 프로세스에 대해 ReportCrash는 LaunchDaemon으로 실행되며 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다.
|
||||
|
||||
Apple로 **보내지는 충돌 보고서**에 대해 걱정된다면 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 **서버가 어떻게 충돌했는지 파악하는 데 유용**할 수 있습니다.
|
||||
충돌 보고서가 **Apple로 전송되는 것**이 걱정된다면 이를 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 **서버가 어떻게 충돌했는지** 알아내는 데 유용할 수 있습니다.
|
||||
```bash
|
||||
#To disable crash reporting:
|
||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
|
@ -528,17 +529,17 @@ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Roo
|
|||
launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist
|
||||
```
|
||||
### 슬립
|
||||
### Sleep
|
||||
|
||||
MacOS에서 퍼징을 할 때 Mac이 슬립 모드로 들어가지 않도록하는 것이 중요합니다:
|
||||
MacOS에서 퍼징할 때 Mac이 잠들지 않도록 하는 것이 중요합니다:
|
||||
|
||||
* systemsetup -setsleep Never
|
||||
* pmset, 시스템 환경 설정
|
||||
* pmset, 시스템 환경설정
|
||||
* [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake)
|
||||
|
||||
#### SSH 연결 끊김
|
||||
#### SSH Disconnect
|
||||
|
||||
SSH 연결을 통해 퍼징을 하는 경우 세션이 종료되지 않도록하는 것이 중요합니다. 따라서 sshd\_config 파일을 다음과 같이 변경하십시오:
|
||||
SSH 연결을 통해 퍼징하는 경우 세션이 종료되지 않도록 하는 것이 중요합니다. 따라서 sshd\_config 파일을 다음과 같이 변경하십시오:
|
||||
|
||||
* TCPKeepAlive Yes
|
||||
* ClientAliveInterval 0
|
||||
|
@ -547,17 +548,17 @@ SSH 연결을 통해 퍼징을 하는 경우 세션이 종료되지 않도록하
|
|||
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
||||
```
|
||||
### 내부 핸들러
|
||||
### Internal Handlers
|
||||
|
||||
**다음 페이지를 확인**하여 특정 scheme 또는 protocol을 처리하는 앱을 찾는 방법을 알아보세요:
|
||||
**다음 페이지를 확인하여** 어떤 앱이 **지정된 스킴 또는 프로토콜을 처리하는지 확인하는 방법을 알아보세요:**
|
||||
|
||||
{% content-ref url="../macos-file-extension-apps.md" %}
|
||||
[macos-file-extension-apps.md](../macos-file-extension-apps.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 네트워크 프로세스 열거
|
||||
### Enumerating Network Processes
|
||||
|
||||
네트워크 데이터를 관리하는 프로세스를 찾는 것은 흥미로운 작업입니다:
|
||||
네트워크 데이터를 관리하는 프로세스를 찾는 것은 흥미롭습니다:
|
||||
```bash
|
||||
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
|
||||
#wait some time
|
||||
|
@ -576,17 +577,17 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Fuzzers
|
||||
### 퍼저
|
||||
|
||||
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
|
||||
|
||||
CLI 도구에 대해 작동합니다.
|
||||
CLI 도구에 작동합니다.
|
||||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
macOS GUI 도구와 "**그냥 작동"**합니다. 일부 macOS 앱은 고유한 파일 이름, 올바른 확장자, 샌드박스에서 파일을 읽어야 하는 등 특정 요구 사항이 있습니다 (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
macOS GUI 도구와 "**그냥 작동"**합니다. 일부 macOS 앱은 고유한 파일 이름, 올바른 확장자와 같은 특정 요구 사항이 있으며, 샌드박스(`~/Library/Containers/com.apple.Safari/Data`)에서 파일을 읽어야 합니다...
|
||||
|
||||
일부 예시:
|
||||
몇 가지 예시:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -614,14 +615,14 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### 더 많은 Fuzzing MacOS 정보
|
||||
### More Fuzzing MacOS Info
|
||||
|
||||
* [https://www.youtube.com/watch?v=T5xfL9tEg44](https://www.youtube.com/watch?v=T5xfL9tEg44)
|
||||
* [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
|
||||
* [https://github.com/bnagy/francis/tree/master/exploitaben](https://github.com/bnagy/francis/tree/master/exploitaben)
|
||||
* [https://github.com/ant4g0nist/crashwrangler](https://github.com/ant4g0nist/crashwrangler)
|
||||
|
||||
## 참고 자료
|
||||
## References
|
||||
|
||||
* [**OS X Incident Response: Scripting and Analysis**](https://www.amazon.com/OS-Incident-Response-Scripting-Analysis-ebook/dp/B01FHOHHVS)
|
||||
* [**https://www.youtube.com/watch?v=T5xfL9tEg44**](https://www.youtube.com/watch?v=T5xfL9tEg44)
|
||||
|
@ -632,25 +633,25 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 기반으로 한 검색 엔진으로, 회사나 그 고객이 **stealer malwares**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)는 **다크 웹** 기반의 검색 엔진으로, 회사나 고객이 **스틸러 맬웨어**에 의해 **침해**되었는지 확인할 수 있는 **무료** 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보를 도난하는 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격에 대항하는 것입니다.
|
||||
WhiteIntel의 주요 목표는 정보 탈취 맬웨어로 인한 계정 탈취 및 랜섬웨어 공격에 맞서 싸우는 것입니다.
|
||||
|
||||
그들의 웹사이트를 방문하여 엔진을 무료로 사용해 볼 수 있습니다:
|
||||
그들의 웹사이트를 확인하고 **무료**로 엔진을 사용해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
AWS 해킹 학습 및 실습:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
GCP 해킹 학습 및 실습: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>HackTricks 지원하기</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* [**구독 요금제**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass) 참여 또는 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 팔로우하기**.
|
||||
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 레포지토리에 PR을 제출하여 해킹 트릭 공유하기.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
Loading…
Reference in a new issue