.. | ||
arm64-basic-assembly.md | ||
introduction-to-x64.md | ||
README.md |
macOS 앱 - 검사, 디버깅 및 퍼징
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- The PEASS Family를 발견하세요. 독점적인 NFTs 컬렉션입니다.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm를 팔로우하세요.
- HackTricks와 HackTricks Cloud github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
정적 분석
otool
otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application
objdump
{% code overflow="wrap" %}
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
{% endcode %}
jtool2
이 도구는 codesign, otool, objdump의 대체로 사용될 수 있으며 몇 가지 추가 기능을 제공합니다. 여기에서 다운로드하거나 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
Codesign / ldid
{% hint style="danger" %}
**Codesign
**은 macOS에서 찾을 수 있으며 **ldid
**는 iOS에서 찾을 수 있습니다.
{% endhint %}
# 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
/Volumes
에 마운트됩니다.
Objective-C
메타데이터
{% hint style="danger" %} Objective-C로 작성된 프로그램은 Mach-O 바이너리로 컴파일될 때 클래스 선언을 유지합니다. 이러한 클래스 선언에는 다음이 포함됩니다: {% endhint %}
- 클래스
- 클래스 메소드
- 클래스 인스턴스 변수
class-dump를 사용하여 이 정보를 얻을 수 있습니다:
class-dump Kindle.app
함수 호출
Objective-C를 사용하는 이진 파일에서 함수가 호출될 때, 컴파일된 코드는 해당 함수를 호출하는 대신 **objc_msgSend
**를 호출합니다. 이 함수는 최종 함수를 호출합니다:
이 함수가 기대하는 매개변수는 다음과 같습니다:
- 첫 번째 매개변수 (self)는 "메시지를 수신할 클래스의 인스턴스를 가리키는 포인터"입니다. 간단히 말해, 메서드가 호출되는 객체입니다. 메서드가 클래스 메서드인 경우, 이것은 클래스 객체의 인스턴스(전체)일 것이고, 인스턴스 메서드인 경우 self는 클래스의 인스턴스로서 인스턴스화된 인스턴스를 가리킵니다.
- 두 번째 매개변수 (op)는 "메시지를 처리하는 메서드의 선택자"입니다. 다시 말해, 이것은 메서드의 이름입니다.
- 나머지 매개변수는 메서드에서 필요한 값들입니다 (op).
인수 | 레지스터 | (for) objc_msgSend |
---|---|---|
1번째 인수 | rdi | self: 메서드가 호출되는 객체 |
2번째 인수 | rsi | op: 메서드의 이름 |
3번째 인수 | rdx | 메서드에 대한 1번째 인수 |
4번째 인수 | rcx | 메서드에 대한 2번째 인수 |
5번째 인수 | r8 | 메서드에 대한 3번째 인수 |
6번째 인수 | r9 | 메서드에 대한 4번째 인수 |
7번째 이상 인수 | rsp+ |
메서드에 대한 5번째 이상의 인수 |
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 이진 파일에는 심볼이 있을 수 있습니다 (예: 라이브러리는 함수를 호출하기 위해 심볼을 저장해야 함). 심볼은 일반적으로 함수 이름과 속성에 대한 정보를 지저분하게 포함하고 있으므로 매우 유용하며, "demangler"를 사용하여 원래 이름을 얻을 수 있습니다:
# Ghidra plugin
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 <binary-path>
로 서명을 제거하거나 이진 파일의 디버깅을 허용해야 합니다 (이 스크립트를 사용할 수 있습니다: 여기).
{% endhint %}
{% hint style="warning" %}
macOS에서 cloudconfigurationd
와 같은 시스템 이진 파일을 인스트루먼트하려면 SIP를 비활성화해야 합니다 (서명을 제거하는 것만으로는 작동하지 않습니다).
{% endhint %}
통합 로그
MacOS는 애플리케이션을 실행할 때 무엇을 하는지 이해하는 데 매우 유용한 로그를 생성합니다.
또한, 일부 로그에는 <private>
태그가 포함되어 있어 일부 사용자 또는 컴퓨터 식별 가능한 정보를 숨기는 역할을 합니다. 그러나 이 정보를 공개하기 위해 인증서를 설치할 수 있습니다. 여기의 설명을 따르세요.
Hopper
왼쪽 패널
Hopper의 왼쪽 패널에서는 이진 파일의 심볼(라벨), 프로시저 및 함수 목록(Proc), 문자열(Str)을 볼 수 있습니다. 이들은 Mac-O 파일의 여러 부분(예: _cstring 또는 objc_methname
)에 정의된 문자열이 아닌 모든 문자열은 아닙니다.
가운데 패널
가운데 패널에서는 디스어셈블된 코드를 볼 수 있습니다. 그리고 해당 아이콘을 클릭하여 원시 디스어셈블, 그래프, 디컴파일된 코드, 바이너리로 볼 수 있습니다:
코드 객체를 마우스 오른쪽 버튼으로 클릭하면 해당 객체에 대한 참조 및 참조되는 위치를 볼 수 있으며, 이름을 변경할 수도 있습니다 (디컴파일된 의사 코드에서는 작동하지 않음):
또한, 가운데 아래에서는 Python 명령을 작성할 수 있습니다.
오른쪽 패널
오른쪽 패널에서는 탐색 기록 (현재 상태에 도달하는 방법을 알 수 있음), 호출 그래프 (이 함수를 호출하는 모든 함수 및 이 함수가 호출하는 모든 함수를 볼 수 있는 그래프), 로컬 변수 정보와 같은 흥미로운 정보를 볼 수 있습니다.
dtrace
dtrace는 사용자가 매우 낮은 수준에서 응용 프로그램에 액세스할 수 있도록 하며, 사용자가 프로그램을 추적하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 프로브를 사용하여 커널 전체에 배치되며, 시스템 호출의 시작과 끝과 같은 위치에 있습니다.
DTrace는 각 시스템 호출에 대해 프로브를 생성하기 위해 dtrace_probe_create
함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 진입점과 종료점에서 발동될 수 있습니다. DTrace와의 상호작용은 루트 사용자에게만 제공되는 /dev/dtrace를 통해 이루어집니다.
{% hint style="success" %}
SIP 보호를 완전히 비활성화하지 않고 Dtrace를 활성화하려면 복구 모드에서 다음을 실행할 수 있습니다: csrutil enable --without dtrace
또한 컴파일한 이진 파일을 dtrace
또는 **dtruss
**할 수 있습니다.
{% endhint %}
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
는 macOS에서 실행 중인 애플리케이션의 시스템 호출 및 라이브러리 함수 호출을 추적하기 위한 도구입니다. 이를 통해 애플리케이션의 동작을 분석하고 디버깅할 수 있습니다.
사용법
dtruss
를 사용하려면 다음 명령을 터미널에서 실행합니다:
sudo dtruss -p <PID>
여기서 <PID>
는 추적하려는 프로세스의 식별자입니다. 프로세스 식별자를 얻으려면 ps
명령을 사용하거나, 활동 모니터를 통해 확인할 수 있습니다.
추적이 시작되면 dtruss
는 애플리케이션의 시스템 호출과 라이브러리 함수 호출을 실시간으로 출력합니다. 이를 통해 애플리케이션의 동작을 분석하고 문제를 해결할 수 있습니다.
주의사항
dtruss
는 시스템 호출과 라이브러리 함수 호출을 추적하기 때문에, 애플리케이션의 동작에 영향을 줄 수 있습니다. 따라서 신중하게 사용해야 합니다. 또한, dtruss
는 루트 권한이 필요하므로 sudo
를 사용하여 실행해야 합니다.
예시
다음은 dtruss
를 사용하여 Safari 웹 브라우저의 동작을 추적하는 예시입니다:
sudo dtruss -p $(pgrep Safari)
이 명령은 Safari 웹 브라우저의 프로세스 식별자를 찾아서 dtruss
로 추적합니다. 이를 통해 Safari의 시스템 호출과 라이브러리 함수 호출을 실시간으로 확인할 수 있습니다.
dtruss -c ls #Get syscalls of ls
dtruss -c -p 1000 #get syscalls of PID 1000
ktrace
이것은 SIP가 활성화된 상태에서도 사용할 수 있습니다.
ktrace trace -s -S -t c -c ls | grep "ls("
ProcessMonitor
ProcessMonitor는 프로세스가 수행하는 프로세스 관련 작업을 확인하는 매우 유용한 도구입니다 (예: 프로세스가 생성하는 새로운 프로세스를 모니터링).
SpriteTree
SpriteTree는 프로세스 간의 관계를 출력하는 도구입니다.
**sudo eslogger fork exec rename create > cap.json
**와 같은 명령으로 맥을 모니터링해야합니다 (이 명령은 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
이 블로그 포스트에서는 SIP가 비활성화되었더라도 디버깅을 방지하기 위해 **PT_DENY_ATTACH
**를 사용하는 실행 중인 데몬을 디버깅하는 예제를 찾을 수 있습니다.
lldb
lldb는 macOS 이진 파일 디버깅을 위한 사실상의 도구입니다.
lldb ./malware.bin
lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor
다음 줄을 포함하여 홈 폴더에 **.lldbinit
**이라는 파일을 생성하여 lldb를 사용할 때 intel 플레이버를 설정할 수 있습니다.
settings set target.x86-disassembly-flavor intel
{% hint style="warning" %}
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 <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> | 메모리를 null로 종료된 문자열로 표시합니다. |
x/i <reg/memory address> | 메모리를 어셈블리 명령으로 표시합니다. |
x/b <reg/memory address> | 메모리를 바이트로 표시합니다. |
print object (po) | 매개변수로 참조된 객체를 출력합니다. po $raw
대부분의 Apple의 Objective-C API 또는 메서드는 객체를 반환하므로 "print object" (po) 명령을 통해 표시해야 합니다. 의미 있는 출력이 나오지 않는 경우 |
memory | memory 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> # 함수의 어셈블리 명령 표시 |
parray | parray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인 |
{% hint style="info" %}
objc_sendMsg
함수를 호출할 때, rsi 레지스터에는 null로 종료된 ("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:"
{% endhint %}
동적 분석 방지
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)){ //process being debugged }
ptrace
시스템 호출을PT_DENY_ATTACH
플래그와 함께 호출할 수도 있습니다. 이렇게 하면 디버거가 연결되고 추적하는 것을 방지할 수 있습니다.sysctl
또는ptrace
함수가 **가져오기(import)**되었는지 확인할 수 있습니다(하지만 악성 코드는 동적으로 가져올 수 있습니다).- 이 writeup에서 언급된 것처럼, "Defeating Anti-Debug Techniques: macOS ptrace variants":
"메시지 Process # exited with **status = 45 (0x0000002d)**는 일반적으로 디버그 대상이 PT_DENY_ATTACH를 사용하는 것을 나타내는 신호입니다."
퍼징
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
Sleep
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
내부 핸들러
다음 페이지를 확인하세요. 여기에서는 지정된 스키마 또는 프로토콜을 처리하는 앱을 찾는 방법을 알 수 있습니다:
{% content-ref url="../macos-file-extension-apps.md" %} macos-file-extension-apps.md {% endcontent-ref %}
네트워크 프로세스 열거
네트워크 데이터를 관리하는 프로세스를 찾는 것은 흥미로운 작업입니다:
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
{% code overflow="wrap" %}
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"
{% endcode %}
퍼저
AFL++
CLI 도구에 사용됩니다.
Litefuzz
macOS GUI 도구와 "**그냥 작동"**합니다. 일부 macOS 앱은 고유한 파일 이름, 올바른 확장자, 샌드박스에서 파일을 읽어야 하는 등 특정 요구 사항이 있습니다 (~/Library/Containers/com.apple.Safari/Data
에서 파일을 읽어야 함 등).
일부 예시:
{% code overflow="wrap" %}
# 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
{% endcode %}
추가로 macOS 퍼징 정보
- https://www.youtube.com/watch?v=T5xfL9tEg44
- https://github.com/bnagy/slides/blob/master/OSXScale.pdf
- https://github.com/bnagy/francis/tree/master/exploitaben
- https://github.com/ant4g0nist/crashwrangler
참고 자료
- OS X 사고 대응: 스크립팅과 분석
- https://www.youtube.com/watch?v=T5xfL9tEg44
- https://taomm.org/vol1/analysis.html
- Mac 악성 소프트웨어 분석 가이드
AWS 해킹을 처음부터 전문가까지 배우세요 htARTE (HackTricks AWS Red Team Expert)!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 구독 요금제를 확인하세요!
- 공식 PEASS & HackTricks 상품을 구매하세요.
- The PEASS Family를 발견하세요. 독점적인 NFT 컬렉션입니다.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm을 팔로우하세요.
- HackTricks와 HackTricks Cloud github 저장소에 PR을 제출하여 해킹 기법을 공유하세요.