macOS μ•± - 검사, 디버깅 및 퍼징

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

정적 뢄석

otool & objdump & nm

otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application
objdump -m --dylibs-used /bin/ls #List dynamically linked libraries
objdump -m -h /bin/ls # Get headers information
objdump -m --syms /bin/ls # Check if the symbol table exists to get function names
objdump -m --full-contents /bin/ls # Dump every section
objdump -d /bin/ls # Dissasemble the binary
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour
nm -m ./tccd # List of symbols

jtool2 & Disarm

You can download disarm from here.

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λ₯Ό λ‹€μš΄λ‘œλ“œν•˜μ„Έμš” λ˜λŠ” brew둜 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# Install
brew install --cask jtool2

jtool2 -l /bin/ls # Get commands (headers)
jtool2 -L /bin/ls # Get libraries
jtool2 -S /bin/ls # Get symbol info
jtool2 -d /bin/ls # Dump binary
jtool2 -D /bin/ls # Decompile binary

# Get signature information
ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Automator

# Get MIG information
jtool2 -d __DATA.__const myipc_server | grep MIG

[!CAUTION] > jtool은 disarm으둜 λŒ€μ²΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Codesign / ldid

[!TIP] > **Codesign**은 macOSμ—μ„œ 찾을 수 있으며, **ldid**λŠ” iOSμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"

# Check if the app’s contents have been modified
codesign --verify --verbose /Applications/Safari.app

# Get entitlements from the binary
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms

# Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app

# Sign a binary
codesign -s <cert-name-keychain> toolsdemo

# Get signature info
ldid -h <binary>

# Get entitlements
ldid -e <binary>

# Change entilements
## /tmp/entl.xml is a XML file with the new entitlements to add
ldid -S/tmp/entl.xml <binary>

SuspiciousPackage

SuspiciousPackageλŠ” .pkg 파일(μ„€μΉ˜ ν”„λ‘œκ·Έλž¨)을 κ²€μ‚¬ν•˜κ³  μ„€μΉ˜ν•˜κΈ° 전에 λ‚΄λΆ€ λ‚΄μš©μ„ ν™•μΈν•˜λŠ” 데 μœ μš©ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.
이 μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ—λŠ” μ•…μ„± μ½”λ“œ μž‘μ„±μžκ°€ 일반적으둜 μ•…μ„± μ½”λ“œλ₯Ό μ§€μ†μ‹œν‚€κΈ° μœ„ν•΄ λ‚¨μš©ν•˜λŠ” preinstall 및 postinstall bash μŠ€ν¬λ¦½νŠΈκ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

hdiutil

이 λ„κ΅¬λŠ” Apple λ””μŠ€ν¬ 이미지(.dmg) νŒŒμΌμ„ λ§ˆμš΄νŠΈν•˜μ—¬ μ‹€ν–‰ν•˜κΈ° 전에 검사할 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

It will be mounted in /Volumes

Packed binaries

  • 높은 μ—”νŠΈλ‘œν”Ό 확인
  • λ¬Έμžμ—΄ 확인 (이해할 수 μžˆλŠ” λ¬Έμžμ—΄μ΄ 거의 μ—†μœΌλ©΄, νŒ¨ν‚Ήλ¨)
  • MacOS용 UPX νŒ¨μ»€λŠ” β€œ__XHDRβ€œλΌλŠ” μ„Ήμ…˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

Static Objective-C analysis

Metadata

Caution

Objective-C둜 μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ€ Mach-O binaries둜 컴파일될 λ•Œ 클래슀 선언을 μœ μ§€ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 클래슀 μ„ μ–Έμ—λŠ” λ‹€μŒμ΄ ν¬ν•¨λ©λ‹ˆλ‹€:

  • μ •μ˜λœ μΈν„°νŽ˜μ΄μŠ€
  • μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œ
  • μΈν„°νŽ˜μ΄μŠ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
  • μ •μ˜λœ ν”„λ‘œν† μ½œ

이 이름듀은 이진 파일의 리버싱을 더 μ–΄λ ΅κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ λ‚œλ…ν™”λ  수 μžˆμŠ΅λ‹ˆλ‹€.

Function calling

Objective-Cλ₯Ό μ‚¬μš©ν•˜λŠ” 이진 νŒŒμΌμ—μ„œ ν•¨μˆ˜κ°€ 호좜될 λ•Œ, 컴파일된 μ½”λ“œλŠ” ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λŒ€μ‹  **objc_msgSend**λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. μ΄λŠ” μ΅œμ’… ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ²Œ λ©λ‹ˆλ‹€:

이 ν•¨μˆ˜κ°€ κΈ°λŒ€ν•˜λŠ” λ§€κ°œλ³€μˆ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  • 첫 번째 λ§€κ°œλ³€μˆ˜ (self)λŠ” β€œλ©”μ‹œμ§€λ₯Ό 받을 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” ν¬μΈν„°β€œμž…λ‹ˆλ‹€. 더 κ°„λ‹¨νžˆ λ§ν•˜λ©΄, λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. λ©”μ„œλ“œκ°€ 클래슀 λ©”μ„œλ“œμΈ 경우, μ΄λŠ” 클래슀 객체의 μΈμŠ€ν„΄μŠ€(전체)이며, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ 경우, selfλŠ” 클래슀의 μΈμŠ€ν„΄μŠ€ν™”λœ μΈμŠ€ν„΄μŠ€λ₯Ό 객체둜 κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • 두 번째 λ§€κ°œλ³€μˆ˜ (op)λŠ” β€œλ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œμ˜ μ„ νƒμžβ€œμž…λ‹ˆλ‹€. λ‹€μ‹œ 말해, μ΄λŠ” λ‹¨μˆœνžˆ λ©”μ„œλ“œμ˜ μ΄λ¦„μž…λ‹ˆλ‹€.
  • λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜λŠ” λ©”μ„œλ“œ(op)에 μ˜ν•΄ ν•„μš”ν•œ κ°’λ“€μž…λ‹ˆλ‹€.

이 정보λ₯Ό ARM64μ—μ„œ lldb둜 μ‰½κ²Œ μ–»λŠ” 방법을 이 νŽ˜μ΄μ§€μ—μ„œ ν™•μΈν•˜μ„Έμš”:

Introduction to ARM64v8

x64:

ArgumentRegister(for) objc_msgSend
1st argumentrdiself: methodκ°€ ν˜ΈμΆœλ˜λŠ” 객체
2nd argumentrsiop: λ©”μ„œλ“œμ˜ 이름
3rd argumentrdxλ©”μ„œλ“œμ— λŒ€ν•œ 1st argument
4th argumentrcxλ©”μ„œλ“œμ— λŒ€ν•œ 2nd argument
5th argumentr8λ©”μ„œλ“œμ— λŒ€ν•œ 3rd argument
6th argumentr9λ©”μ„œλ“œμ— λŒ€ν•œ 4th argument
7th+ argument

rsp+
(μŠ€νƒμ—μ„œ)

λ©”μ„œλ“œμ— λŒ€ν•œ 5th+ argument

Dump ObjectiveC metadata

Dynadump

DynadumpλŠ” Objective-C 이진 νŒŒμΌμ„ 클래슀 λ€ν”„ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€. GitHubμ—μ„œλŠ” dylibsλ₯Ό λͺ…μ‹œν•˜μ§€λ§Œ, μ‹€ν–‰ νŒŒμΌμ—λ„ μž‘λ™ν•©λ‹ˆλ‹€.

./dynadump dump /path/to/bin

μž‘μ„± λ‹Ήμ‹œ, 이것이 ν˜„μž¬ κ°€μž₯ 잘 μž‘λ™ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

일반 도ꡬ

nm --dyldinfo-only /path/to/bin
otool -ov /path/to/bin
objdump --macho --objc-meta-data /path/to/bin

class-dump

class-dumpλŠ” ObjectiveC ν˜•μ‹ μ½”λ“œμ—μ„œ 클래슀, μΉ΄ν…Œκ³ λ¦¬ 및 ν”„λ‘œν† μ½œμ— λŒ€ν•œ 선언을 μƒμ„±ν•˜λŠ” μ›λž˜ λ„κ΅¬μž…λ‹ˆλ‹€.

μ˜€λž˜λ˜μ—ˆκ³  μœ μ§€ κ΄€λ¦¬λ˜μ§€ μ•Šμ•„μ„œ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

ICDump

iCDumpλŠ” ν˜„λŒ€μ μ΄κ³  크둜슀 ν”Œλž«νΌ Objective-C 클래슀 λ€ν”„μž…λ‹ˆλ‹€. κΈ°μ‘΄ 도ꡬ와 비ꡐ할 λ•Œ, iCDumpλŠ” Apple μƒνƒœκ³„μ™€ λ…λ¦½μ μœΌλ‘œ 싀행될 수 있으며 Python 바인딩을 λ…ΈμΆœν•©λ‹ˆλ‹€.

import icdump
metadata = icdump.objc.parse("/path/to/bin")

print(metadata.to_decl())

Static Swift 뢄석

Swift λ°”μ΄λ„ˆλ¦¬μ˜ 경우, Objective-C ν˜Έν™˜μ„± 덕뢄에 λ•Œλ•Œλ‘œ class-dumpλ₯Ό μ‚¬μš©ν•˜μ—¬ 선언을 μΆ”μΆœν•  수 μžˆμ§€λ§Œ 항상 그런 것은 μ•„λ‹™λ‹ˆλ‹€.

jtool -l λ˜λŠ” otool -l λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ __swift5 μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λŠ” μ—¬λŸ¬ μ„Ήμ…˜μ„ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€:

jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
LC 00: LC_SEGMENT_64              Mem: 0x000000000-0x100000000    __PAGEZERO
LC 01: LC_SEGMENT_64              Mem: 0x100000000-0x100028000    __TEXT
[...]
Mem: 0x100026630-0x100026d54        __TEXT.__swift5_typeref
Mem: 0x100026d60-0x100027061        __TEXT.__swift5_reflstr
Mem: 0x100027064-0x1000274cc        __TEXT.__swift5_fieldmd
Mem: 0x1000274cc-0x100027608        __TEXT.__swift5_capture
[...]

이 μ„Ήμ…˜μ— μ €μž₯된 정보에 λŒ€ν•œ μΆ”κ°€ μ •λ³΄λŠ” 이 λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²Œλ‹€κ°€, Swift λ°”μ΄λ„ˆλ¦¬λŠ” 기호λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€ (예λ₯Ό λ“€μ–΄, λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν•¨μˆ˜κ°€ 호좜될 수 μžˆλ„λ‘ 기호λ₯Ό μ €μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€). **κΈ°ν˜ΈλŠ” 일반적으둜 ν•¨μˆ˜ 이름과 속성에 λŒ€ν•œ 정보λ₯Ό 보기 μ’‹μ§€ μ•Šκ²Œ κ°€μ§€κ³  μžˆμœΌλ―€λ‘œ 맀우 μœ μš©ν•˜λ©°, μ›λž˜ 이름을 얻을 수 μžˆλŠ” β€œλ””λ§κΈ€λŸ¬β€œκ°€ μžˆμŠ΅λ‹ˆλ‹€:

# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py

# Swift cli
swift demangle

동적 뢄석

Warning

이진 νŒŒμΌμ„ λ””λ²„κΉ…ν•˜λ €λ©΄ SIPλ₯Ό λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€ (csrutil disable λ˜λŠ” csrutil enable --without debug) λ˜λŠ” 이진 νŒŒμΌμ„ μž„μ‹œ ν΄λ”λ‘œ λ³΅μ‚¬ν•˜κ³  μ„œλͺ…을 μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€ codesign --remove-signature <binary-path> λ˜λŠ” 이진 파일의 디버깅을 ν—ˆμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ (이 슀크립트λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€).

Warning

macOSμ—μ„œ μ‹œμŠ€ν…œ 이진 파일(예: cloudconfigurationd)을 κ³„μΈ‘ν•˜λ €λ©΄ SIPλ₯Ό λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€ (μ„œλͺ…λ§Œ μ œκ±°ν•˜λŠ” κ²ƒμœΌλ‘œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€).

API

macOSλŠ” ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” λͺ‡ κ°€μ§€ ν₯미둜운 APIλ₯Ό λ…ΈμΆœν•©λ‹ˆλ‹€:

  • proc_info: 각 ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ λ§Žμ€ 정보λ₯Ό μ œκ³΅ν•˜λŠ” μ£Όμš” APIμž…λ‹ˆλ‹€. λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ 정보λ₯Ό μ–»μœΌλ €λ©΄ 루트 κΆŒν•œμ΄ ν•„μš”ν•˜μ§€λ§Œ νŠΉλ³„ν•œ κΆŒν•œμ΄λ‚˜ mach ν¬νŠΈλŠ” ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • libsysmon.dylib: XPC둜 λ…ΈμΆœλœ ν•¨μˆ˜λ₯Ό 톡해 ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ 정보λ₯Ό 얻을 수 있게 ν•΄μ£Όμ§€λ§Œ, com.apple.sysmond.client κΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€.

μŠ€νƒμƒ· 및 λ§ˆμ΄ν¬λ‘œμŠ€νƒμƒ·

μŠ€νƒμƒ·νŒ…μ€ ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό μΊ‘μ²˜ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 기술둜, λͺ¨λ“  μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œμ˜ 호좜 μŠ€νƒμ„ ν¬ν•¨ν•©λ‹ˆλ‹€. μ΄λŠ” 디버깅, μ„±λŠ₯ 뢄석 및 νŠΉμ • μ‹œμ μ—μ„œ μ‹œμŠ€ν…œμ˜ λ™μž‘μ„ μ΄ν•΄ν•˜λŠ” 데 특히 μœ μš©ν•©λ‹ˆλ‹€. iOS 및 macOSμ—μ„œλŠ” sample 및 **spindump**와 같은 μ—¬λŸ¬ 도ꡬ와 방법을 μ‚¬μš©ν•˜μ—¬ μŠ€νƒμƒ·νŒ…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Sysdiagnose

이 도ꡬ (/usr/bini/ysdiagnose)λŠ” 기본적으둜 ps, zprint와 같은 μˆ˜μ‹­ κ°€μ§€ λͺ…령을 μ‹€ν–‰ν•˜μ—¬ μ»΄ν“¨ν„°μ—μ„œ λ§Žμ€ 정보λ₯Ό μˆ˜μ§‘ν•©λ‹ˆλ‹€β€¦

루트 κΆŒν•œμœΌλ‘œ μ‹€ν–‰ν•΄μ•Ό ν•˜λ©°, 데λͺ¬ /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)

톡합 둜그

MacOSλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ 무엇을 ν•˜κ³  μžˆλŠ”μ§€ μ΄ν•΄ν•˜λŠ” 데 맀우 μœ μš©ν•  수 μžˆλŠ” λ§Žμ€ 둜그λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

κ²Œλ‹€κ°€, <private> νƒœκ·Έκ°€ ν¬ν•¨λœ λ‘œκ·Έκ°€ μžˆμ–΄ μ‚¬μš©μž λ˜λŠ” 컴퓨터 식별 κ°€λŠ₯ν•œ 정보λ₯Ό μˆ¨κΉλ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 정보λ₯Ό κ³΅κ°œν•˜κΈ° μœ„ν•΄ μΈμ¦μ„œλ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ˜ μ„€λͺ…을 λ”°λ₯΄μ„Έμš”.

Hopper

μ™Όμͺ½ νŒ¨λ„

Hopper의 μ™Όμͺ½ νŒ¨λ„μ—μ„œλŠ” 이진 파일의 기호(Labels), 절차 및 ν•¨μˆ˜ λͺ©λ‘(Proc), λ¬Έμžμ—΄(Str)을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 이듀은 λͺ¨λ“  λ¬Έμžμ—΄μ΄ μ•„λ‹ˆλΌ Mac-O 파일의 μ—¬λŸ¬ 뢀뢄에 μ •μ˜λœ λ¬Έμžμ—΄μž…λ‹ˆλ‹€ (예: cstring λ˜λŠ” objc_methname).

쀑간 νŒ¨λ„

쀑간 νŒ¨λ„μ—μ„œλŠ” λ””μŠ€μ–΄μ…ˆλΈ”λœ μ½”λ“œλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ›μ‹œ λ””μŠ€μ–΄μ…ˆλΈ”, κ·Έλž˜ν”„, λ””μ»΄νŒŒμΌλœ μ½”λ“œ 및 이진 μ½”λ“œλ‘œ 각각의 μ•„μ΄μ½˜μ„ ν΄λ¦­ν•˜μ—¬ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€:

μ½”λ“œ 객체λ₯Ό 였λ₯Έμͺ½ ν΄λ¦­ν•˜λ©΄ ν•΄λ‹Ή 객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λ³΄κ±°λ‚˜ 이름을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (이것은 λ””μ»΄νŒŒμΌλœ μ˜μ‚¬ μ½”λ“œμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€):

λ˜ν•œ, 쀑간 ν•˜λ‹¨μ—μ„œ 파이썬 λͺ…령을 μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

였λ₯Έμͺ½ νŒ¨λ„

였λ₯Έμͺ½ νŒ¨λ„μ—μ„œλŠ” 탐색 기둝(ν˜„μž¬ 상황에 λ„λ‹¬ν•œ 방법을 μ•Œ 수 있음), 호좜 κ·Έλž˜ν”„(이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λͺ¨λ“  ν•¨μˆ˜μ™€ 이 ν•¨μˆ˜κ°€ ν˜ΈμΆœν•˜λŠ” λͺ¨λ“  ν•¨μˆ˜), 둜컬 λ³€μˆ˜ 정보와 같은 ν₯미둜운 정보λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

dtrace

μ‚¬μš©μžκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 맀우 μ €μˆ˜μ€€μœΌλ‘œ μ ‘κ·Όν•  수 있게 ν•΄μ£Όλ©°, μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ μΆ”μ ν•˜κ³  μ‹€ν–‰ 흐름을 λ³€κ²½ν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€. DtraceλŠ” ν”„λ‘œλΈŒλ₯Ό μ‚¬μš©ν•˜λ©°, μ΄λŠ” 컀널 전역에 λ°°μΉ˜λ˜μ–΄ μ‹œμŠ€ν…œ 호좜의 μ‹œμž‘κ³Ό 끝과 같은 μœ„μΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€.

DTraceλŠ” 각 μ‹œμŠ€ν…œ ν˜ΈμΆœμ— λŒ€ν•œ ν”„λ‘œλΈŒλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ dtrace_probe_create ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν”„λ‘œλΈŒλŠ” 각 μ‹œμŠ€ν…œ 호좜의 μ§„μž… 및 μ’…λ£Œ μ§€μ μ—μ„œ λ°œμ‚¬λ  수 μžˆμŠ΅λ‹ˆλ‹€. DTraceμ™€μ˜ μƒν˜Έμž‘μš©μ€ /dev/dtraceλ₯Ό 톡해 이루어지며, μ΄λŠ” 루트 μ‚¬μš©μžλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Tip

SIP 보호λ₯Ό μ™„μ „νžˆ λΉ„ν™œμ„±ν™”ν•˜μ§€ μ•Šκ³  Dtraceλ₯Ό ν™œμ„±ν™”ν•˜λ €λ©΄ 볡ꡬ λͺ¨λ“œμ—μ„œ λ‹€μŒμ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€: csrutil enable --without dtrace

λ˜ν•œ dtrace λ˜λŠ” dtruss 이진 νŒŒμΌμ„ μ»΄νŒŒμΌν•œ 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

dtrace의 μ‚¬μš© κ°€λŠ₯ν•œ ν”„λ‘œλΈŒλŠ” λ‹€μŒκ³Ό 같이 얻을 수 μžˆμŠ΅λ‹ˆλ‹€:

dtrace -l | head
ID   PROVIDER            MODULE                          FUNCTION NAME
1     dtrace                                                     BEGIN
2     dtrace                                                     END
3     dtrace                                                     ERROR
43    profile                                                     profile-97
44    profile                                                     profile-199

ν”„λ‘œλΈŒ 이름은 제곡자, λͺ¨λ“ˆ, ν•¨μˆ˜ 및 μ΄λ¦„μ˜ λ„€ λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€: (fbt:mach_kernel:ptrace:entry). μ΄λ¦„μ˜ 일뢀λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ DtraceλŠ” ν•΄λ‹Ή 뢀뢄을 μ™€μΌλ“œμΉ΄λ“œλ‘œ μ μš©ν•©λ‹ˆλ‹€.

DTraceλ₯Ό κ΅¬μ„±ν•˜μ—¬ ν”„λ‘œλΈŒλ₯Ό ν™œμ„±ν™”ν•˜κ³  ν”„λ‘œλΈŒκ°€ μž‘λ™ν•  λ•Œ μˆ˜ν–‰ν•  μž‘μ—…μ„ μ§€μ •ν•˜λ €λ©΄ D μ–Έμ–΄λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μžμ„Έν•œ μ„€λͺ…κ³Ό 더 λ§Žμ€ μ˜ˆμ œλŠ” https://illumos.org/books/dtrace/chp-intro.htmlμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

예제

man -k dtraceλ₯Ό μ‹€ν–‰ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ν•œ DTrace 슀크립트λ₯Ό λ‚˜μ—΄ν•©λ‹ˆλ‹€. 예: sudo dtruss -n binary

#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • 슀크립트
syscall:::entry
/pid == $1/
{
}

#Log every syscall of a PID
sudo dtrace -s script.d 1234
syscall::open:entry
{
printf("%s(%s)", probefunc, copyinstr(arg0));
}
syscall::close:entry
{
printf("%s(%d)\n", probefunc, arg0);
}

#Log files opened and closed by a process
sudo dtrace -s b.d -c "cat /etc/hosts"
syscall:::entry
{
;
}
syscall:::return
{
printf("=%d\n", arg1);
}

#Log sys calls with values
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"

dtruss

dtruss -c ls #Get syscalls of ls
dtruss -c -p 1000 #get syscalls of PID 1000

kdebug

컀널 좔적 κΈ°λŠ₯μž…λ‹ˆλ‹€. λ¬Έμ„œν™”λœ μ½”λ“œλŠ” **/usr/share/misc/trace.codes**μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

latency, sc_usage, fs_usage 및 trace와 같은 λ„κ΅¬λŠ” λ‚΄λΆ€μ μœΌλ‘œ 이λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

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 호좜.

이 정보λ₯Ό μ–»κΈ° μœ„ν•΄ Apple 도ꡬ trace λ˜λŠ” μ»€μŠ€ν…€ 도ꡬ kDebugView (kdv)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

KdebugλŠ” ν•œ λ²ˆμ— 1λͺ…μ˜ κ³ κ°μ—κ²Œλ§Œ μ œκ³΅λœλ‹€λŠ” 점에 μœ μ˜ν•˜μ‹­μ‹œμ˜€. λ”°λΌμ„œ ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ k-debug 기반 λ„κ΅¬λ§Œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ktrace

ktrace_* APIλŠ” libktrace.dylibμ—μ„œ 제곡되며, μ΄λŠ” Kdebug의 λž˜νΌμž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” ktrace_session_create 및 ktrace_events_[single/class]λ₯Ό ν˜ΈμΆœν•˜μ—¬ νŠΉμ • μ½”λ“œμ— λŒ€ν•œ μ½œλ°±μ„ μ„€μ •ν•œ λ‹€μŒ ktrace_start둜 μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

SIPκ°€ ν™œμ„±ν™”λœ μƒνƒœμ—μ„œλ„ 이 도ꡬλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈλ‘œλŠ” μœ ν‹Έλ¦¬ν‹° ktraceλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

ktrace trace -s -S -t c -c ls | grep "ls("

Or tailspin.

kperf

이것은 컀널 μˆ˜μ€€ ν”„λ‘œνŒŒμΌλ§μ„ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©λ˜λ©° Kdebug ν˜ΈμΆœμ„ μ‚¬μš©ν•˜μ—¬ κ΅¬μΆ•λ©λ‹ˆλ‹€.

기본적으둜, μ „μ—­ λ³€μˆ˜ kernel_debug_activeκ°€ ν™•μΈλ˜κ³  μ„€μ •λ˜λ©΄ Kdebug μ½”λ“œμ™€ ν˜ΈμΆœν•˜λŠ” 컀널 ν”„λ ˆμž„μ˜ μ£Όμ†Œλ‘œ kperf_kdebug_handlerλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. μ„ νƒλœ Kdebug μ½”λ“œμ™€ μΌμΉ˜ν•˜λ©΄ λΉ„νŠΈλ§΅μœΌλ‘œ κ΅¬μ„±λœ β€œμž‘μ—…β€œμ„ κ°€μ Έμ˜΅λ‹ˆλ‹€(μ˜΅μ…˜μ€ osfmk/kperf/action.hλ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€).

Kperfμ—λŠ” sysctl MIB ν…Œμ΄λΈ”λ„ μžˆμŠ΅λ‹ˆλ‹€: (루트둜) sysctl kperf. 이 μ½”λ“œλŠ” osfmk/kperf/kperfbsd.cμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²Œλ‹€κ°€, Kperf의 κΈ°λŠ₯의 ν•˜μœ„ 집합은 kpc에 μ‘΄μž¬ν•˜λ©°, μ΄λŠ” λ¨Έμ‹  μ„±λŠ₯ μΉ΄μš΄ν„°μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

ProcessMonitor

ProcessMonitorλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μˆ˜ν–‰ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€ κ΄€λ ¨ μž‘μ—…μ„ ν™•μΈν•˜λŠ” 데 맀우 μœ μš©ν•œ λ„κ΅¬μž…λ‹ˆλ‹€(예: ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±ν•˜λŠ” μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό λͺ¨λ‹ˆν„°λ§).

SpriteTree

SpriteTreeλŠ” ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 관계λ₯Ό 좜λ ₯ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€.
**sudo eslogger fork exec rename create > cap.json**와 같은 λͺ…λ ΉμœΌλ‘œ Mac을 λͺ¨λ‹ˆν„°λ§ν•΄μ•Ό ν•©λ‹ˆλ‹€(이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 터미널은 FDAκ°€ ν•„μš”ν•©λ‹ˆλ‹€). 그런 λ‹€μŒ 이 λ„κ΅¬μ—μ„œ json을 λ‘œλ“œν•˜μ—¬ λͺ¨λ“  관계λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€:

FileMonitor

FileMonitorλŠ” 파일 이벀트(생성, μˆ˜μ • 및 μ‚­μ œμ™€ 같은)λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ—¬ μ΄λŸ¬ν•œ μ΄λ²€νŠΈμ— λŒ€ν•œ μžμ„Έν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

Crescendo

CrescendoλŠ” Microsoft Sysinternal의 _Procmon_μ—μ„œ Windows μ‚¬μš©μžκ°€ μ•Œ 수 μžˆλŠ” λͺ¨μ–‘κ³Ό λŠλ‚Œμ„ κ°€μ§„ GUI λ„κ΅¬μž…λ‹ˆλ‹€. 이 λ„κ΅¬λŠ” λ‹€μ–‘ν•œ 이벀트 μœ ν˜•μ˜ 기둝을 μ‹œμž‘ν•˜κ³  쀑지할 수 있으며, 파일, ν”„λ‘œμ„ΈμŠ€, λ„€νŠΈμ›Œν¬ λ“±κ³Ό 같은 μΉ΄ν…Œκ³ λ¦¬λ³„λ‘œ μ΄λŸ¬ν•œ 이벀트λ₯Ό 필터링할 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜κ³ , 기둝된 이벀트λ₯Ό json ν˜•μ‹μœΌλ‘œ μ €μž₯ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

Apple Instruments

Apple InstrumentsλŠ” Xcode의 개발자 λ„κ΅¬μ˜ μΌλΆ€λ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§, λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 식별 및 파일 μ‹œμŠ€ν…œ ν™œλ™ 좔적에 μ‚¬μš©λ©λ‹ˆλ‹€.

fs_usage

ν”„λ‘œμ„ΈμŠ€κ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ„ 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€:

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은 이진 νŒŒμΌμ—μ„œ μ‚¬μš©λ˜λŠ” 라이브러리, μ‚¬μš© 쀑인 파일 및 λ„€νŠΈμ›Œν¬ 연결을 ν™•μΈν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.
λ˜ν•œ 이진 ν”„λ‘œμ„ΈμŠ€λ₯Ό virustotalκ³Ό λŒ€μ‘°ν•˜μ—¬ 이진 νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

PT_DENY_ATTACH

이 λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ—μ„œλŠ” **PT_DENY_ATTACH**λ₯Ό μ‚¬μš©ν•˜μ—¬ 디버깅을 λ°©μ§€ν•˜λŠ” μ‹€ν–‰ 쀑인 데λͺ¬μ„ λ””λ²„κΉ…ν•˜λŠ” 방법에 λŒ€ν•œ 예제λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

lldb

lldbλŠ” macOS 이진 디버깅을 μœ„ν•œ μ‚¬μ‹€μƒμ˜ λ„κ΅¬μž…λ‹ˆλ‹€.

lldb ./malware.bin
lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor

ν™ˆ 폴더에 **.lldbinit**λΌλŠ” νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ 쀄을 μΆ”κ°€ν•˜μ—¬ intel flavourλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

settings set target.x86-disassembly-flavor intel

Warning

lldb λ‚΄μ—μ„œ process save-core둜 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ€ν”„ν•©λ‹ˆλ‹€.

Tip

objc_sendMsg ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ, rsi λ ˆμ§€μŠ€ν„°λŠ” null-terminated (β€œC”) λ¬Έμžμ—΄λ‘œμ„œ λ©”μ„œλ“œμ˜ 이름을 λ³΄μœ ν•©λ‹ˆλ‹€. lldbλ₯Ό 톡해 이름을 좜λ ₯ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ„Έμš”:

(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"

(lldb) print (char*)$rsi:
(char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"

(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"

μ•ˆν‹° λ‹€μ΄λ‚˜λ―Ή 뢄석

VM 탐지

  • 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)){ //디버깅 쀑인 ν”„λ‘œμ„ΈμŠ€ }
  • ptrace μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ PT_DENY_ATTACH ν”Œλž˜κ·Έμ™€ ν•¨κ»˜ ν˜ΈμΆœν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 디버거가 μ—°κ²°ν•˜κ³  μΆ”μ ν•˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.
  • sysctl λ˜λŠ” ptrace ν•¨μˆ˜κ°€ κ°€μ Έμ™€μ§€λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€ (ν•˜μ§€λ§Œ μ•…μ„±μ½”λ“œλŠ” λ™μ μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€).
  • 이 κΈ€μ—μ„œ μ–ΈκΈ‰λœ 바와 같이, β€œ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.corefile sysctl에 따라 μƒμ„±λ˜λ©°, 일반적으둜 /cores/core/.%P에 μ €μž₯λ©λ‹ˆλ‹€.

퍼징

ReportCrash

ReportCrashλŠ” μΆ©λŒν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό λΆ„μ„ν•˜κ³  좩돌 λ³΄κ³ μ„œλ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•©λ‹ˆλ‹€. 좩돌 λ³΄κ³ μ„œμ—λŠ” κ°œλ°œμžκ°€ 좩돌 원인을 μ§„λ‹¨ν•˜λŠ” 데 도움이 λ˜λŠ” 정보가 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
μ‚¬μš©μžλ³„ launchd μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹€ν–‰λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 및 기타 ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ ReportCrashλŠ” LaunchAgent둜 μ‹€ν–‰λ˜λ©°, μ‚¬μš©μžμ˜ ~/Library/Logs/DiagnosticReports/에 좩돌 λ³΄κ³ μ„œλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
데λͺ¬, μ‹œμŠ€ν…œ launchd μ»¨ν…μŠ€νŠΈμ—μ„œ μ‹€ν–‰λ˜λŠ” 기타 ν”„λ‘œμ„ΈμŠ€ 및 기타 κΆŒν•œ μžˆλŠ” ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ ReportCrashλŠ” LaunchDaemon으둜 μ‹€ν–‰λ˜λ©°, μ‹œμŠ€ν…œμ˜ /Library/Logs/DiagnosticReports에 좩돌 λ³΄κ³ μ„œλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

좩돌 λ³΄κ³ μ„œκ°€ Apple둜 μ „μ†‘λ˜λŠ” 것에 λŒ€ν•΄ κ±±μ •λœλ‹€λ©΄ 이λ₯Ό λΉ„ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄, 좩돌 λ³΄κ³ μ„œλŠ” μ„œλ²„κ°€ μ–΄λ–»κ²Œ μΆ©λŒν–ˆλŠ”μ§€ μ•Œμ•„λ‚΄λŠ” 데 μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

#To re-enable crash reporting:
launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

수면

MacOSμ—μ„œ 퍼징할 λ•Œ Mac이 수면 μƒνƒœμ— λ“€μ–΄κ°€μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€:

  • systemsetup -setsleep Never
  • pmset, μ‹œμŠ€ν…œ ν™˜κ²½μ„€μ •
  • KeepingYouAwake

SSH μ—°κ²° λŠκΉ€

SSH 연결을 톡해 νΌμ§•ν•˜λŠ” 경우 μ„Έμ…˜μ΄ μ’…λ£Œλ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λ”°λΌμ„œ sshd_config νŒŒμΌμ„ λ‹€μŒκ³Ό 같이 λ³€κ²½ν•˜μ‹­μ‹œμ˜€:

  • TCPKeepAlive Yes
  • ClientAliveInterval 0
  • ClientAliveCountMax 0
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

Internal Handlers

λ‹€μŒ νŽ˜μ΄μ§€λ₯Ό ν™•μΈν•˜μ„Έμš” μ–΄λ–€ 앱이 μ§€μ •λœ μŠ€ν‚΄ λ˜λŠ” ν”„λ‘œν† μ½œμ„ μ²˜λ¦¬ν•˜λŠ”μ§€ μ°ΎλŠ” 방법을 μ•Œμ•„λ³΄μ„Έμš”:

macOS File Extension & URL scheme app handlers

Enumerating Network Processes

λ„€νŠΈμ›Œν¬ 데이터λ₯Ό κ΄€λ¦¬ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ°ΎλŠ” 것은 ν₯λ―Έλ‘­μŠ΅λ‹ˆλ‹€:

dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
sort -u recv.log > procs.txt
cat procs.txt

λ˜λŠ” netstat λ˜λŠ” lsofλ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

Libgmalloc

```bash lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit" ``` ### Fuzzers

AFL++

CLI 도ꡬ에 λŒ€ν•΄ μž‘λ™ν•©λ‹ˆλ‹€.

Litefuzz

macOS GUI 도ꡬ와 β€œκ·Έλƒ₯ μž‘λ™β€ ν•©λ‹ˆλ‹€. 일뢀 macOS 앱은 κ³ μœ ν•œ 파일 이름, μ˜¬λ°”λ₯Έ ν™•μž₯μžμ™€ 같은 νŠΉμ • μš”κ΅¬ 사항이 있으며, μƒŒλ“œλ°•μŠ€μ—μ„œ νŒŒμΌμ„ 읽어야 ν•©λ‹ˆλ‹€ (~/Library/Containers/com.apple.Safari/Data)…

λͺ‡ κ°€μ§€ 예:

# iBooks
litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i files/epub -o crashes/ibooks -t /Users/test/Library/Containers/com.apple.iBooksX/Data/tmp -x 10 -n 100000 -ez

# -l : Local
# -c : cmdline with FUZZ word (if not stdin is used)
# -i : input directory or file
# -o : Dir to output crashes
# -t : Dir to output runtime fuzzing artifacts
# -x : Tmeout for the run (default is 1)
# -n : Num of fuzzing iterations (default is 1)
# -e : enable second round fuzzing where any crashes found are reused as inputs
# -z : enable malloc debug helpers

# Font Book
litefuzz -l -c "/System/Applications/Font Book.app/Contents/MacOS/Font Book FUZZ" -i input/fonts -o crashes/font-book -x 2 -n 500000 -ez

# smbutil (using pcap capture)
litefuzz -lk -c "smbutil view smb://localhost:4455" -a tcp://localhost:4455 -i input/mac-smb-resp -p -n 100000 -z

# screensharingd (using pcap capture)
litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash screensharingd -p -n 100000

More Fuzzing MacOS Info

References

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

(lldb) λͺ…λ Ήμ–΄μ„€λͺ…
run (r)싀행을 μ‹œμž‘ν•˜λ©°, 쀑단점이 hitλ˜κ±°λ‚˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ κ³„μ†λ©λ‹ˆλ‹€.
process launch --stop-at-entryμ§„μž…μ μ—μ„œ μ€‘λ‹¨ν•˜λ©° 싀행을 μ‹œμž‘ν•©λ‹ˆλ‹€.
continue (c)디버깅 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ 싀행을 κ³„μ†ν•©λ‹ˆλ‹€.
nexti (n / ni)λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. 이 λͺ…λ Ήμ–΄λŠ” ν•¨μˆ˜ ν˜ΈμΆœμ„ κ±΄λ„ˆλœλ‹ˆλ‹€.
stepi (s / si)λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. nexti λͺ…령어와 달리, 이 λͺ…λ Ήμ–΄λŠ” ν•¨μˆ˜ 호좜둜 λ“€μ–΄κ°‘λ‹ˆλ‹€.
finish (f)ν˜„μž¬ ν•¨μˆ˜(β€œν”„λ ˆμž„β€)의 λ‚˜λ¨Έμ§€ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜κ³  λ°˜ν™˜ ν›„ μ€‘λ‹¨ν•©λ‹ˆλ‹€.
control + c싀행을 μΌμ‹œ μ€‘μ§€ν•©λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ run (r) λ˜λŠ” continue (c)둜 μ‹€ν–‰λœ 경우, ν˜„μž¬ μ‹€ν–‰ 쀑인 μœ„μΉ˜μ—μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€.
breakpoint (b)

b main # main이라고 호좜된 λͺ¨λ“  ν•¨μˆ˜

b `main # bin의 main ν•¨μˆ˜

b set -n main --shlib # μ§€μ •λœ bin의 main ν•¨μˆ˜

breakpoint set -r '\[NSFileManager .*\]$' # λͺ¨λ“  NSFileManager λ©”μ„œλ“œ

breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'

break set -r . -s libobjc.A.dylib # ν•΄λ‹Ή 라이브러리의 λͺ¨λ“  ν•¨μˆ˜μ—μ„œ 쀑단

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 λ©”λͺ¨λ¦¬λ₯Ό null-terminated λ¬Έμžμ—΄λ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
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개 ꡬ성 μš”μ†Œ λ°°μ—΄ 확인
image dump sectionsν˜„μž¬ ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬μ˜ 맡을 좜λ ₯ν•©λ‹ˆλ‹€.
image dump symtab image dump symtab CoreNLP # CoreNLP의 λͺ¨λ“  기호 μ£Όμ†Œ κ°€μ Έμ˜€κΈ°