Це друга частина нашого дослідження, в якій ми продовжуємо розглядати різні аспекти аналізу, налагодження та фазінгу додатків macOS. У цій частині ми поглибимося в методи статичного та динамічного аналізу, а також розглянемо різні інструменти та техніки, які можна використовувати для дослідження програм на macOS.
ProcessMonitor — це дуже корисний інструмент для перевірки дій, пов’язаних із процесом, які виконує процес (наприклад, відстеження того, які нові процеси створює процес).
SpriteTree — це інструмент для друку зв’язків між процесами. Вам потрібно стежити за своїм Mac за допомогою команди на зразокsudo eslogger fork exec rename create > cap.json(термінал, який запускає це, вимагає FDA). Потім ви можете завантажити json у цей інструмент, щоб переглянути всі зв’язки:
FileMonitor дозволяє відстежувати події у файлі (такі як створення, модифікація та видалення), надаючи детальну інформацію про такі події.
Crescendo — це інструмент із графічним інтерфейсом користувача, який користувачі Windows можуть знати з Procmon від Microsoft Sysinternal . Цей інструмент дозволяє починати та зупиняти запис різних типів подій, дозволяє фільтрувати ці події за такими категоріями, як файл, процес, мережа тощо, а також забезпечує функціональні можливості для збереження записаних подій у форматі json.
Інструменти Apple є частиною інструментів розробника Xcode, які використовуються для моніторингу продуктивності програми, виявлення витоків пам’яті та відстеження активності файлової системи.
Дозволяє стежити за діями, які виконують процеси:
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 корисний для перегляду бібліотек , які використовує двійковий файл, файлів, які він використовує, і мережевих підключень. Він також перевіряє двійкові процеси на virustotal і показує інформацію про двійковий файл.
У цій публікації блогу ви можете знайти приклад того, як налагодити запущений демон , який раніше PT_DENY_ATTACHзапобігав налагодженню, навіть якщо протокол SIP був вимкнений.
lldb — це фактичний інструмент для двійкового налагодження macOS .
lldb ./malware.bin lldb -p 1122 lldb -n malware.bin lldb -n malware.bin --waitfor
Ви можете встановити смак Intel під час створення файлу .lldbinitу вашій домашній папці за допомогою lldb за допомогою такого рядка:
settings set target.x86-disassembly-flavor intel
Всередині lldb створіть дамп процесу за допомогою
process save-core
Це надрукує об’єкт, на який посилається параметр
po $raw { dnsChanger = { "affiliate" = ""; "blacklist_dns" = ();
Зауважте, що більшість API або методів Apple Objective-C повертають об’єкти, тому їх слід відображати за допомогою команди «print object» (po). Якщо po не дає значущого результату, використовуйте x/b
читання пам’яті 0x000…. читання пам’яті $x0+0xf2a запис пам’яті 0x100600000 -s 4 0x41414141 #Запис AAAA у цю адресу запис пам’яті -fs $rip+0x11f+7 “AAAA” #Запис AAAA в адресі
dis #Disas current function dis -n <funcname> #Disas func dis -n <funcname> -b <basename> #Disas func dis -c 6 #Disas 6 lines dis -c 0x100003764 -e 0x100003768 # Від одного додавання до іншого dis -p -c 4 # Почати розбирання поточної адреси
parray 3 (char **)$x1 # Перевірити масив із 3 компонентів у x1 reg
Під час виклику objc_sendMsgфункції регістр rsi зберігає ім’я методу як рядок із закінченням нулем (“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:"
Команда
sysctl hw.modelповертає «Mac», якщо хостом є MacOS , але щось інше, коли це віртуальна машина.
Граючи зі значеннями,
hw.logicalcpuа
hw.physicalcpuдеякі шкідливі програми намагаються визначити, чи це віртуальна машина.
Деякі зловмисні програми також можуть визначити , чи є машина VMware , на основі MAC-адреси (00:50:56).
Також можна дізнатися, чи процес налагоджується, за допомогою простого коду, наприклад:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }
Він також може викликати
ptraceсистемний виклик з
PT_DENY_ATTACHпрапором. Це запобігає приєднанню та трасуванню деб -уґера .
Ви можете перевірити, чи імпортується функція
sysctlабо (але зловмисне програмне забезпечення може імпортувати її динамічно)
ptrace
Як зазначалося в цьому описі, « Подолання методів захисту від налагодження: варіанти ptrace macOS »: « Повідомлення Process # exited with status = 45 (0x0000002d) зазвичай є ознакою того, що ціль налагодження використовує PT_DENY_ATTACH »
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, Системні налаштування
Якщо ви працюєте через з’єднання SSH, важливо переконатися, що сеанс не триває сьогодні. Тож змініть файл sshd_config за допомогою:
TCPKeepAlive Так
ClientAliveInterval 0
ClientAliveCountMax 0
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
Цікаво знайти процеси, які керують мережевими даними:
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
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"
AFL++ Працює для інструментів CLI
Litefuzz Він « просто працює» з інструментами GUI macOS. Зауважте, що деякі програми 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