# macOS Uygulamaları - İnceleme, hata ayıklama ve Fuzzing {{#include ../../../banners/hacktricks-training.md}} ## Statik Analiz ### otool & objdump & nm ```bash otool -L /bin/ls #List dynamically linked libraries otool -tv /bin/ps #Decompile application ``` ```bash 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 ``` ```bash nm -m ./tccd # List of symbols ``` ### jtool2 & Disarm Buradan [**disarm'ı indirebilirsiniz**](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 ``` Buradan [**jtool2'yi indirebilirsiniz**](http://www.newosxbook.com/tools/jtool.html) veya `brew` ile kurabilirsiniz. ```bash # 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 lehine kullanımdan kaldırılmıştır** ### Codesign / ldid > [!TIP] > **`Codesign`** **macOS**'te bulunabilirken, **`ldid`** **iOS**'te bulunabilir ```bash # 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 toolsdemo # Get signature info ldid -h # Get entitlements ldid -e # Change entilements ## /tmp/entl.xml is a XML file with the new entitlements to add ldid -S/tmp/entl.xml ``` ### SuspiciousPackage [**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) , **.pkg** dosyalarını (kurulum dosyaları) incelemek ve yüklemeden önce içeriğini görmek için yararlı bir araçtır.\ Bu kurulum dosyaları, kötü amaçlı yazılım yazarlarının genellikle kötü amaçlı yazılımı **sürdürmek** için kötüye kullandığı `preinstall` ve `postinstall` bash betikleri içerir. ### hdiutil Bu araç, herhangi bir şey çalıştırmadan önce Apple disk görüntülerini (**.dmg**) incelemek için **monte** etmeye olanak tanır: ```bash hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg ``` `/Volumes` altında monte edilecektir. ### Paketlenmiş ikili dosyalar - Yüksek entropi kontrolü - String'leri kontrol et (anlaşılır string yoksa, paketlenmiş) - MacOS için UPX paketleyici, "\_\_XHDR" adında bir bölüm oluşturur. ## Statik Objective-C analizi ### Metadata > [!CAUTION] > Objective-C ile yazılmış programların **derlendiğinde** [Mach-O ikili dosyalarına](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md) **sınıf bildirimlerini** **koruduğunu** unutmayın. Bu tür sınıf bildirimleri **şunları içerir**: - Tanımlanan arayüzler - Arayüz yöntemleri - Arayüz örnek değişkenleri - Tanımlanan protokoller Bu isimlerin, ikilinin tersine mühendislik sürecini zorlaştırmak için obfuscate edilebileceğini unutmayın. ### Fonksiyon çağrısı Bir ikili dosyada Objective-C kullanan bir fonksiyon çağrıldığında, derlenmiş kod o fonksiyonu çağırmak yerine **`objc_msgSend`** çağrısını yapar. Bu, nihai fonksiyonu çağıracaktır: ![](<../../../images/image (305).png>) Bu fonksiyonun beklediği parametreler şunlardır: - İlk parametre (**self**) "mesajı alacak **sınıfın örneğine işaret eden bir işaretçi**"dir. Daha basit bir ifadeyle, bu, metodun çağrıldığı nesnedir. Eğer metod bir sınıf metoduysa, bu sınıf nesnesinin (bütün olarak) bir örneği olacaktır; oysa bir örnek metodu için, self sınıfın bir örneğine işaret edecektir. - İkinci parametre (**op**), "mesajı işleyen metodun seçicisidir". Yine, daha basit bir ifadeyle, bu sadece **metodun adıdır.** - Kalan parametreler, metodun gerektirdiği herhangi bir **değerdir** (op). Bu bilgiyi **ARM64'te `lldb` ile kolayca nasıl alacağınızı** bu sayfada görün: {{#ref}} arm64-basic-assembly.md {{#endref}} x64: | **Argüman** | **Kayıt** | **(için) objc_msgSend** | | ----------------- | ------------------------------------------------------------- | ------------------------------------------------------ | | **1. argüman** | **rdi** | **self: metodun çağrıldığı nesne** | | **2. argüman** | **rsi** | **op: metodun adı** | | **3. argüman** | **rdx** | **metoda 1. argüman** | | **4. argüman** | **rcx** | **metoda 2. argüman** | | **5. argüman** | **r8** | **metoda 3. argüman** | | **6. argüman** | **r9** | **metoda 4. argüman** | | **7. ve üzeri argüman** |

rsp+
(stack'te)

| **metoda 5. ve üzeri argüman** | ### ObjectiveC metadata dökümü ### Dynadump [**Dynadump**](https://github.com/DerekSelander/dynadump), Objective-C ikili dosyalarını sınıf dökümü yapmak için bir araçtır. Github, dylib'leri belirtmektedir ancak bu yürütülebilir dosyalarla da çalışır. ```bash ./dynadump dump /path/to/bin ``` Yazma zamanı itibarıyla, bu **şu anda en iyi çalışan** olanıdır. #### Normal araçlar ```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/) , ObjectiveC formatında kod için sınıflar, kategoriler ve protokoller için bildirimler üreten orijinal araçtır. Eski ve bakımsızdır, bu yüzden muhtemelen düzgün çalışmayacaktır. #### ICDump [**iCDump**](https://github.com/romainthomas/iCDump) modern ve çok platformlu bir Objective-C sınıf dökümüdür. Mevcut araçlarla karşılaştırıldığında, iCDump Apple ekosisteminden bağımsız olarak çalışabilir ve Python bağlamalarını açığa çıkarır. ```python import icdump metadata = icdump.objc.parse("/path/to/bin") print(metadata.to_decl()) ``` ## Statik Swift analizi Swift ikili dosyaları ile, Objective-C uyumluluğu olduğundan, bazen [class-dump](https://github.com/nygard/class-dump/) kullanarak bildirimleri çıkartabilirsiniz ama her zaman değil. **`jtool -l`** veya **`otool -l`** komut satırları ile **`__swift5`** ön eki ile başlayan birkaç bölüm bulmak mümkündür: ```bash 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 [...] ``` Daha fazla bilgiye [**bu bölümde saklanan bilgiler hakkında bu blog yazısında**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html) ulaşabilirsiniz. Ayrıca, **Swift ikili dosyaları sembollere sahip olabilir** (örneğin, kütüphanelerin fonksiyonlarının çağrılabilmesi için sembolleri saklaması gerekir). **Semboller genellikle fonksiyon adı ve attr hakkında çirkin bir şekilde bilgi içerir**, bu nedenle çok faydalıdırlar ve orijinal adı alabilen "**demanglers"** vardır: ```bash # Ghidra plugin https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py # Swift cli swift demangle ``` ## Dinamik Analiz > [!WARNING] > İkili dosyaları hata ayıklamak için, **SIP'nin devre dışı bırakılması gerekir** (`csrutil disable` veya `csrutil enable --without debug`) veya ikili dosyaları geçici bir klasöre kopyalayıp **imzayı kaldırmak** için `codesign --remove-signature ` veya ikili dosyanın hata ayıklanmasına izin vermek gerekir (bunu [bu script](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b) ile kullanabilirsiniz). > [!WARNING] > macOS'ta **sistem ikili dosyalarını enstrümante etmek** için (örneğin `cloudconfigurationd`), **SIP'nin devre dışı bırakılması gerekir** (sadece imzayı kaldırmak işe yaramaz). ### API'ler macOS, süreçler hakkında bilgi veren bazı ilginç API'ler sunar: - `proc_info`: Her süreç hakkında çok fazla bilgi veren ana API'dir. Diğer süreçlerin bilgilerini almak için root olmanız gerekir, ancak özel yetkilere veya mach portlarına ihtiyacınız yoktur. - `libsysmon.dylib`: XPC ile sunulan işlevler aracılığıyla süreçler hakkında bilgi almayı sağlar, ancak `com.apple.sysmond.client` yetkisine sahip olmak gerekir. ### Stackshot & microstackshots **Stackshotting**, süreçlerin durumunu, tüm çalışan iş parçacıklarının çağrı yığınlarını içerecek şekilde yakalamak için kullanılan bir tekniktir. Bu, hata ayıklama, performans analizi ve sistemin belirli bir zamanda davranışını anlamak için özellikle yararlıdır. iOS ve macOS'ta, stackshotting, **`sample`** ve **`spindump`** gibi çeşitli araçlar ve yöntemler kullanılarak gerçekleştirilebilir. ### Sysdiagnose Bu araç (`/usr/bini/ysdiagnose`), bilgisayarınızdan `ps`, `zprint` gibi onlarca farklı komut çalıştırarak çok fazla bilgi toplar... **root** olarak çalıştırılmalıdır ve `/usr/libexec/sysdiagnosed` daemon'u `com.apple.system-task-ports` ve `get-task-allow` gibi çok ilginç yetkilere sahiptir. Plist'i `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist` konumunda bulunur ve 3 MachServices tanımlar: - `com.apple.sysdiagnose.CacheDelete`: /var/rmp içindeki eski arşivleri siler - `com.apple.sysdiagnose.kernel.ipc`: Özel port 23 (kernel) - `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-C sınıfı aracılığıyla kullanıcı modu arayüzü. Bir sözlükte üç argüman geçirilebilir (`compress`, `display`, `run`) ### Birleşik Günlükler MacOS, bir uygulama çalıştırırken **ne yaptığını** anlamaya çalışırken çok yararlı olabilecek birçok günlük oluşturur. Ayrıca, bazı günlükler, bazı **kullanıcı** veya **bilgisayar** **tanımlanabilir** bilgileri **gizlemek için** `` etiketini içerecektir. Ancak, bu bilgileri açığa çıkarmak için **bir sertifika yüklemek mümkündür**. Açıklamaları [**buradan**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log) takip edin. ### Hopper #### Sol panel Hopper'ın sol panelinde, ikilinin sembollerini (**Etiketler**), prosedürler ve işlevler listesini (**Proc**) ve dizeleri (**Str**) görebilirsiniz. Bunlar tüm dizeler değildir, ancak Mac-O dosyasının çeşitli bölümlerinde tanımlananlardır (örneğin _cstring veya_ `objc_methname`). #### Orta panel Orta panelde **dağıtılmış kodu** görebilirsiniz. Ve bunu **ham** dağıtım, **graf** olarak, **decompile edilmiş** ve **ikili** olarak ilgili simgeye tıklayarak görebilirsiniz:
Bir kod nesnesine sağ tıkladığınızda, o nesneye **referansları** görebilir veya adını değiştirebilirsiniz (bu, decompile edilmiş psödo kodda çalışmaz):
Ayrıca, **orta altta python komutları yazabilirsiniz**. #### Sağ panel Sağ panelde, **navigasyon geçmişi** gibi ilginç bilgileri görebilirsiniz (bu sayede mevcut duruma nasıl geldiğinizi bilirsiniz), bu işlevi çağıran tüm **işlevleri** ve **bu işlevin çağırdığı** tüm işlevleri görebileceğiniz **çağrı grafiği** ve **yerel değişkenler** bilgisi. ### dtrace Kullanıcılara uygulamalara son derece **düşük seviyede** erişim sağlar ve kullanıcılara **programları izleme** ve hatta yürütme akışlarını değiştirme imkanı sunar. Dtrace, **kernel boyunca yerleştirilen** **prob'lar** kullanır ve sistem çağrılarının başlangıç ve bitiş noktaları gibi yerlerde bulunur. DTrace, her sistem çağrısı için bir prob oluşturmak üzere **`dtrace_probe_create`** işlevini kullanır. Bu prob'lar, her sistem çağrısının **giriş ve çıkış noktasında** tetiklenebilir. DTrace ile etkileşim, yalnızca root kullanıcı için mevcut olan /dev/dtrace aracılığıyla gerçekleşir. > [!TIP] > Dtrace'ı SIP korumasını tamamen devre dışı bırakmadan etkinleştirmek için kurtarma modunda şunu çalıştırabilirsiniz: `csrutil enable --without dtrace` > > Ayrıca **`dtrace`** veya **`dtruss`** ikililerini **derlediğiniz** dosyaları kullanarak çalıştırabilirsiniz. Dtrace'ın mevcut prob'ları şu şekilde elde edilebilir: ```bash 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 ``` Probe adı dört bölümden oluşur: sağlayıcı, modül, işlev ve ad (`fbt:mach_kernel:ptrace:entry`). Eğer adın bazı bölümlerini belirtmezseniz, Dtrace o bölümü joker karakter olarak uygular. DTrace'i probeleri etkinleştirmek ve tetiklendiğinde hangi eylemlerin gerçekleştirileceğini belirtmek için D dilini kullanmamız gerekecek. Daha ayrıntılı bir açıklama ve daha fazla örnek için [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html) adresine bakabilirsiniz. #### Örnekler `man -k dtrace` komutunu çalıştırarak **mevcut DTrace betiklerini** listeleyin. Örnek: `sudo dtruss -n binary` ```bash #Count the number of syscalls of each running process sudo dtrace -n 'syscall:::entry {@[execname] = count()}' ``` - betik ```bash syscall:::entry /pid == $1/ { } #Log every syscall of a PID sudo dtrace -s script.d 1234 ``` ```bash 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" ``` ```bash syscall:::entry { ; } syscall:::return { printf("=%d\n", arg1); } #Log sys calls with values sudo dtrace -s syscalls_info.d -c "cat /etc/hosts" ``` ### dtruss ```bash dtruss -c ls #Get syscalls of ls dtruss -c -p 1000 #get syscalls of PID 1000 ``` ### kdebug Bu, bir çekirdek izleme aracıdır. Belgelendirilmiş kodlar **`/usr/share/misc/trace.codes`** içinde bulunabilir. `latency`, `sc_usage`, `fs_usage` ve `trace` gibi araçlar bunu dahili olarak kullanır. `kdebug` ile etkileşim kurmak için `sysctl`, `kern.kdebug` ad alanı üzerinden kullanılır ve kullanılacak MIB'ler `bsd/kern/kdebug.c` içinde uygulanan fonksiyonlarla birlikte `sys/sysctl.h` dosyasında bulunabilir. Özel bir istemci ile kdebug ile etkileşim kurmak için genellikle şu adımlar izlenir: - Mevcut ayarları KERN_KDSETREMOVE ile kaldırın - KERN_KDSETBUF ve KERN_KDSETUP ile izlemeyi ayarlayın - KERN_KDGETBUF ile tampon girişlerinin sayısını alın - KERN_KDPINDEX ile izleme kaydından kendi istemcinizi çıkarın - KERN_KDENABLE ile izlemeyi etkinleştirin - KERN_KDREADTR çağrısını yaparak tamponu okuyun - Her bir iş parçacığını kendi süreci ile eşleştirmek için KERN_KDTHRMAP çağrısını yapın. Bu bilgiyi almak için Apple aracı **`trace`** veya özel araç [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)** kullanılabilir.** **Kdebug'un aynı anda yalnızca 1 müşteri için mevcut olduğunu unutmayın.** Yani aynı anda yalnızca bir k-debug destekli araç çalıştırılabilir. ### ktrace `ktrace_*` API'leri, `Kdebug`'ın sarmalayıcıları olan `libktrace.dylib`'den gelir. Ardından, bir istemci sadece `ktrace_session_create` ve `ktrace_events_[single/class]` çağrısı yaparak belirli kodlar üzerinde geri çağırmalar ayarlayabilir ve ardından `ktrace_start` ile başlatabilir. Bunu **SIP etkinleştirildiğinde** bile kullanabilirsiniz. İstemci olarak `ktrace` aracını kullanabilirsiniz: ```bash ktrace trace -s -S -t c -c ls | grep "ls(" ``` Or `tailspin`. ### kperf Bu, bir çekirdek düzeyinde profil oluşturmak için kullanılır ve `Kdebug` çağrıları kullanılarak oluşturulmuştur. Temelde, global değişken `kernel_debug_active` kontrol edilir ve ayarlandığında `kperf_kdebug_handler` çağrılır, `Kdebug` kodu ve çağrılan çekirdek çerçevesinin adresi ile. Eğer `Kdebug` kodu seçilenlerden biriyle eşleşirse, "hareketler" bitmap olarak yapılandırılır (seçenekler için `osfmk/kperf/action.h` dosyasına bakın). Kperf ayrıca bir sysctl MIB tablosuna sahiptir: (root olarak) `sysctl kperf`. Bu kodlar `osfmk/kperf/kperfbsd.c` dosyasında bulunabilir. Ayrıca, Kperf'in işlevselliğinin bir alt kümesi `kpc` içinde yer alır ve bu, makine performans sayaçları hakkında bilgi sağlar. ### ProcessMonitor [**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor), bir sürecin gerçekleştirdiği işlemle ilgili eylemleri kontrol etmek için çok yararlı bir araçtır (örneğin, bir sürecin hangi yeni süreçleri oluşturduğunu izlemek). ### SpriteTree [**SpriteTree**](https://themittenmac.com/tools/) süreçler arasındaki ilişkileri yazdıran bir araçtır.\ Mac'inizi **`sudo eslogger fork exec rename create > cap.json`** gibi bir komutla izlemelisiniz (bu komutu başlatan terminal FDA gerektirir). Ardından, bu aracı kullanarak json'u yükleyebilir ve tüm ilişkileri görüntüleyebilirsiniz:
### FileMonitor [**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor), dosya olaylarını (oluşturma, değişiklikler ve silmeler gibi) izlemeye olanak tanır ve bu olaylar hakkında ayrıntılı bilgi sağlar. ### Crescendo [**Crescendo**](https://github.com/SuprHackerSteve/Crescendo), Windows kullanıcılarının Microsoft Sysinternal’s _Procmon_'dan tanıyabileceği bir GUI aracıdır. Bu araç, çeşitli olay türlerinin kaydedilmesini başlatıp durdurmaya, bu olayları dosya, süreç, ağ vb. gibi kategorilere göre filtrelemeye ve kaydedilen olayları json formatında kaydetme işlevselliği sunar. ### Apple Instruments [**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html), Xcode’un Geliştirici araçlarının bir parçasıdır – uygulama performansını izlemek, bellek sızıntılarını tanımlamak ve dosya sistemi etkinliğini takip etmek için kullanılır. ![](<../../../images/image (1138).png>) ### fs_usage Süreçler tarafından gerçekleştirilen eylemleri takip etmeye olanak tanır: ```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), bir ikili dosyanın kullandığı **kütüphaneleri**, kullandığı **dosyaları** ve **ağ** bağlantılarını görmek için faydalıdır.\ Ayrıca, ikili süreçleri **virustotal** ile kontrol eder ve ikili hakkında bilgi gösterir. ## PT_DENY_ATTACH [**Bu blog yazısında**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) **`PT_DENY_ATTACH`** kullanan bir **çalışan daemon'u** nasıl **hata ayıklayacağınız** hakkında bir örnek bulabilirsiniz; bu, SIP devre dışı bırakılmış olsa bile hata ayıklamayı engellemek için kullanılır. ### lldb **lldb**, **macOS** ikili **hata ayıklama** için de **facto** araçtır. ```bash lldb ./malware.bin lldb -p 1122 lldb -n malware.bin lldb -n malware.bin --waitfor ``` Intel lezzetini ayarlamak için, ana dizininizde **`.lldbinit`** adında bir dosya oluşturarak aşağıdaki satırı ekleyebilirsiniz: ```bash settings set target.x86-disassembly-flavor intel ``` > [!WARNING] > lldb içinde bir işlemi `process save-core` ile dökme
(lldb) KomutAçıklama
run (r)Bir kesme noktası vurulana veya işlem sona erene kadar devam edecek şekilde yürütmeyi başlatır.
process launch --stop-at-entryGiriş noktasında durarak yürütmeyi başlatır
continue (c)Hata ayıklanan işlemin yürütmesini devam ettirir.
nexti (n / ni)Sonraki talimatı yürüt. Bu komut, işlev çağrılarını atlayacaktır.
stepi (s / si)Sonraki talimatı yürüt. nexti komutunun aksine, bu komut işlev çağrılarına adım atar.
finish (f)Mevcut işlevdeki (“çerçeve”) geri dönüş ve durma ile kalan talimatları yürütür.
control + cYürütmeyi duraklat. İşlem run (r) veya continue (c) ile çalıştırılmışsa, bu işlem mevcut yürütme yerinde durmasına neden olur.
breakpoint (b)

b main #Herhangi bir main adlı işlev

b `main #Binin ana işlevi

b set -n main --shlib #Belirtilen binin ana işlevi

breakpoint set -r '\[NSFileManager .*\]$' #Herhangi bir NSFileManager yöntemi

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

break set -r . -s libobjc.A.dylib # O kütüphanedeki tüm işlevlerde dur

b -a 0x0000000100004bd9

br l #Kesme noktası listesi

br e/dis #Kesme noktasını Etkinleştir/Durdur

breakpoint delete

help

help breakpoint #Kesme noktası komutu hakkında yardım al

help memory write #Belleğe yazma hakkında yardım al

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s Belleği null-terminatlı dize olarak görüntüler.
x/i Belleği montaj talimatı olarak görüntüler.
x/b Belleği bayt olarak görüntüler.
print object (po)

Bu, parametre ile referans verilen nesneyi yazdırır

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Apple’ın Objective-C API'lerinin veya yöntemlerinin çoğu nesneler döndürdüğünden, bunlar “print object” (po) komutu ile görüntülenmelidir. Eğer po anlamlı bir çıktı üretmiyorsa x/b kullanın.

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #O adrese AAAA yaz
memory write -f s $rip+0x11f+7 "AAAA" #Adrese AAAA yaz
disassembly

dis #Mevcut işlevi disassemble et

dis -n #İşlevi disassemble et

dis -n -b #İşlevi disassemble et
dis -c 6 #6 satırı disassemble et
dis -c 0x100003764 -e 0x100003768 #Bir eklemden diğerine kadar
dis -p -c 4 #Mevcut adreste disassemble etmeye başla

parrayparray 3 (char **)$x1 # x1 reg'inde 3 bileşenli diziyi kontrol et
image dump sectionsMevcut işlem belleğinin haritasını yazdırır
image dump symtab image dump symtab CoreNLP #CoreNLP'den tüm sembollerin adresini al
> [!TIP] > **`objc_sendMsg`** fonksiyonu çağrıldığında, **rsi** kaydedicisi **metodun adını** null-terminatlı (“C”) dize olarak tutar. Adı lldb üzerinden yazdırmak için: > > `(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:"` ### Anti-Dinamik Analiz #### VM tespiti - **`sysctl hw.model`** komutu **host bir MacOS** olduğunda "Mac" döner, ancak bir VM olduğunda farklı bir şey döner. - **`hw.logicalcpu`** ve **`hw.physicalcpu`** değerleri ile oynayarak bazı kötü amaçlı yazılımlar bir VM olup olmadığını tespit etmeye çalışır. - Bazı kötü amaçlı yazılımlar, MAC adresine (00:50:56) dayanarak makinenin **VMware** tabanlı olup olmadığını da **tespit edebilir**. - Basit bir kod ile **bir işlemin hata ayıklanıp ayıklanmadığını** bulmak da mümkündür: - `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //işlem hata ayıklanıyor }` - Ayrıca **`ptrace`** sistem çağrısını **`PT_DENY_ATTACH`** bayrağı ile çağırabilir. Bu, bir hata ayıklayıcının bağlanmasını ve izlenmesini **engeller**. - **`sysctl`** veya **`ptrace`** fonksiyonunun **içe aktarıldığını** kontrol edebilirsiniz (ancak kötü amaçlı yazılım bunu dinamik olarak içe aktarabilir). - Bu yazıda belirtildiği gibi, “[Anti-Debug Tekniklerini Aşmak: macOS ptrace varyantları](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\ “_Process # exited with **status = 45 (0x0000002d)** mesajı genellikle hata ayıklama hedefinin **PT_DENY_ATTACH** kullandığını gösteren bir işarettir_” ## Core Dumps Core dump'lar aşağıdaki durumlarda oluşturulur: - `kern.coredump` sysctl 1 olarak ayarlanmışsa (varsayılan olarak) - İşlem suid/sgid değilse veya `kern.sugid_coredump` 1 ise (varsayılan olarak 0) - `AS_CORE` limiti işlemi izin veriyorsa. Kod dump'larının oluşturulmasını engellemek için `ulimit -c 0` çağrısı yapılabilir ve tekrar etkinleştirmek için `ulimit -c unlimited` kullanılabilir. Bu durumlarda core dump, `kern.corefile` sysctl'ine göre oluşturulur ve genellikle `/cores/core/.%P` dizininde saklanır. ## Fuzzing ### [ReportCrash](https://ss64.com/osx/reportcrash.html) ReportCrash **çöken işlemleri analiz eder ve bir çökme raporunu diske kaydeder**. Bir çökme raporu, bir geliştiricinin çökme nedenini teşhis etmesine yardımcı olabilecek bilgileri içerir.\ Kullanıcı başına launchd bağlamında **çalışan uygulamalar ve diğer işlemler** için, ReportCrash bir LaunchAgent olarak çalışır ve çökme raporlarını kullanıcının `~/Library/Logs/DiagnosticReports/` dizinine kaydeder.\ Daimonlar, sistem launchd bağlamında **çalışan diğer işlemler** ve diğer ayrıcalıklı işlemler için, ReportCrash bir LaunchDaemon olarak çalışır ve çökme raporlarını sistemin `/Library/Logs/DiagnosticReports` dizinine kaydeder. Eğer çökme raporlarının **Apple'a gönderilmesinden endişe ediyorsanız**, bunları devre dışı bırakabilirsiniz. Aksi takdirde, çökme raporları **bir sunucunun nasıl çöktüğünü anlamak için** faydalı olabilir. ```bash #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 ``` ### Uyku MacOS'ta fuzzing yaparken Mac'in uykuya dalmasına izin vermemek önemlidir: - systemsetup -setsleep Never - pmset, Sistem Tercihleri - [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake) #### SSH Bağlantısı Kesilmesi Eğer bir SSH bağlantısı üzerinden fuzzing yapıyorsanız, oturumun kapanmayacağından emin olmak önemlidir. Bu nedenle sshd_config dosyasını şu şekilde değiştirin: - TCPKeepAlive Yes - ClientAliveInterval 0 - ClientAliveCountMax 0 ```bash sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist ``` ### İçsel İşleyiciler **Aşağıdaki sayfayı kontrol edin** hangi uygulamanın **belirtilen şemayı veya protokolü işlediğini bulmak için:** {{#ref}} ../macos-file-extension-apps.md {{#endref}} ### Ağ Süreçlerini Sayma Ağ verilerini yöneten süreçleri bulmak için bu ilginçtir: ```bash 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 ``` Ya da `netstat` veya `lsof` kullanın ### 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++](https://github.com/AFLplusplus/AFLplusplus) CLI araçları için çalışır #### [Litefuzz](https://github.com/sec-tools/litefuzz) macOS GUI araçlarıyla "**sadece çalışır**". Bazı macOS uygulamalarının benzersiz dosya adları, doğru uzantı gibi belirli gereksinimleri olduğunu unutmayın, dosyaları sandbox'tan (`~/Library/Containers/com.apple.Safari/Data`) okumaları gerekir... Bazı örnekler: ```bash # 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 ``` ### Daha Fazla Fuzzing MacOS Bilgisi - [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) ## Referanslar - [**OS X Olay Yanıtı: Betik ve Analiz**](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) - [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html) - [**Mac Kötü Amaçlı Yazılımı Sanatı: Kötü Amaçlı Yazılımları Analiz Etme Rehberi**](https://taomm.org/) {{#include ../../../banners/hacktricks-training.md}}