From 9a8245eccf72f11d63a573694470251b572e1c08 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Mar 2024 08:47:51 +0000 Subject: [PATCH] Translated ['exploiting/tools/README.md', 'macos-hardening/macos-securit --- exploiting/tools/README.md | 234 ++++++++-------- .../README.md | 249 +++++++----------- .../arm64-basic-assembly.md | 193 ++++++++------ 3 files changed, 315 insertions(+), 361 deletions(-) diff --git a/exploiting/tools/README.md b/exploiting/tools/README.md index 157d7b8e6..a6af9fd70 100644 --- a/exploiting/tools/README.md +++ b/exploiting/tools/README.md @@ -1,19 +1,20 @@ +# Alati za iskorišćavanje +
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! Drugi načini podrške HackTricks-u: -* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)! +* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) -* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) -* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.** +* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) +* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
- -# Metasploit +## Metasploit ``` pattern_create.rb -l 3000 #Length pattern_offset.rb -l 3000 -q 5f97d534 #Search offset @@ -21,116 +22,94 @@ nasm_shell.rb nasm> jmp esp #Get opcodes msfelfscan -j esi /opt/fusion/bin/level01 ``` -## Shellkodovi - -Shellkodovi su male programske jedinice koje se koriste u hakiranju kako bi se iskoristile ranjivosti softvera i preuzela kontrola nad ciljanim sistemom. Shellkodovi su obično napisani u mašinskom jeziku i dizajnirani su da se izvršavaju direktno na ciljnom sistemu. Ovi kodovi često sadrže zlonamerne funkcionalnosti kao što su preuzimanje daljinskog pristupa, izvršavanje komandi i manipulacija fajlovima. - -Shellkodovi se često koriste u procesu eksploatacije ranjivosti kako bi se omogućilo daljinsko izvršavanje koda na ciljnom sistemu. Kada se ranjivost iskoristi, shellkod se ubacuje u ciljni sistem i izvršava se kako bi se ostvarila željena funkcionalnost. Shellkodovi mogu biti dizajnirani da rade na različitim platformama i arhitekturama, kao što su Windows, Linux, x86, x64, ARM itd. - -Postoji nekoliko alata koji se koriste za generisanje shellkodova, kao što su Metasploit Framework, msfvenom i Shellter. Ovi alati omogućavaju hakere da generišu shellkodove koji su prilagođeni specifičnim ranjivostima i ciljnim sistemima. Kada se generiše shellkod, on se obično enkodira kako bi se izbeglo otkrivanje antivirusnim programima i IDS sistemima. - -Shellkodovi su moćno oružje u arsenalu hakera i mogu se koristiti za izvršavanje različitih zlonamernih aktivnosti. Međutim, važno je napomenuti da je korišćenje shellkodova za neovlašćeni pristup ili oštećenje sistema ilegalno i može imati ozbiljne pravne posledice. Shellkodovi se trebaju koristiti samo u okviru zakonitih aktivnosti, kao što su etičko hakovanje i testiranje bezbednosti. +### Shellkodovi ``` msfvenom /p windows/shell_reverse_tcp LHOST= LPORT= [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c ``` -# GDB +## GDB -## Instalacija - -Da biste instalirali GDB na vašem sistemu, pratite sledeće korake: - -### Linux - -1. Otvorite terminal. -2. Pokrenite sledeću komandu: - -```bash -sudo apt-get install gdb -``` - -### macOS - -1. Otvorite terminal. -2. Pokrenite sledeću komandu: - -```bash -brew install gdb -``` - -### Windows - -1. Preuzmite instalacioni fajl sa [GDB sajta](https://www.gnu.org/software/gdb/download/). -2. Pokrenite instalacioni fajl i pratite uputstva za instalaciju. - -Nakon uspešne instalacije, GDB će biti dostupan na vašem sistemu i možete ga koristiti za debagovanje i analizu programa. +### Instalacija ``` apt-get install gdb ``` -## Parametri - -**-q** --> Ne prikazuj baner\ -**-x \** --> Automatski izvrši GDB instrukcije iz ovog fajla\ -**-p \** --> Poveži se sa procesom - -### Instrukcije - -\> **disassemble main** --> Rastavi funkciju\ -\> **disassemble 0x12345678**\ -\> **set disassembly-flavor intel**\ -\> **set follow-fork-mode child/parent** --> Prati kreirane procese\ -\> **p system** --> Pronađi adresu funkcije system\ -\> **help**\ -\> **quit** - -\> **br func** --> Dodaj prekidnu tačku na funkciju\ -\> **br \*func+23**\ -\> **br \*0x12345678**\ -**> del NUM** --> Obriši tu broj prekidnih tačaka\ -\> **watch IZRAZ** --> Prekini ako se vrednost promeni - -**> run** --> Izvrši\ -**> start** --> Pokreni i prekini u main funkciji\ -\> **n/next** --> Izvrši sledeću instrukciju (ne ulazi unutar funkcije)\ -\> **s/step** --> Izvrši sledeću instrukciju\ -\> **c/continue** --> Nastavi do sledeće prekidne tačke - -\> **set $eip = 0x12345678** --> Promeni vrednost $eip\ -\> **info functions** --> Informacije o funkcijama\ -\> **info functions func** --> Informacije o funkciji\ -\> **info registers** --> Vrednost registara\ -\> **bt** --> Stog\ -\> **bt full** --> Detaljan stog - -\> **print promenljiva**\ -\> **print 0x87654321 - 0x12345678** --> Izračunaj\ -\> **examine o/x/u/t/i/s dir\_mem/reg/puntero** --> Prikazuje sadržaj u oktalnom/hexadecimalnom/10/binarnom/instrukcijskom/ascii formatu - -* **x/o 0xDir\_hex** -* **x/2x $eip** --> 2 reči od EIP-a -* **x/2x $eip -4** --> $eip - 4 -* **x/8xb $eip** --> 8 bajtova (b-> bajt, h-> 2 bajta, w-> 4 bajta, g-> 8 bajta) -* **i r eip** --> Vrednost $eip-a -* **x/w pointer** --> Vrednost pokazivača -* **x/s pointer** --> String na koji pokazuje pokazivač -* **x/xw \&pointer** --> Adresa na kojoj se nalazi pokazivač -* **x/i $eip** —> Instrukcije EIP-a - -## [GEF](https://github.com/hugsy/gef) +### Parametri ```bash +-q # No show banner +-x # Auto-execute GDB instructions from here +-p # Attach to process +``` +### Uputstva +```bash +run # Execute +start # Start and break in main +n/next/ni # Execute next instruction (no inside) +s/step/si # Execute next instruction +c/continue # Continue until next breakpoint +p system # Find the address of the system function +set $eip = 0x12345678 # Change value of $eip +help # Get help +quit # exit + +# Disassemble +disassemble main # Disassemble the function called main +disassemble 0x12345678 # Disassemble taht address +set disassembly-flavor intel # Use intel syntax +set follow-fork-mode child/parent # Follow child/parent process + +# Breakpoints +br func # Add breakpoint to function +br *func+23 +br *0x12345678 +del # Delete that number of breakpoint +watch EXPRESSION # Break if the value changes + +# info +info functions --> Info abount functions +info functions func --> Info of the funtion +info registers --> Value of the registers +bt # Backtrace Stack +bt full # Detailed stack +print variable +print 0x87654321 - 0x12345678 # Caculate + +# x/examine +examine/ dir_mem/reg/puntero # Shows content of in where each entry is a +x/o 0xDir_hex +x/2x $eip # 2Words from EIP +x/2x $eip -4 # $eip - 4 +x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes) +i r eip # Value of $eip +x/w pointer # Value of the pointer +x/s pointer # String pointed by the pointer +x/xw &pointer # Address where the pointer is located +x/i $eip # Instructions of the EIP +``` +### [GEF](https://github.com/hugsy/gef) +```bash +help memory # Get help on memory command +canary # Search for canary value in memory checksec #Check protections p system #Find system function address search-pattern "/bin/sh" #Search in the process memory vmmap #Get memory mappings +xinfo # Shows page, size, perms, memory area and offset of the addr in the page +memory watch 0x784000 0x1000 byte #Add a view always showinf this memory +got #Check got table +memory watch $_got()+0x18 5 #Watch a part of the got table -#Shellcode -shellcode search x86 #Search shellcodes -shellcode get 61 #Download shellcode number 61 +# Vulns detection +format-string-helper #Detect insecure format strings +heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap #Patterns pattern create 200 #Generate length 200 pattern pattern search "avaaawaa" #Search for the offset of that substring pattern search $rsp #Search the offset given the content of $rsp +#Shellcode +shellcode search x86 #Search shellcodes +shellcode get 61 #Download shellcode number 61 + #Another way to get the offset of to the RIP 1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it 2- ef➤ i f @@ -145,11 +124,11 @@ gef➤ pattern search 0x6261617762616176 [+] Searching for '0x6261617762616176' [+] Found at offset 184 (little-endian search) likely ``` -## Trikovi +### Trikovi -### GDB iste adrese +#### GDB iste adrese -Prilikom debagovanja, GDB će imati **nešto drugačije adrese od onih koje koristi binarni fajl prilikom izvršavanja.** Možete postići da GDB ima iste adrese tako što ćete uraditi sledeće: +Prilikom debagovanja, GDB će imati **nešto drugačije adrese od onih koje koristi binarni fajl prilikom izvršavanja.** Možete postaviti da GDB ima iste adrese tako što ćete uraditi sledeće: * `unset env LINES` * `unset env COLUMNS` @@ -157,10 +136,10 @@ Prilikom debagovanja, GDB će imati **nešto drugačije adrese od onih koje kori * Iskoristite binarni fajl koristeći istu apsolutnu putanju * `PWD` i `OLDPWD` moraju biti isti prilikom korišćenja GDB-a i prilikom iskorišćavanja binarnog fajla -### Backtrace za pronalaženje pozvanih funkcija +#### Backtrace za pronalaženje pozvanih funkcija -Kada imate **statički povezan binarni fajl**, sve funkcije će pripadati binarnom fajlu (a ne eksternim bibliotekama). U ovom slučaju će biti teško **identifikovati tok kojim binarni fajl sledi, na primer, da traži unos korisnika**.\ -Lako možete identifikovati ovaj tok tako što ćete **pokrenuti** binarni fajl sa **gdb** sve dok vas ne zatraži unos. Zatim ga zaustavite sa **CTRL+C** i koristite komandu **`bt`** (**backtrace**) da biste videli pozvane funkcije: +Kada imate **statički povezan binarni fajl**, sve funkcije će pripadati binarnom fajlu (a ne spoljnim bibliotekama). U ovom slučaju će biti teško **identifikovati tok koji binarni fajl prati kako bi na primer zatražio korisnički unos**.\ +Ovaj tok možete lako identifikovati **pokretanjem** binarnog fajla sa **gdb** sve dok vas ne zatraže unos. Zatim ga zaustavite sa **CTRL+C** i koristite komandu **`bt`** (**backtrace**) da vidite pozvane funkcije: ``` gef➤ bt #0 0x00000000004498ae in ?? () @@ -169,34 +148,34 @@ gef➤ bt #3 0x00000000004011a9 in ?? () #4 0x0000000000400a5a in ?? () ``` -## GDB server +### GDB server `gdbserver --multi 0.0.0.0:23947` (u IDA morate popuniti apsolutnu putanju izvršnog fajla na Linux mašini i na Windows mašini) -# Ghidra +## Ghidra -## Pronalaženje offseta steka +### Pronalaženje offseta steka -**Ghidra** je veoma korisna za pronalaženje **offseta** za **preplavljivanje bafera zahvaljujući informacijama o poziciji lokalnih promenljivih.**\ -Na primer, u primeru ispod, preplavljivanje bafera u `local_bc` ukazuje da vam je potreban offset od `0xbc`. Osim toga, ako je `local_10` kolačić kanara, to ukazuje da postoji offset od `0xac` za prepisivanje iz `local_bc`.\ -_Zapamtite da prva 0x08 odakle se RIP čuva pripada RBP-u._ +**Ghidra** je veoma koristan za pronalaženje **offseta** za **preplavljivanje bafera zahvaljujući informacijama o poziciji lokalnih promenljivih.**\ +Na primer, u primeru ispod, preplavljivanje bafera u `local_bc` ukazuje da je potreban offset od `0xbc`. Osim toga, ako je `local_10` kolačić kanarina, to ukazuje da je potreban offset od `0xac` da bi se prepisao iz `local_bc`.\ +_Zapamtite da prvih 0x08 gde je RIP sačuvan pripada RBP._ ![](<../../.gitbook/assets/image (616).png>) -# GCC +## GCC **gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Kompajliranje bez zaštite\ **-o** --> Izlaz\ **-g** --> Sačuvaj kod (GDB će moći da ga vidi)\ -**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Deaktiviranje ASLR-a u Linuxu +**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Deaktiviranje ASLR u Linuxu **Za kompajliranje shell koda:**\ **nasm -f elf assembly.asm** --> vraća ".o"\ -**ld assembly.o -o shellcodeout** --> Izvršni fajl +**ld assembly.o -o shellcodeout** --> Izvršno -# Objdump +## Objdump -**-d** --> **Razmontiraj izvršne** sekcije (vidi opkode kompajliranog shell koda, pronađi ROP Gadžete, pronađi adresu funkcije...)\ +**-d** --> **Razmontiraj izvršne** sekcije (vidi op-kodove kompajliranog shell koda, pronađi ROP Gadžete, pronađi adresu funkcije...)\ **-Mintel** --> **Intel** sintaksa\ **-t** --> **Tabela simbola**\ **-D** --> **Razmontiraj sve** (adresa statičke promenljive)\ @@ -204,35 +183,35 @@ _Zapamtite da prva 0x08 odakle se RIP čuva pripada RBP-u._ **-s -j .got** --> got sekcija\ \-D -s -j .plt --> **plt** sekcija **dekompilirana**\ **-TR** --> **Relokacije**\ -**ojdump -t --dynamic-relo ./exec | grep puts** --> Adresa "puts" za izmenu u GOT-u\ -**objdump -D ./exec | grep "VAR\_NAME"** --> Adresa ili statičke promenljive (one se čuvaju u DATA sekciji). +**ojdump -t --dynamic-relo ./exec | grep puts** --> Adresa "puts" za modifikaciju u GOT\ +**objdump -D ./exec | grep "VAR\_NAME"** --> Adresa statičke promenljive (one su smeštene u DATA sekciji). -# Core dumpovi +## Core dumps 1. Pokrenite `ulimit -c unlimited` pre pokretanja mog programa 2. Pokrenite `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` 3. sudo gdb --core=\ --quiet -# Više +## Više **ldd executable | grep libc.so.6** --> Adresa (ako je ASLR, onda se menja svaki put)\ -**for i in \`seq 0 20\`; do ldd \ | grep libc; done** --> Petlja za proveru da li se adresa mnogo menja\ -**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Offset "system" funkcije\ +**for i in \`seq 0 20\`; do ldd \ | grep libc; done** --> Petlja za proveru da li se adresa često menja\ +**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Offset "system"\ **strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> Offset "/bin/sh" **strace executable** --> Funkcije pozvane od strane izvršnog fajla\ **rabin2 -i ejecutable -->** Adresa svih funkcija -# **Inmunity debugger** +## **Inmunity debugger** ```bash !mona modules #Get protections, look for all false except last one (Dll of SO) !mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP) ``` -# IDA +## IDA -## Debagovanje na udaljenom Linuxu +### Debagovanje na udaljenom Linuxu -Unutar IDA foldera možete pronaći binarne datoteke koje se mogu koristiti za debagovanje binarnih datoteka na Linuxu. Da biste to uradili, premestite binarnu datoteku _linux\_server_ ili _linux\_server64_ na Linux server i pokrenite je unutar foldera koji sadrži binarnu datoteku: +Unutar IDA foldera možete pronaći binarne datoteke koje se mogu koristiti za debagovanje binarne datoteke unutar Linuxa. Da biste to uradili, premestite binarnu datoteku _linux\_server_ ili _linux\_server64_ unutar Linux servera i pokrenite je unutar foldera koji sadrži binarnu datoteku: ``` ./linux_server64 -Ppass ``` @@ -240,17 +219,16 @@ Zatim, konfigurišite debager: Debager (udaljeni Linux) --> Opcije procesa...: ![](<../../.gitbook/assets/image (101).png>) -
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! Drugi načini podrške HackTricks-u: -* Ako želite da vidite **vašu kompaniju oglašenu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)! -* Nabavite [**zvanični PEASS & HackTricks suveniri**](https://peass.creator-spring.com) -* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) -* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.** +* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)! +* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com) +* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) +* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
diff --git a/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md b/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md index eceafe28e..8f5188f6e 100644 --- a/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md +++ b/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md @@ -1,4 +1,4 @@ -# macOS Aplikacije - Inspekcija, debagovanje i Faziranje +# macOS Aplikacije - Inspekcija, debugovanje i Faziranje
@@ -6,15 +6,15 @@ Drugi načini podrške HackTricks-u: -* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! +* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) -* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** +* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
-## Statička Analiza +## Statistička Analiza ### otool ```bash @@ -32,11 +32,9 @@ 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 -Ovaj alat se može koristiti kao **zamena** za **codesign**, **otool** i **objdump**, i pruža nekoliko dodatnih funkcija. [**Preuzmite ga ovde**](http://www.newosxbook.com/tools/jtool.html) ili ga instalirajte pomoću `brew` komande. +Ovaj alat može se koristiti kao **zamena** za **codesign**, **otool**, i **objdump**, i pruža nekoliko dodatnih funkcija. [**Preuzmite ga ovde**](http://www.newosxbook.com/tools/jtool.html) ili ga instalirajte pomoću `brew`. ```bash # Install brew install --cask jtool2 @@ -53,10 +51,10 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom # Get MIG information jtool2 -d __DATA.__const myipc_server | grep MIG ``` -### Codesign / ldid +### Potpisivanje koda / ldid {% hint style="danger" %} -**`Codesign`** se može pronaći u **macOS-u**, dok se **`ldid`** može pronaći u **iOS-u**. +**`Codesign`** se može pronaći u **macOS-u**, dok se **`ldid`** može pronaći u **iOS-u** {% endhint %} ```bash # Get signer @@ -86,28 +84,28 @@ ldid -S/tmp/entl.xml ``` ### SuspiciousPackage -[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) je alat koji je koristan za inspekciju **.pkg** fajlova (instalera) i pregled sadržaja pre nego što se instalira.\ -Ovi instalateri imaju `preinstall` i `postinstall` bash skripte koje autori malvera obično zloupotrebljavaju kako bi **trajno** **instalirali** **malver**. +[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) je alat koristan za inspekciju **.pkg** fajlova (instalatera) i videti šta se nalazi unutra pre instalacije.\ +Ovi instalateri imaju `preinstall` i `postinstall` bash skripte koje zlonamerni autori obično zloupotrebljavaju da bi **upornost** **malvera**. ### hdiutil -Ovaj alat omogućava **montiranje** Apple disk slika (**.dmg**) fajlova kako bi se pregledali pre pokretanja bilo čega: +Ovaj alat omogućava **montiranje** Apple disk slika (**.dmg**) fajlova radi njihove inspekcije pre pokretanja bilo čega: ```bash hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg ``` -Biće montirano u `/Volumes` +Biće montiran u `/Volumes` ### Objective-C #### Metapodaci {% hint style="danger" %} -Imajte na umu da programi napisani u Objective-C **zadržavaju** svoje deklaracije klasa **kada** **kompiliraju** u [Mach-O binarne datoteke](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Takve deklaracije klasa **uključuju** ime i tip: +Imajte na umu da programi napisani u Objective-C **zadržavaju** svoje deklaracije klasa **kada** **se kompajliraju** u [Mach-O binarne datoteke](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Takve deklaracije klasa **uključuju** ime i tip: {% endhint %} -* Klasa +* Klasu * Metode klase -* Instancne varijable klase +* Instance varijable klase Ove informacije možete dobiti koristeći [**class-dump**](https://github.com/nygard/class-dump): ```bash @@ -115,31 +113,39 @@ class-dump Kindle.app ``` #### Pozivanje funkcija -Kada se funkcija poziva u binarnom fajlu koji koristi Objective-C, kompajlirani kod umesto pozivanja te funkcije, poziva **`objc_msgSend`**. Ova funkcija zatim poziva konačnu funkciju: +Kada se funkcija pozove u binarnom fajlu koji koristi Objective-C, kompajlirani kod umesto pozivanja te funkcije, pozvaće **`objc_msgSend`**. Što će pozvati konačnu funkciju: ![](<../../../.gitbook/assets/image (560).png>) Parametri koje ova funkcija očekuje su: -* Prvi parametar (**self**) je "pokazivač koji pokazuje na **instancu klase koja treba da primi poruku**". Jednostavnije rečeno, to je objekat nad kojim se poziva metoda. Ako je metoda klasna metoda, ovo će biti instanca objekta klase (u celini), dok će za instancnu metodu, self pokazivati na instanciranu instancu klase kao objekat. -* Drugi parametar (**op**) je "selektor metode koja obrađuje poruku". Ponovo, jednostavnije rečeno, ovo je samo **ime metode**. -* Preostali parametri su bilo **koje vrednosti koje su potrebne metodi** (op). +- Prvi parametar (**self**) je "pokazivač koji pokazuje na **instancu klase koja treba da primi poruku**". Jednostavnije rečeno, to je objekat na koji se metod poziva. Ako je metod klasni metod, ovo će biti instanca objekta klase (u celini), dok će za instancu metoda, self pokazivati na instanciranu instancu klase kao objekat. +- Drugi parametar, (**op**), je "selektor metoda koji obrađuje poruku". Ponovo, jednostavnije rečeno, ovo je samo **ime metoda**. +- Preostali parametri su bilo **vrednosti koje su potrebne metodu** (op). -| **Argument** | **Registar** | **(za) objc\_msgSend** | -| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ | -| **1. argument** | **rdi** | **self: objekat nad kojim se poziva metoda** | -| **2. argument** | **rsi** | **op: ime metode** | -| **3. argument** | **rdx** | **1. argument metode** | -| **4. argument** | **rcx** | **2. argument metode** | -| **5. argument** | **r8** | **3. argument metode** | -| **6. argument** | **r9** | **4. argument metode** | -| **7.+ argument** |

rsp+
(na steku)

| **5.+ argument metode** | +Pogledajte kako **lako dobiti ove informacije sa `lldb` u ARM64** na ovoj stranici: + +{% content-ref url="arm64-basic-assembly.md" %} +[arm64-basic-assembly.md](arm64-basic-assembly.md) +{% endcontent-ref %} + +x64: + +| **Argument** | **Registar** | **(za) objc\_msgSend** | +| ----------------- | -------------------------------------------------------------- | ----------------------------------------------------- | +| **1. argument** | **rdi** | **self: objekat na koji se metod poziva** | +| **2. argument** | **rsi** | **op: ime metoda** | +| **3. argument** | **rdx** | **1. argument metodu** | +| **4. argument** | **rcx** | **2. argument metodu** | +| **5. argument** | **r8** | **3. argument metodu** | +| **6. argument** | **r9** | **4. argument metodu** | +| **7.+ argument** |

rsp+
(na steku)

| **5.+ argument metodu** | ### Swift -Sa Swift binarnim fajlovima, s obzirom da postoji kompatibilnost sa Objective-C, ponekad možete izvući deklaracije koristeći [class-dump](https://github.com/nygard/class-dump/), ali ne uvek. +Sa Swift binarnim fajlovima, s obzirom da postoji kompatibilnost sa Objective-C, ponekad možete izvući deklaracije koristeći [class-dump](https://github.com/nygard/class-dump/) ali ne uvek. -Pomoću komandne linije **`jtool -l`** ili **`otool -l`** moguće je pronaći nekoliko sekcija koje počinju sa prefiksom **`__swift5`**. +Pomoću komandne linije **`jtool -l`** ili **`otool -l`** moguće je pronaći nekoliko sekcija koje počinju sa prefiksom **`__swift5`**: ```bash jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO @@ -151,9 +157,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture [...] ``` -Možete pronaći dodatne informacije o **informacijama koje se čuvaju u ovim sekcijama u ovom blog postu**. +Možete pronaći dodatne informacije o **informacijama koje se čuvaju u ovim odeljcima u ovom blog postu**. -Osim toga, **Swift binarni fajlovi mogu imati simbole** (na primer, biblioteke moraju čuvati simbole kako bi se funkcije mogle pozvati). **Simboli obično sadrže informacije o imenu funkcije** i atributima na ružan način, pa su vrlo korisni i postoje "**demangleri**" koji mogu dobiti originalno ime: +Štaviše, **Swift binarni fajlovi mogu imati simbole** (na primer, biblioteke moraju čuvati simbole kako bi se funkcije mogle pozvati). **Simboli obično sadrže informacije o imenu funkcije** i atributima na ružan način, pa su veoma korisni, i postoje "**demangleri**" koji mogu dobiti originalno ime: ```bash # Ghidra plugin https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py @@ -163,58 +169,58 @@ swift demangle ``` ### Pakovani binarnih fajlova -* Proverite visoku entropiju -* Proverite stringove (ako nema razumljivih stringova, pakovan je) -* UPX paket za MacOS generise sekciju nazvanu "\_\_XHDR" +* Provera visoke entropije +* Provera stringova (da li postoji skoro nijedan razumljiv string, pakovan) +* UPX paket za MacOS generiše sekciju nazvanu "\_\_XHDR" -## Dinamicka analiza +## Dinamička analiza {% hint style="warning" %} -Napomena da bi se debagovale binarne datoteke, **SIP mora biti onemogucen** (`csrutil disable` ili `csrutil enable --without debug`) ili kopirati binarne datoteke u privremeni folder i **ukloniti potpis** sa `codesign --remove-signature ` ili dozvoliti debagovanje binarnog fajla (mozete koristiti [ovaj skript](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)) +Imajte na umu da bi za debagovanje binarnih fajlova, **SIP treba da bude onemogućen** (`csrutil disable` ili `csrutil enable --without debug`) ili da kopirate binarne fajlove u privremenu fasciklu i **uklonite potpis** sa `codesign --remove-signature ` ili dozvolite debagovanje binarnog fajla (možete koristiti [ovaj skript](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)) {% endhint %} {% hint style="warning" %} -Napomena da bi se **instrumentirale sistemski binarni fajlovi** (kao sto je `cloudconfigurationd`) na macOS-u, **SIP mora biti onemogucen** (samo uklanjanje potpisa nece raditi). +Imajte na umu da bi za **instrumentiranje sistemskih binarnih fajlova** (kao što je `cloudconfigurationd`) na macOS-u, **SIP mora biti onemogućen** (samo uklanjanje potpisa neće raditi). {% endhint %} ### Unified Logs -MacOS generise mnogo logova koji mogu biti veoma korisni prilikom pokretanja aplikacije i pokusaja razumevanja **sta radi**. +MacOS generiše mnogo logova koji mogu biti veoma korisni prilikom pokretanja aplikacije pokušavajući da razumete **šta radi**. -Osim toga, postoje neki logovi koji ce sadrzati oznaku `` da bi **sakrili** neke **identifikacione informacije** korisnika ili racunara. Medjutim, moguce je **instalirati sertifikat da bi se ove informacije otkrile**. Pratite objasnjenja sa [**ovde**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log). +Osim toga, postoje neki logovi koji će sadržati oznaku `` da bi **sakrili** neke **identifikacione** informacije **korisnika** ili **računara**. Međutim, moguće je **instalirati sertifikat da biste otkrili ove informacije**. Pratite objašnjenja sa [**ovde**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log). ### Hopper #### Leva tabla -U levoj tabli hoppera mogu se videti simboli (**Oznake**) binarnog fajla, lista procedura i funkcija (**Proc**) i stringovi (**Str**). To nisu svi stringovi, vec oni definisani u nekoliko delova Mac-O fajla (kao sto su _cstring ili `objc_methname`). +Na levoj tabli Hoppera mogu se videti simboli (**Oznake**) binarnog fajla, lista procedura i funkcija (**Proc**) i stringovi (**Str**). To nisu svi stringovi, već oni definisani u nekoliko delova Mac-O fajla (kao što su _cstring ili_ `objc_methname`). #### Srednja tabla -U srednjoj tabli mozete videti **rasclanjenu kod**. I mozete ga videti kao **sirovi** disasembl, kao **graf**, kao **dekompajlirani** i kao **binarni** klikom na odgovarajucu ikonu: +Na srednjoj tabli možete videti **dizasemblovani kod**. I možete ga videti kao **sirov** disasemblovani kod, kao **graf**, kao **dekompilirani** i kao **binarni** klikom na odgovarajuću ikonu:
-Desnim klikom na kodni objekat mozete videti **reference ka/tom objektu** ili cak promeniti njegovo ime (ovo ne radi u dekompajliranom pseudokodu): +Desnim klikom na objekat koda možete videti **reference ka/tom objektu** ili čak promeniti njegovo ime (ovo ne funkcioniše u dekompiliranom pseudokodu):
-Osim toga, u **sredini dole mozete pisati python komande**. +Osim toga, u **sredini dole možete pisati Python komande**. #### Desna tabla -U desnoj tabli mozete videti interesantne informacije kao sto su **istorija navigacije** (tako da znate kako ste dosli do trenutne situacije), **graf poziva** gde mozete videti sve **funkcije koje pozivaju ovu funkciju** i sve funkcije koje **ova funkcija poziva**, i informacije o **lokalnim varijablama**. +Na desnoj tabli možete videti zanimljive informacije kao što su **istorija navigacije** (da znate kako ste stigli do trenutne situacije), **pozivni grafikon** gde možete videti sve **funkcije koje pozivaju ovu funkciju** i sve funkcije koje **ova funkcija poziva**, i informacije o **lokalnim promenljivima**. ### dtrace -Omogucava korisnicima pristup aplikacijama na izuzetno **niskom nivou** i pruza nacin korisnicima da **prate** **programe** i cak promene njihov tok izvrsavanja. Dtrace koristi **probe** koje su **postavljene u celom kernelu** i nalaze se na mestima kao sto su pocetak i kraj sistemskih poziva. +Omogućava korisnicima pristup aplikacijama na izuzetno **niskom nivou** i pruža način korisnicima da **prate** **programe** i čak promene njihov tok izvršavanja. Dtrace koristi **sonde** koje su **postavljene širom jezgra** i nalaze se na lokacijama poput početka i kraja sistemskih poziva. -DTrace koristi funkciju **`dtrace_probe_create`** za kreiranje sonde za svaki sistemski poziv. Ove sonde mogu biti aktivirane na **ulaznoj i izlaznoj tacki svakog sistemskog poziva**. Interakcija sa DTrace se odvija preko /dev/dtrace koji je dostupan samo root korisniku. +DTrace koristi funkciju **`dtrace_probe_create`** za kreiranje sonde za svaki sistemski poziv. Ove sonde mogu biti aktivirane na **ulaznoj i izlaznoj tački svakog sistemskog poziva**. Interakcija sa DTrace-om se odvija preko /dev/dtrace koji je dostupan samo root korisniku. {% hint style="success" %} -Da biste omogucili Dtrace bez potpune onemogucenosti SIP zastite, mozete izvrsiti na recovery modu: `csrutil enable --without dtrace` +Da biste omogućili Dtrace bez potpune onemogućenosti SIP zaštite, možete izvršiti u režimu oporavka: `csrutil enable --without dtrace` -Takodje mozete koristiti **`dtrace`** ili **`dtruss`** binarne fajlove koje **ste kompajlirali**. +Takođe možete **`dtrace`** ili **`dtruss`** binarne fajlove koje **ste kompajlirali**. {% endhint %} Dostupne sonde dtrace-a mogu se dobiti sa: @@ -227,9 +233,9 @@ ID PROVIDER MODULE FUNCTION NAME 43 profile profile-97 44 profile profile-199 ``` -Ime sonde se sastoji od četiri dela: pružalac, modul, funkcija i ime (`fbt:mach_kernel:ptrace:entry`). Ako ne navedete neki deo imena, Dtrace će ga primeniti kao džoker. +Ime sonde se sastoji od četiri dela: pružalac, modul, funkcija i ime (`fbt:mach_kernel:ptrace:entry`). Ako ne navedete neki deo imena, Dtrace će taj deo primeniti kao zamenski znak. -Da biste konfigurisali DTrace da aktivira sonde i da odredite koje radnje treba izvršiti kada se aktiviraju, moraćemo koristiti D jezik. +Da biste konfigurisali DTrace da aktivira sonde i specificira koje akcije treba izvršiti kada se aktiviraju, moraćemo koristiti D jezik. Detaljnije objašnjenje i više primera možete pronaći na [https://illumos.org/books/dtrace/chp-intro.html](https://illumos.org/books/dtrace/chp-intro.html) @@ -237,53 +243,12 @@ Detaljnije objašnjenje i više primera možete pronaći na [https://illumos.org Pokrenite `man -k dtrace` da biste videli **dostupne DTrace skripte**. Primer: `sudo dtruss -n binary` -* Na liniji +* U liniji ```bash #Count the number of syscalls of each running process sudo dtrace -n 'syscall:::entry {@[execname] = count()}' ``` -# Inspekcija, debagovanje i faziiranje macOS aplikacija - -Ovaj direktorijum sadrži informacije i tehnike koje se odnose na inspekciju, debagovanje i faziiranje macOS aplikacija. - -## Inspekcija aplikacija - -### Osnovne informacije o aplikaciji - -Da biste dobili osnovne informacije o macOS aplikaciji, možete koristiti sledeće alate: - -- `codesign`: Koristi se za proveru digitalnog potpisa aplikacije. -- `otool`: Omogućava pregled informacija o objektima u izvršnom fajlu aplikacije. -- `spctl`: Koristi se za proveru potpisa aplikacije i njenog porekla. - -### Analiza aplikacije - -Za detaljniju analizu macOS aplikacija, možete koristiti sledeće alate: - -- `class-dump`: Omogućava izdvajanje deklaracija klasa iz izvršnog fajla aplikacije. -- `Hopper Disassembler`: Napredni disasembler koji vam omogućava da analizirate izvršni fajl aplikacije. -- `IDA Pro`: Profesionalni disasembler i debager koji vam omogućava da analizirate izvršni fajl aplikacije. - -## Debagovanje aplikacija - -Da biste debagovali macOS aplikaciju, možete koristiti sledeće alate: - -- `lldb`: Debager koji je ugrađen u Xcode i omogućava vam da debagovali izvršni fajl aplikacije. -- `gdb`: Univerzalni debager koji može biti korišćen za debagovanje izvršnih fajlova aplikacija. - -## Faziiranje aplikacija - -Faziiranje aplikacija je proces testiranja aplikacija na greške i ranjivosti. Za faziiranje macOS aplikacija, možete koristiti sledeće alate: - -- `AFL`: Fuzzer koji koristi tehnike generisanja mutacija za pronalaženje grešaka u aplikacijama. -- `honggfuzz`: Efikasan fuzzer koji koristi tehnike generisanja mutacija i heuristike za pronalaženje grešaka u aplikacijama. - -## Dodatni resursi - -Ovde možete pronaći dodatne resurse i informacije o inspekciji, debagovanju i faziiranju macOS aplikacija: - -- [macOS Security and Privacy Guide](https://github.com/drduh/macOS-Security-and-Privacy-Guide): Vodič koji pruža informacije o bezbednosti i privatnosti na macOS platformi. -- [Awesome Mac Security](https://github.com/drduh/awesome-mac-security): Lista resursa i alata za macOS bezbednost. +* skripta ```bash syscall:::entry /pid == $1/ @@ -322,94 +287,78 @@ printf("=%d\n", arg1); sudo dtrace -s syscalls_info.d -c "cat /etc/hosts" ``` ### dtruss - -`dtruss` je alatka koja se koristi za inspekciju i debagovanje aplikacija na macOS operativnom sistemu. Ova alatka pruža mogućnost praćenja sistema poziva (system calls) koje aplikacija izvršava tokom svog izvršavanja. - -Korišćenje `dtruss` alatke omogućava vam da pratite i analizirate interakciju između aplikacije i operativnog sistema. Možete videti koje sistemske pozive aplikacija koristi, kao i argumente koje šalje tim pozivima. Ovo može biti korisno za pronalaženje grešaka, otkrivanje sigurnosnih propusta ili razumevanje kako aplikacija funkcioniše. - -Da biste koristili `dtruss`, jednostavno pokrenite komandu `dtruss` sa putanjom do izvršne datoteke aplikacije koju želite da pratite. Alatka će zatim prikazati sve sistemske pozive koje aplikacija izvršava, zajedno sa njihovim argumentima i povratnim vrednostima. - -Na primer, možete pokrenuti sledeću komandu da biste pratili sistemske pozive aplikacije `myapp`: - -``` -dtruss /putanja/do/myapp -``` - -Ovo će prikazati sve sistemske pozive koje `myapp` izvršava tokom svog izvršavanja. Možete koristiti ove informacije za analizu i debagovanje aplikacije, kao i za pronalaženje potencijalnih sigurnosnih propusta. - -Važno je napomenuti da `dtruss` zahteva privilegije root korisnika kako bi pratio sistemske pozive drugih aplikacija. Takođe, budite oprezni prilikom korišćenja ove alatke, jer nepravilna upotreba može dovesti do nestabilnosti sistema ili ometanja normalnog rada aplikacija. ```bash dtruss -c ls #Get syscalls of ls dtruss -c -p 1000 #get syscalls of PID 1000 ``` ### ktrace -Možete koristiti ovu metodu čak i kada je **SIP aktiviran**. +Možete koristiti ovu čak i kada je **SIP aktiviran** ```bash ktrace trace -s -S -t c -c ls | grep "ls(" ``` ### ProcessMonitor -[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) je veoma koristan alat za proveru akcija koje proces izvršava (na primer, praćenje novih procesa koje proces kreira). +[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) je veoma koristan alat za proveru akcija povezanih sa procesom koje proces obavlja (na primer, praćenje novih procesa koje proces kreira). ### SpriteTree [**SpriteTree**](https://themittenmac.com/tools/) je alat koji prikazuje odnose između procesa.\ -Treba da pratite vaš Mac pomoću komande kao što je **`sudo eslogger fork exec rename create > cap.json`** (terminal koji pokreće ovu komandu zahteva FDA). Zatim možete učitati json datoteku u ovaj alat da biste videli sve odnose: +Potrebno je pratiti vaš Mac pomoću komande poput **`sudo eslogger fork exec rename create > cap.json`** (terminal koji pokreće ovo zahteva FDA). Zatim možete učitati json datoteku u ovaj alat da biste videli sve odnose:
### FileMonitor -[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) omogućava praćenje događaja vezanih za datoteke (kao što su kreiranje, izmene i brisanje), pružajući detaljne informacije o tim događajima. +[**FileMonitor**](https://objective-see.com/products/utilities.html#FileMonitor) omogućava praćenje događaja sa datotekama (kao što su kreiranje, izmene i brisanje), pružajući detaljne informacije o takvim događajima. ### Crescendo -[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) je GUI alat koji korisnicima Windows-a može biti poznat po izgledu i osećaju Microsoft Sysinternal's _Procmon_. Ovaj alat omogućava pokretanje i zaustavljanje snimanja različitih vrsta događaja, filtriranje tih događaja po kategorijama kao što su datoteka, proces, mreža itd., i pruža funkcionalnost za čuvanje snimljenih događaja u json formatu. +[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) je GUI alat sa izgledom koji korisnici Windowsa mogu prepoznati iz Microsoft Sysinternal-ovog _Procmon_-a. Ovaj alat omogućava pokretanje i zaustavljanje snimanja različitih vrsta događaja, omogućava filtriranje ovih događaja po kategorijama kao što su datoteka, proces, mreža, itd., i pruža funkcionalnost za čuvanje snimljenih događaja u json formatu. ### Apple Instruments -[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) su deo Xcode-ovih razvojnih alata - koriste se za praćenje performansi aplikacija, identifikaciju curenja memorije i praćenje aktivnosti na fajl sistemu. +[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) su deo Xcode-ovih Developer alata - koriste se za praćenje performansi aplikacija, identifikaciju curenja memorije i praćenje aktivnosti sistema datoteka. ![](<../../../.gitbook/assets/image (15).png>) ### fs\_usage -Omogućava praćenje akcija koje procesi izvršavaju: +Omogućava praćenje akcija koje obavljaju procesi: ```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) je koristan alat za pregledanje **biblioteka** koje koristi binarna datoteka, **datoteke** koje koristi i **mrežne** veze koje uspostavlja.\ -Takođe proverava binarne procese na **virustotalu** i prikazuje informacije o binarnoj datoteci. +[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) je koristan alat za pregled **biblioteka** koje koristi binarni fajl, **datoteke** koje koristi i **mrežne** veze.\ +Takođe proverava binarne procese protiv **virustotala** i prikazuje informacije o binarnom fajlu. ## PT\_DENY\_ATTACH -U [**ovom blog postu**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) možete pronaći primer kako **debugovati pokrenuti daemon** koji koristi **`PT_DENY_ATTACH`** da bi sprečio debugovanje čak i ako je SIP onemogućen. +U [**ovom blog postu**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html) možete pronaći primer kako **debugovati pokrenuti daemon** koji koristi **`PT_DENY_ATTACH`** kako bi sprečio debugovanje čak i ako je SIP onemogućen. ### lldb -**lldb** je de **facto alat** za **debugovanje** binarnih datoteka na macOS-u. +**lldb** je glavni alat za **debugovanje** binarnih fajlova na **macOS** platformi. ```bash lldb ./malware.bin lldb -p 1122 lldb -n malware.bin lldb -n malware.bin --waitfor ``` -Možete postaviti Intel stil kada koristite lldb tako što ćete kreirati datoteku nazvanu **`.lldbinit`** u vašem matičnom folderu sa sledećom linijom: +Možete postaviti intel ukus prilikom korišćenja lldb-a kreiranjem datoteke nazvane **`.lldbinit`** u vašem matičnom folderu sa sledećom linijom: ```bash settings set target.x86-disassembly-flavor intel ``` {% hint style="warning" %} -Unutar lldb-a, izvršite dump procesa pomoću `process save-core` +Unutar lldb-a, dumpuj proces sa `process save-core` {% endhint %} -
(lldb) KomandaOpis
run (r)Pokretanje izvršavanja, koje će se nastaviti dok se ne naiđe na prekidnu tačku ili dok se proces ne završi.
continue (c)Nastavak izvršavanja procesa u debug modu.
nexti (n / ni)Izvršava sledeću instrukciju. Ova komanda će preskočiti pozive funkcija.
stepi (s / si)Izvršava sledeću instrukciju. Za razliku od komande nexti, ova komanda će ući u pozive funkcija.
finish (f)Izvršava preostale instrukcije u trenutnoj funkciji ("okviru") i zaustavlja se.
control + cPauzira izvršavanje. Ako je proces pokrenut (r) ili nastavljen (c), ovo će uzrokovati zaustavljanje procesa ... gde god se trenutno izvršava.
breakpoint (b)

b main #Bilo koja funkcija koja se zove main

b <ime_binarnog_fajla>`main #Main funkcija binarnog fajla

b set -n main --shlib <ime_biblioteke> #Main funkcija određenog binarnog fajla

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l #Lista prekidnih tačaka

br e/dis <broj> #Omogući/Onemogući prekidnu tačku

breakpoint delete <broj>

help

help breakpoint #Dobijanje pomoći za komandu breakpoint

help memory write #Dobijanje pomoći za pisanje u memoriju

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <adresa_registra/memorije>Prikazuje memoriju kao string sa nulama na kraju.
x/i <adresa_registra/memorije>Prikazuje memoriju kao asemblersku instrukciju.
x/b <adresa_registra/memorije>Prikazuje memoriju kao bajt.
print object (po)

Ovo će ispisati objekat na koji se parametar odnosi

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Napomena: Većina Apple-ovih Objective-C API-ja ili metoda vraća objekte i treba ih prikazati putem "print object" (po) komande. Ako po ne daje smislene rezultate, koristite x/b

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #Upisuje AAAA na tu adresu
memory write -f s $rip+0x11f+7 "AAAA" #Upisuje AAAA na tu adresu
disassembly

dis #Disasembler trenutne funkcije

dis -n <ime_funkcije> #Disasembler funkcije

dis -n <ime_funkcije> -b <ime_binarnog_fajla> #Disasembler funkcije
dis -c 6 #Disasembler 6 linija
dis -c 0x100003764 -e 0x100003768 #Od jedne adrese do druge
dis -p -c 4 #Počinje od trenutne adrese disasemblera

parrayparray 3 (char **)$x1 #Proverava niz od 3 komponente u registru x1
+
(lldb) KomandaOpis
run (r)Pokretanje izvršenja, koje će se nastaviti dok se ne naiđe na prekid ili dok se proces ne završi.
continue (c)Nastavak izvršenja debugovanog procesa.
nexti (n / ni)Izvršava sledeću instrukciju. Ova komanda će preskočiti pozive funkcija.
stepi (s / si)Izvršava sledeću instrukciju. Za razliku od nexti komande, ova komanda će ući u pozive funkcija.
finish (f)Izvršava preostale instrukcije u trenutnoj funkciji ("frame") i zaustavlja se.
control + cPauzira izvršenje. Ako je proces pokrenut (r) ili nastavljen (c), ovo će uzrokovati zaustavljanje procesa ...gde god se trenutno izvršava.
breakpoint (b)

b main #Bilo koja funkcija nazvana main

b <ime_binarne_datoteke>`main #Glavna funkcija binarne datoteke

b set -n main --shlib <ime_biblioteke> #Glavna funkcija naznačene binarne datoteke

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l #Lista prekida

br e/dis <br> #Omogući/Onemogući prekid

breakpoint delete <br>

help

help breakpoint #Dobijanje pomoći za komandu prekida

help memory write #Dobijanje pomoći za pisanje u memoriju

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/adresa_memorije>Prikazuje memoriju kao string sa null-terminatorom.
x/i <reg/adresa_memorije>Prikazuje memoriju kao asemblersku instrukciju.
x/b <reg/adresa_memorije>Prikazuje memoriju kao bajt.
print object (po)

Ovo će ispisati objekat na koji se parametar odnosi

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Imajte na umu da većina Apple-ovih Objective-C API-ja ili metoda vraća objekte, i stoga bi trebalo da se prikažu putem "print object" (po) komande. Ako po ne proizvodi smislene rezultate, koristite x/b

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #Upisuje AAAA na tu adresu
memory write -f s $rip+0x11f+7 "AAAA" #Upisuje AAAA na adresu
disassembly

dis #Disasembleruje trenutnu funkciju

dis -n <ime_funkcije> #Disasembleruje funkciju

dis -n <ime_funkcije> -b <ime_datoteke> #Disasembleruje funkciju
dis -c 6 #Disasembleruje 6 linija
dis -c 0x100003764 -e 0x100003768 # Od jedne adrese do druge
dis -p -c 4 # Počinje sa trenutnom adresom disasemblerovanja

parrayparray 3 (char **)$x1 # Proverava niz od 3 komponente u x1 registru
{% hint style="info" %} -Prilikom pozivanja funkcije **`objc_sendMsg`**, registar **rsi** sadrži **ime metode** kao string završen sa nulom ("C"). Da biste ispisali ime putem lldb-a, uradite sledeće: +Prilikom pozivanja funkcije **`objc_sendMsg`**, registar **rsi** sadrži **ime metode** kao string sa null-terminatorom ("C"). Da biste ispisali ime putem lldb-a, uradite sledeće: `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"` @@ -423,24 +372,24 @@ Prilikom pozivanja funkcije **`objc_sendMsg`**, registar **rsi** sadrži **ime m #### Detekcija virtuelne mašine -* Komanda **`sysctl hw.model`** vraća "Mac" kada je **host MacOS**, ali nešto drugo kada je virtuelna mašina. -* Igrajući se sa vrednostima **`hw.logicalcpu`** i **`hw.physicalcpu`**, neki malveri pokušavaju da otkriju da li je u pitanju virtuelna mašina. -* Neki malveri takođe mogu **detektovati** da li je mašina **bazirana na VMware-u** na osnovu MAC adrese (00:50:56). -* Takođe je moguće utvrditi da li se proces **debuguje** pomoću jednostavnog koda kao što je: +* Komanda **`sysctl hw.model`** vraća "Mac" kada je **domaćin MacOS**, ali nešto drugo kada je virtuelna mašina. +* Igranje sa vrednostima **`hw.logicalcpu`** i **`hw.physicalcpu`** neki malveri pokušavaju da detektuju da li je u pitanju virtuelna mašina. +* Neki malveri takođe mogu **detektovati** da li je mašina zasnovana na **VMware-u** na osnovu MAC adrese (00:50:56). +* Moguće je otkriti da li se **proces debuguje** jednostavnim kodom poput: * `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proces se debuguje }` -* Može se takođe pozvati sistemski poziv **`ptrace`** sa zastavicom **`PT_DENY_ATTACH`**. Ovo **onemogućava** debageru da se poveže i prati. -* Možete proveriti da li se funkcija **`sysctl`** ili **`ptrace`** **uvozi** (ali malver bi mogao da je uveze dinamički) -* Kao što je navedeno u ovom članku, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\ -“_Poruka Process # exited with **status = 45 (0x0000002d)** obično je jasan znak da je cilj debugovanja koristio **PT\_DENY\_ATTACH**_” -## Fuzziranje +* Takođe se može pozvati sistemski poziv **`ptrace`** sa zastavicom **`PT_DENY_ATTACH`**. Ovo **sprečava** deb**a**ger da se poveže i prati. +* Možete proveriti da li se funkcija **`sysctl`** ili **`ptrace`** **uvozi** (ali malver bi mogao da je dinamički uveze) +* Kao što je navedeno u ovom tekstu, “[Pobeda nad tehnikama protiv-debugovanja: macOS ptrace varijante](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\ +“_Poruka Proces # je završen sa **statusom = 45 (0x0000002d)** obično je znak da je cilj debugovanja koristi **PT\_DENY\_ATTACH**_” +## Fuzzing ### [ReportCrash](https://ss64.com/osx/reportcrash.html) ReportCrash **analizira procese koji se ruše i čuva izveštaj o rušenju na disku**. Izveštaj o rušenju sadrži informacije koje mogu **pomoći programeru da dijagnostikuje** uzrok rušenja.\ -Za aplikacije i druge procese **koji se izvršavaju u kontekstu pokretača specifičnog za korisnika**, ReportCrash se pokreće kao LaunchAgent i čuva izveštaje o rušenju u direktorijumu `~/Library/Logs/DiagnosticReports/` korisnika.\ -Za demone, druge procese **koji se izvršavaju u kontekstu sistema pokretača** i druge privilegovane procese, ReportCrash se pokreće kao LaunchDaemon i čuva izveštaje o rušenju u direktorijumu `/Library/Logs/DiagnosticReports` sistema. +Za aplikacije i druge procese **koji se izvršavaju u kontekstu pokretanja po korisniku**, ReportCrash se izvršava kao LaunchAgent i čuva izveštaje o rušenju u `~/Library/Logs/DiagnosticReports/` korisnika.\ +Za demone, druge procese **koji se izvršavaju u kontekstu pokretanja po sistemu** i druge privilegovane procese, ReportCrash se izvršava kao LaunchDaemon i čuva izveštaje o rušenju u `/Library/Logs/DiagnosticReports` sistema. -Ako vas brine slanje izveštaja o rušenju **Apple-u**, možete ih onemogućiti. U suprotnom, izveštaji o rušenju mogu biti korisni za **utvrđivanje načina na koji je server pao**. +Ako vas brine slanje izveštaja o rušenju **Apple-u**, možete ih onemogućiti. U suprotnom, izveštaji o rušenju mogu biti korisni za **određivanje načina na koji je server pao**. ```bash #To disable crash reporting: launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist @@ -452,15 +401,15 @@ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root. ``` ### Spavanje -Prilikom izvođenja fuziranja na MacOS-u važno je sprečiti Mac da zaspi: +Prilikom faziiranja u MacOS-u važno je sprečiti Mac da zaspi: -* systemsetup -setsleep Never +* systemsetup -setsleep Nikada * pmset, System Preferences * [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake) -#### Prekid SSH veze +#### SSH Prekid -Ako izvodite fuziranje putem SSH veze, važno je osigurati da se sesija ne prekida. Promenite sshd\_config datoteku na sledeći način: +Ako faziirate putem SSH veze važno je osigurati da sesija neće isteći. Promenite sshd\_config datoteku sa: * TCPKeepAlive Yes * ClientAliveInterval 0 @@ -471,15 +420,13 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist ``` ### Interni rukovaoci -**Pogledajte sledeću stranicu** da biste saznali kako možete pronaći koja aplikacija je odgovorna za **obradu određene šeme ili protokola:** +**Proverite sledeću stranicu** da biste saznali kako možete pronaći koja je aplikacija odgovorna za **obradu određene šeme ili protokola:** {% content-ref url="../macos-file-extension-apps.md" %} [macos-file-extension-apps.md](../macos-file-extension-apps.md) {% endcontent-ref %} ### Enumeracija mrežnih procesa - -Ovo je interesantno za pronalaženje procesa koji upravljaju mrežnim podacima: ```bash dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log #wait some time @@ -506,9 +453,11 @@ Radi za CLI alate #### [Litefuzz](https://github.com/sec-tools/litefuzz) -Radi sa macOS GUI alatima. Napomena: neki macOS aplikacije imaju specifične zahteve kao što su jedinstvena imena fajlova, odgovarajuća ekstenzija, potreba za čitanjem fajlova iz sandbox-a (`~/Library/Containers/com.apple.Safari/Data`)... +On "**samo radi"** sa macOS GUI alatima. Imajte na umu da neki macOS aplikacije imaju specifične zahteve kao što su jedinstvena imena datoteka, ispravna ekstenzija, potreba za čitanjem datoteka iz peska (`~/Library/Containers/com.apple.Safari/Data`)... -Primeri: +Neki primeri: + +{% code overflow="wrap" %} ```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 @@ -534,7 +483,7 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash ``` {% endcode %} -### Više informacija o Fuzzing-u na MacOS-u +### Više informacija o Fuzzingu na MacOS-u * [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) @@ -554,10 +503,10 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash Drugi načini podrške HackTricks-u: -* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! +* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) -* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** +* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume. diff --git a/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md b/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md index 192966627..e2183e147 100644 --- a/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md +++ b/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md @@ -16,7 +16,7 @@ Drugi načini podrške HackTricks-u: ## **Nivoi izuzetaka - EL (ARM64v8)** -U arhitekturi ARMv8, nivoi izvršenja, poznati kao Nivoi izuzetaka (ELs), definišu nivo privilegija i mogućnosti izvršnog okruženja. Postoje četiri nivoa izuzetaka, od EL0 do EL3, pri čemu svaki služi različitoj svrsi: +U ARMv8 arhitekturi, nivoi izvršenja, poznati kao Nivoi izuzetaka (ELs), definišu nivo privilegija i mogućnosti izvršnog okruženja. Postoje četiri nivoa izuzetaka, od EL0 do EL3, pri čemu svaki služi različitoj svrsi: 1. **EL0 - Korisnički režim**: * Ovo je nivo sa najmanje privilegija i koristi se za izvršavanje redovnog aplikativnog koda. @@ -37,43 +37,43 @@ Korišćenje ovih nivoa omogućava strukturisan i siguran način upravljanja raz ARM64 ima **31 registar opšte namene**, označenih kao `x0` do `x30`. Svaki može čuvati vrednost od **64 bita** (8 bajtova). Za operacije koje zahtevaju samo vrednosti od 32 bita, isti registri mogu se pristupiti u režimu od 32 bita koristeći imena w0 do w30. -1. **`x0`** do **`x7`** - Ovi se obično koriste kao registri za prolazak i prosleđivanje parametara podrutinama. +1. **`x0`** do **`x7`** - Ovi se obično koriste kao registri za prolazak parametara podrutinama. * **`x0`** takođe nosi povratne podatke funkcije. -2. **`x8`** - U Linux jezgru, `x8` se koristi kao broj sistema poziva za `svc` instrukciju. **U macOS-u se koristi x16!** +2. **`x8`** - U Linux jezgru, `x8` se koristi kao broj sistema poziva za `svc` instrukciju. **Na macOS-u se koristi x16!** 3. **`x9`** do **`x15`** - Dodatni privremeni registri, često korišćeni za lokalne promenljive. 4. **`x16`** i **`x17`** - **Registri za unutarproceduralne pozive**. Privremeni registri za neposredne vrednosti. Koriste se i za indirektne pozive funkcija i PLT (Procedure Linkage Table) stubove. -* **`x16`** se koristi kao **broj sistema poziva** za **`svc`** instrukciju u **macOS-u**. -5. **`x18`** - **Registar platforme**. Može se koristiti kao registar opšte namene, ali na nekim platformama, ovaj registar je rezervisan za platformno specifične svrhe: Pokazivač na trenutni blok okruženja niti u Windows-u, ili pokazivač na trenutno **izvršnu strukturu zadatka u jezgru Linux-a**. -6. **`x19`** do **`x28`** - Ovo su registri sačuvani za pozvane funkcije. Funkcija mora sačuvati vrednosti ovih registara za svog pozivaoca, tako da se čuvaju na steku i vraćaju pre povratka pozivaocu. +* **`x16`** se koristi kao **broj sistema poziva** za **`svc`** instrukciju na **macOS-u**. +5. **`x18`** - **Registar platforme**. Može se koristiti kao registar opšte namene, ali na nekim platformama je ovaj registar rezervisan za specifične platforme: Pokazivač na trenutni blok okruženja niti u Windows-u, ili pokazivač na trenutno **izvršavajuću strukturu zadatka u jezgru Linux-a**. +6. **`x19`** do **`x28`** - Ovo su registri sačuvani za pozvane funkcije. Funkcija mora sačuvati vrednosti ovih registara za svog pozivaoca, pa se čuvaju na steku i vraćaju pre povratka pozivaocu. 7. **`x29`** - **Pokazivač okvira** za praćenje okvira steka. Kada se kreira novi okvir steka jer je funkcija pozvana, **`x29`** registar se **čuva na steku** i nova adresa okvira (**adresa `sp`**) se **čuva u ovom registru**. * Ovaj registar takođe može se koristiti kao **registar opšte namene**, iako se obično koristi kao referenca na **lokalne promenljive**. 8. **`x30`** ili **`lr`**- **Registar linka**. Čuva **adresu povratka** kada se izvrši `BL` (Branch with Link) ili `BLR` (Branch with Link to Register) instrukcija čuvajući vrednost **`pc`** u ovom registru. * Može se koristiti kao i svaki drugi registar. * Ako trenutna funkcija namerava pozvati novu funkciju i time prepisati `lr`, čuvaće je na steku na početku, ovo je epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Čuvanje `fp` i `lr`, generisanje prostora i dobijanje novog `fp`) i vraćaće je na kraju, ovo je prolog (`ldp x29, x30, [sp], #48; ret` -> Vraćanje `fp` i `lr` i povratak). 9. **`sp`** - **Pokazivač steka**, koristi se za praćenje vrha steka. -* Vrednost **`sp`** uvek treba da bude održavana na bar **kvadrovskom** **poravnanju** ili može doći do greške poravnanja. -10. **`pc`** - **Brojač programa**, koji pokazuje na sledeću instrukciju. Ovaj registar se može ažurirati samo putem generisanja izuzetaka, povratka izuzetaka i skokova. Jedine obične instrukcije koje mogu čitati ovaj registar su instrukcije skoka sa linkom (BL, BLR) za čuvanje adrese **`pc`** u **`lr`** (Registar linka). -11. **`xzr`** - **Registar nula**. Takođe nazvan **`wzr`** u svom obliku registra od **32** bita. Može se koristiti za lako dobijanje vrednosti nula (uobičajena operacija) ili za obavljanje poređenja koristeći **`subs`** kao **`subs XZR, Xn, #10`** čuvajući rezultirajuće podatke nigde (u **`xzr`**). +* Vrednost **`sp`** uvek treba da bude održavana na bar **quadword** **poravnanju** ili može doći do greške poravnanja. +10. **`pc`** - **Brojač programa**, koji pokazuje na sledeću instrukciju. Ovaj registar se može ažurirati samo putem generisanja izuzetaka, povrataka izuzetaka i skokova. Jedine obične instrukcije koje mogu čitati ovaj registar su instrukcije skoka sa linkom (BL, BLR) za čuvanje adrese **`pc`** u **`lr`** (Registar linka). +11. **`xzr`** - **Registar nula**. Takođe nazvan **`wzr`** u svom obliku registra od **32** bita. Može se koristiti za lako dobijanje vrednosti nula (uobičajena operacija) ili za obavljanje poređenja koristeći **`subs`** kao **`subs XZR, Xn, #10`** čuvajući rezultujuće podatke nigde (u **`xzr`**). Registri **`Wn`** su **32-bitna** verzija registra **`Xn`**. ### SIMD i Registri za plutanje sa pokretnim zarezom -Pored toga, postoje još **32 registra dužine od 128 bita** koji se mogu koristiti u optimizovanim operacijama jedne instrukcije sa više podataka (SIMD) i za obavljanje aritmetike sa pokretnim zarezom. Oni se nazivaju Vn registri, iako mogu raditi i u **64**-bitnom, **32**-bitnom, **16**-bitnom i **8**-bitnom režimu, tada se nazivaju **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** i **`Bn`**. -### Registri sistema +Pored toga, postoje još **32 registra dužine 128 bita** koji se mogu koristiti u optimizovanim operacijama jedne instrukcije sa više podataka (SIMD) i za obavljanje aritmetike sa pokretnim zarezom. Oni se nazivaju Vn registri iako mogu raditi i u **64**-bitnom, **32**-bitnom, **16**-bitnom i **8**-bitnom režimu, tada se nazivaju **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** i **`Bn`**. +### Sistemski registri -**Postoje stotine sistema registara**, takođe nazvanih registri specijalne namene (SPR), koji se koriste za **praćenje** i **kontrolu** **ponašanja procesora**.\ +**Postoje stotine sistemskih registara**, takođe nazvanih registri sa posebnom svrhom (SPR), koji se koriste za **praćenje** i **kontrolu** **ponašanja procesora**.\ Mogu se samo čitati ili postavljati korišćenjem posebne instrukcije **`mrs`** i **`msr`**. -Specijalni registri **`TPIDR_EL0`** i **`TPIDDR_EL0`** često se nalaze prilikom reverznog inženjeringa. Sufiks `EL0` označava **minimalni izuzetak** iz kojeg se registar može pristupiti (u ovom slučaju EL0 je redovni nivo izuzetka (privilegija) sa kojim se izvršavaju redovni programi).\ -Često se koriste za čuvanje **bazne adrese regiona memorije lokalne za nit**. Obično je prvi čitljiv i zapisiv za programe koji se izvršavaju u EL0, ali drugi se može čitati iz EL0 i pisati iz EL1 (kao kernel). +Posebni registri **`TPIDR_EL0`** i **`TPIDDR_EL0`** često se nalaze prilikom reverznog inženjeringa. Sufiks `EL0` označava **minimalni izuzetak** iz kojeg se registar može pristupiti (u ovom slučaju EL0 je redovni nivo izuzetka (privilegija) sa kojim se izvršavaju redovni programi).\ +Često se koriste za čuvanje **bazne adrese regiona memorije za lokalno skladištenje niti**. Obično je prvi čitljiv i zapisiv za programe koji se izvršavaju u EL0, ali drugi se može čitati iz EL0 i pisati iz EL1 (kao kernel). -* `mrs x0, TPIDR_EL0 ; Čitanje TPIDR_EL0 u x0` -* `msr TPIDR_EL0, X0 ; Pisanje x0 u TPIDR_EL0` +* `mrs x0, TPIDR_EL0 ; Pročitaj TPIDR_EL0 u x0` +* `msr TPIDR_EL0, X0 ; Zapiši x0 u TPIDR_EL0` ### **PSTATE** -**PSTATE** sadrži nekoliko procesnih komponenti serijalizovanih u operativnom sistemu vidljiv **`SPSR_ELx`** specijalni registar, gde je X **nivo dozvole pokrenutog** izuzetka (ovo omogućava vraćanje stanja procesa kada izuzetak završi).\ +**PSTATE** sadrži nekoliko procesnih komponenti serijalizovanih u operativnom sistemu vidljiv **`SPSR_ELx`** poseban registar, gde je X **nivo dozvole izazvanog** izuzetka (ovo omogućava vraćanje stanja procesa kada izuzetak završi).\ Ovo su pristupačna polja:
@@ -85,7 +85,7 @@ Ovo su pristupačna polja: * **`V`** znači da je operacija dala prekoračenje sa znakom: * Zbir dva pozitivna broja daje negativan rezultat. * Zbir dva negativna broja daje pozitivan rezultat. -* Pri oduzimanju, kada se od manjeg pozitivnog broja oduzme veći negativni broj (ili obrnuto), i rezultat ne može biti predstavljen unutar opsega datog veličinom bita. +* Pri oduzimanju, kada se od manjeg pozitivnog broja oduzme veći negativan broj (ili obrnuto), i rezultat ne može biti predstavljen unutar opsega datog veličinom bita. * Očigledno je da procesor ne zna da li je operacija sa znakom ili ne, pa će proveriti C i V u operacijama i ukazati na prenos ako je bila sa znakom ili bez znaka. {% hint style="warning" %} @@ -94,15 +94,15 @@ Nisu sve instrukcije ažuriraju ove zastave. Neke poput **`CMP`** ili **`TST`** * Trenutna zastava **širine registra (`nRW`)**: Ako zastava ima vrednost 0, program će se izvršavati u AArch64 stanju izvršenja nakon nastavka. * Trenutni **nivo izuzetka** (**`EL`**): Redovan program koji se izvršava u EL0 imaće vrednost 0 -* Zastava za **jedan korak** (**`SS`**): Koristi se od strane debagera za jednokorakovanje postavljanjem SS zastave na 1 unutar **`SPSR_ELx`** putem izuzetka. Program će izvršiti korak i izdati izuzetak jednog koraka. +* Zastava za **jedan korak** (**`SS`**): Koristi se od strane debagera za jednokorakno izvršavanje postavljanjem SS zastave na 1 unutar **`SPSR_ELx`** putem izuzetka. Program će izvršiti korak i izdati izuzetak jednog koraka. * Zastava za **nevažeći izuzetak** (**`IL`**): Koristi se za označavanje kada privilegovani softver izvrši nevažeći prenos nivoa izuzetka, ova zastava se postavlja na 1 i procesor pokreće izuzetak nevažećeg stanja. * Zastave **`DAIF`**: Ove zastave omogućavaju privilegovanom programu selektivno maskiranje određenih spoljnih izuzetaka. -* Ako je **`A`** 1 to znači da će biti pokrenuti **asinhroni prekidi**. **`I`** konfiguriše odgovor na spoljne hardverske **zahteve za prekidom** (IRQ), a F je povezano sa **brzim zahtevima za prekidom** (FIR). -* Zastave za **izbor pokazivača steka (`SPS`)**: Privilegovani programi koji se izvršavaju u EL1 i više mogu da prebacuju između korišćenja svog sopstvenog registra pokazivača steka i korisničkog modela (npr. između `SP_EL1` i `EL0`). Ovo prebacivanje se vrši upisivanjem u specijalni registar **`SPSel`**. Ovo se ne može uraditi iz EL0. +* Ako je **`A`** 1 to znači da će biti pokrenuti **asinhroni prekidi**. **`I`** konfiguriše odgovor na spoljne hardverske **zahteve za prekidima** (IRQs). i F je povezan sa **brzim zahtevima za prekidima** (FIRs). +* Zastave za **izbor pokazivača steka (`SPS`)**: Privilegovani programi koji se izvršavaju u EL1 i više mogu da prebacuju između korišćenja svog registra pokazivača steka i korisničkog modela (npr. između `SP_EL1` i `EL0`). Ovo prebacivanje se vrši upisivanjem u poseban registar **`SPSel`**. Ovo se ne može uraditi iz EL0. ## **Konvencija pozivanja (ARM64v8)** -ARM64 konvencija pozivanja specificira da se **prva osam parametara** funkcije prosleđuju u registre **`x0` do `x7`**. **Dodatni** parametri se prosleđuju na **stek**. Povratna vrednost se prosleđuje nazad u registar **`x0`**, ili u **`x1`** takođe **ako je dužine 128 bita**. Registri **`x19`** do **`x30`** i **`sp`** moraju biti **sačuvani** tokom poziva funkcije. +ARM64 konvencija pozivanja specificira da se **prva osam parametara** funkcije prosleđuju u registre **`x0` do `x7`**. **Dodatni** parametri se prosleđuju na **stek**. Povratna vrednost se vraća u registru **`x0`**, ili u **`x1`** takođe **ako je 128 bita dugačka**. Registri **`x19`** do **`x30`** i **`sp`** moraju biti **sačuvani** tokom poziva funkcije. Prilikom čitanja funkcije u sklopu, potražite **prolog funkcije i epilog**. **Prolog** obično uključuje **čuvanje pokazivača okvira (`x29`)**, **postavljanje** novog **pokazivača okvira**, i **dodeljivanje prostora steka**. **Epilog** obično uključuje **vraćanje sačuvanog pokazivača okvira** i **izlazak** iz funkcije. @@ -114,51 +114,51 @@ Swift ima svoju **konvenciju pozivanja** koja se može pronaći na [**https://gi ARM64 instrukcije generalno imaju **format `opcode dst, src1, src2`**, gde je **`opcode`** operacija koja će se izvršiti (kao što su `add`, `sub`, `mov`, itd.), **`dst`** je **odredišni** registar gde će rezultat biti smešten, a **`src1`** i **`src2`** su **izvorni** registri. Neposredne vrednosti takođe mogu biti korišćene umesto izvornih registara. -* **`mov`**: **Premeštanje** vrednosti iz jednog **registra** u drugi. -* Primer: `mov x0, x1` — Ovo premešta vrednost iz `x1` u `x0`. -* **`ldr`**: **Učitavanje** vrednosti iz **memorije** u **registar**. -* Primer: `ldr x0, [x1]` — Ovo učitava vrednost sa lokacije memorije na koju pokazuje `x1` u `x0`. +* **`mov`**: **Pomeri** vrednost iz jednog **registra** u drugi. +* Primer: `mov x0, x1` — Ovo pomeri vrednost iz `x1` u `x0`. +* **`ldr`**: **Učitaj** vrednost iz **memorije** u **registar**. +* Primer: `ldr x0, [x1]` — Ovo učitava vrednost sa memorijske lokacije na koju pokazuje `x1` u `x0`. * **Mod sa pomerajem**: Pomeraj koji utiče na pokazivač je naznačen, na primer: * `ldr x2, [x1, #8]`, ovo će učitati u x2 vrednost iz x1 + 8 * `ldr x2, [x0, x1, lsl #2]`, ovo će učitati u x2 objekat iz niza x0, sa pozicije x1 (indeks) \* 4 -* **Mod pre indeksa**: Ovo će primeniti izračunavanja na početni, dobiti rezultat i takođe sačuvati novi početak u početnom. +* **Mod pre-indeksa**: Ovo će primeniti izračunavanja na početni, dobiti rezultat i takođe sačuvati novi početak u početnom. * `ldr x2, [x1, #8]!`, ovo će učitati `x1 + 8` u `x2` i sačuvati u x1 rezultat `x1 + 8` -* `str lr, [sp, #-4]!`, Sačuvajte registar linka u sp i ažurirajte registar sp -* **Mod posle indeksa**: Slično prethodnom, ali se pristupa memoriji, a zatim se izračunava i čuva pomeraj. +* `str lr, [sp, #-4]!`, Sačuvaj registar linka u sp i ažuriraj registar sp +* **Mod post-indeksa**: Slično prethodnom, ali se pristupa memorijskoj adresi, a zatim se izračunava i čuva pomeraj. * `ldr x0, [x1], #8`, učitaj `x1` u `x0` i ažuriraj x1 sa `x1 + 8` -* **Adresa relativna prema PC registru**: U ovom slučaju adresa za učitavanje se računa relativno u odnosu na PC registar +* **Adresa relativna prema PC registru**: U ovom slučaju adresa za učitavanje se računa relativno prema PC registru * `ldr x1, =_start`, Ovo će učitati adresu gde počinje simbol `_start` u x1 u odnosu na trenutni PC. -* **`str`**: **Čuvanje** vrednosti iz **registra** u **memoriju**. -* Primer: `str x0, [x1]` — Ovo čuva vrednost iz `x0` na lokaciju memorije na koju pokazuje `x1`. -* **`ldp`**: **Učitavanje para registara**. Ova instrukcija **učitava dva registra** iz **uzastopnih memorijskih** lokacija. Adresa memorije se obično formira dodavanjem pomeraja vrednosti u drugom registru. -* Primer: `ldp x0, x1, [x2]` — Ovo učitava `x0` i `x1` sa lokacija memorije na `x2` i `x2 + 8`, redom. -* **`stp`**: **Čuvanje para registara**. Ova instrukcija **čuva dva registra** na **uzastopne memorijske** lokacije. Adresa memorije se obično formira dodavanjem pomeraja vrednosti u drugom registru. -* Primer: `stp x0, x1, [sp]` — Ovo čuva `x0` i `x1` na lokacijama memorije na `sp` i `sp + 8`, redom. -* `stp x0, x1, [sp, #16]!` — Ovo čuva `x0` i `x1` na lokacijama memorije na `sp+16` i `sp + 24`, redom, i ažurira `sp` sa `sp+16`. -* **`add`**: **Sabiranje** vrednosti dva registra i smeštanje rezultata u registar. +* **`str`**: **Sačuvaj** vrednost iz **registra** u **memoriju**. +* Primer: `str x0, [x1]` — Ovo čuva vrednost iz `x0` na memorijskoj lokaciji na koju pokazuje `x1`. +* **`ldp`**: **Učitaj par registara**. Ova instrukcija **učitava dva registra** iz **uzastopnih memorijskih** lokacija. Memorijska adresa se obično formira dodavanjem pomeraja vrednosti u drugom registru. +* Primer: `ldp x0, x1, [x2]` — Ovo učitava `x0` i `x1` sa memorijskih lokacija na `x2` i `x2 + 8`, redom. +* **`stp`**: **Sačuvaj par registara**. Ova instrukcija **čuva dva registra** na **uzastopnim memorijskim** lokacijama. Memorijska adresa se obično formira dodavanjem pomeraja vrednosti u drugom registru. +* Primer: `stp x0, x1, [sp]` — Ovo čuva `x0` i `x1` na memorijskim lokacijama na `sp` i `sp + 8`, redom. +* `stp x0, x1, [sp, #16]!` — Ovo čuva `x0` i `x1` na memorijskim lokacijama na `sp+16` i `sp + 24`, redom, i ažurira `sp` sa `sp+16`. +* **`add`**: **Saberi** vrednosti dva registra i sačuvaj rezultat u registru. * Sintaksa: add(s) Xn1, Xn2, Xn3 | #imm, \[pomeraj #N | RRX\] * Xn1 -> Destinacija * Xn2 -> Operand 1 * Xn3 | #imm -> Operand 2 (registar ili neposredno) * \[pomeraj #N | RRX\] -> Izvrši pomeraj ili pozovi RRX * Primer: `add x0, x1, x2` — Ovo sabira vrednosti u `x1` i `x2` i čuva rezultat u `x0`. -* `add x5, x5, #1, lsl #12` — Ovo je jednako 4096 (jedan pomeraj 12 puta) -> 1 0000 0000 0000 0000 +* `add x5, x5, #1, lsl #12` — Ovo je jednako 4096 (jedinica pomerena 12 puta) -> 1 0000 0000 0000 0000 * **`adds`** Ovo izvršava `add` i ažurira zastave * **`sub`**: **Oduzmi** vrednosti dva registra i čuvaj rezultat u registru. * Proveri **sintaksu za `add`**. * Primer: `sub x0, x1, x2` — Ovo oduzima vrednost u `x2` od `x1` i čuva rezultat u `x0`. -* **`subs`** Ovo je kao sub ali ažurira zastavu +* **`subs`** Ovo je kao sub ali ažurira zastavice * **`mul`**: **Množi** vrednosti **dva registra** i čuva rezultat u registru. * Primer: `mul x0, x1, x2` — Ovo množi vrednosti u `x1` i `x2` i čuva rezultat u `x0`. -* **`div`**: **Deljenje** vrednosti jednog registra drugim i čuvanje rezultata u registru. +* **`div`**: **Deljenje** vrednosti jednog registra sa drugim i čuvanje rezultata u registru. * Primer: `div x0, x1, x2` — Ovo deli vrednost u `x1` sa `x2` i čuva rezultat u `x0`. * **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: * **Logički pomeraj levo**: Dodaj 0 sa kraja pomerajući ostale bitove unapred (množi n puta sa 2) -* **Logički pomeraj desno**: Dodaj 1 na početak pomerajući ostale bitove unazad (deli n puta sa 2 u neoznačenom obliku) +* **Logički pomeraj desno**: Dodaj 1 sa početka pomerajući ostale bitove unazad (deli n puta sa 2 u neoznačenom obliku) * **Aritmetički pomeraj desno**: Kao **`lsr`**, ali umesto dodavanja 0 ako je najznačajniji bit 1, \*\*dodaju se 1 (\*\*deli n puta sa 2 u označenom obliku) * **Rotacija udesno**: Kao **`lsr`** ali šta god je uklonjeno sa desne strane se dodaje na levo -* **Rotacija udesno sa proširenjem**: Kao **`ror`**, ali sa zastavicom prenosa kao "najznačajnijim bitom". Tako da se zastavica prenosa pomera na bit 31 i uklonjeni bit na zastavicu prenosa. -* **`bfm`**: **Pomeraj bitova**, ove operacije **kopiraju bitove `0...n`** iz vrednosti i smeštaju ih na pozicije **`m..m+n`**. **`#s`** određuje **najlevlji bit** i **`#r`** količinu **rotacije udesno**. +* **Rotacija udesno sa proširenjem**: Kao **`ror`**, ali sa zastavicom prenosa kao "najznačajnijim bitom". Tako da se zastavica prenosa pomera na bit 31, a uklonjeni bit na zastavicu prenosa. +* **`bfm`**: **Pomeraj bitova**, ove operacije **kopiraju bitove `0...n`** iz vrednosti i smeštaju ih na pozicije **`m..m+n`**. **`#s`** određuje **najlevlji bit** poziciju i **`#r`** količinu **rotacije udesno**. * Pomeraj bitova: `BFM Xd, Xn, #r` * Pomeraj bitova sa znakom: `SBFM Xd, Xn, #r, #s` * Pomeraj bitova bez znaka: `UBFM Xd, Xn, #r, #s` @@ -170,21 +170,21 @@ ARM64 instrukcije generalno imaju **format `opcode dst, src1, src2`**, gde je ** * **`UBFIZ X1, X2, #3, #4`** Proširuje nulama 4 bita iz X2 i umetni ih u X1 počevši od bita 3, nulirajući desne bitove * **`UBFX X1, X2, #3, #4`** Izdvaja 4 bita počevši od bita 3 iz X2 i smešta nulirani rezultat u X1. * **Proširi znak na X:** Proširuje znak (ili dodaje samo 0 u neoznačenom obliku) vrednosti kako bi se mogle izvršiti operacije sa njom: -* **`SXTB X1, W2`** Proširuje znak bajta **od W2 do X1** (`W2` je polovina `X2`) da popuni 64 bita -* **`SXTH X1, W2`** Proširuje znak 16-bitnog broja **od W2 do X1** da popuni 64 bita -* **`SXTW X1, W2`** Proširuje znak bajta **od W2 do X1** da popuni 64 bita -* **`UXTB X1, W2`** Dodaje 0 (neoznačeno) bajtu **od W2 do X1** da popuni 64 bita +* **`SXTB X1, W2`** Proširuje znak bajta **iz W2 u X1** (`W2` je polovina `X2`) da popuni 64 bita +* **`SXTH X1, W2`** Proširuje znak 16-bitnog broja **iz W2 u X1** da popuni 64 bita +* **`SXTW X1, W2`** Proširuje znak bajta **iz W2 u X1** da popuni 64 bita +* **`UXTB X1, W2`** Dodaje 0 (neoznačeno) bajtu **iz W2 u X1** da popuni 64 bita * **`extr`:** Izdvaja bitove iz određenog **para registara konkateniranih**. * Primer: `EXTR W3, W2, W1, #3` Ovo će **konkatenirati W1+W2** i uzeti **od bita 3 iz W2 do bita 3 iz W1** i smestiti u W3. -* **`cmp`**: **Uporedi** dva registra i postavi uslovne zastave. To je **alias za `subs`** postavljajući odredišni registar na nulu. Korisno za proveru da li je `m == n`. +* **`cmp`**: **Uporedi** dva registra i postavi uslovne zastave. To je **alias za `subs`** postavljajući destinacioni registar na nulu. Korisno za proveru da li je `m == n`. * Podržava **istu sintaksu kao `subs`** * Primer: `cmp x0, x1` — Ovo upoređuje vrednosti u `x0` i `x1` i postavlja uslovne zastave prema tome. * **`cmn`**: **Uporedi negativno** operande. U ovom slučaju je to **alias za `adds`** i podržava istu sintaksu. Korisno za proveru da li je `m == -n`. -* **`ccmp`**: Uslovno upoređivanje, upoređivanje koje će se izvršiti samo ako je prethodno upoređivanje bilo tačno i posebno će postaviti nzcv bitove. +* **`ccmp`**: Uslovno poređenje, to je poređenje koje će se izvršiti samo ako je prethodno poređenje bilo tačno i posebno će postaviti nzcv bitove. * `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> ako x1 != x2 i x3 < x4, skoči na funkciju -* Ovo je zato što će se **`ccmp`** izvršiti samo ako je **prethodni `cmp` bio `NE`**, ako nije bitovi `nzcv` će biti postavljeni na 0 (što neće zadovoljiti `blt` upoređivanje). +* Ovo je zato što će se **`ccmp`** izvršiti samo ako je **prethodni `cmp` bio `NE`**, ako nije bitovi `nzcv` će biti postavljeni na 0 (što neće zadovoljiti `blt` poređenje). * Ovo se takođe može koristiti kao `ccmn` (isto ali negativno, kao `cmp` vs `cmn`). -* **`tst`**: Proverava da li su vrednosti upoređivanja oba 1 (radi kao i ANDS bez smeštanja rezultata bilo gde). Korisno je proveriti registar sa vrednošću i proveriti da li su bilo koji bitovi registra naznačeni u vrednosti 1. +* **`tst`**: Proverava da li su vrednosti uporedbe oba 1 (radi kao i ANDS bez smeštanja rezultata bilo gde). Korisno je proveriti registar sa vrednošću i proveriti da li su bilo koji bitovi registra naznačeni u vrednosti 1. * Primer: `tst X1, #7` Proveri da li su bilo koji od poslednja 3 bita X1 jednaki 1 * **`teq`**: XOR operacija odbacivanjem rezultata * **`b`**: Bezuslovni skok @@ -193,22 +193,22 @@ ARM64 instrukcije generalno imaju **format `opcode dst, src1, src2`**, gde je ** * **`bl`**: **Skok** sa linkom, koristi se za **poziv** potprograma. Čuva **povratnu adresu u `x30`**. * Primer: `bl mojaFunkcija` — Ovo poziva funkciju `mojaFunkcija` i čuva povratnu adresu u `x30`. * Imajte na umu da ovo neće popuniti registar linka sa povratnom adresom (nije pogodno za pozive potprograma koji treba da se vrate nazad) -* **`blr`**: **Skok** sa Linkom u Registar, koristi se za **poziv** potprograma gde je cilj **naveden** u **registru**. Čuva povratnu adresu u `x30`. (Ovo je +* **`blr`**: **Skok** sa Linkom u Registar, koristi se za **poziv** potprograma gde je cilj **specifikovan** u **registru**. Čuva povratnu adresu u `x30`. (Ovo je * Primer: `blr x1` — Ovo poziva funkciju čija je adresa sadržana u `x1` i čuva povratnu adresu u `x30`. * **`ret`**: **Povratak** iz **potprograma**, obično koristeći adresu u **`x30`**. * Primer: `ret` — Ovo se vraća iz trenutnog potprograma koristeći povratnu adresu u `x30`. * **`b.`**: Uslovni skokovi -* **`b.eq`**: **Skok ako je jednako**, zasnovan na prethodnoj `cmp` instrukciji. +* **`b.eq`**: **Skok ako je jednako**, zasnovano na prethodnoj `cmp` instrukciji. * Primer: `b.eq oznaka` — Ako je prethodna `cmp` instrukcija pronašla dve jednake vrednosti, skoči na `oznaka`. -* **`b.ne`**: **Skok ako nije jednako**. Ova instrukcija proverava uslovne zastave (koje su postavljene prethodnom instrukcijom poređenja) i ako upoređene vrednosti nisu jednake, preskače do oznake ili adrese. +* **`b.ne`**: **Skok ako nije jednako**. Ova instrukcija proverava uslovne zastave (koje su postavljene prethodnom instrukcijom poređenja), i ako upoređene vrednosti nisu jednake, preskače do oznake ili adrese. * Primer: Nakon `cmp x0, x1` instrukcije, `b.ne label` — Ako vrednosti u `x0` i `x1` nisu jednake, preskače do `label`. -* **`cbz`**: **Poređenje i skok ako je nula**. Ova instrukcija upoređuje registar sa nulom i ako su jednaki, preskače do oznake ili adrese. +* **`cbz`**: **Uporedi i skoči ako je nula**. Ova instrukcija upoređuje registar sa nulom, i ako su jednaki, preskače do oznake ili adrese. * Primer: `cbz x0, label` — Ako je vrednost u `x0` nula, preskače do `label`. -* **`cbnz`**: **Poređenje i skok ako nije nula**. Ova instrukcija upoređuje registar sa nulom i ako nisu jednaki, preskače do oznake ili adrese. +* **`cbnz`**: **Uporedi i skoči ako nije nula**. Ova instrukcija upoređuje registar sa nulom, i ako nisu jednaki, preskače do oznake ili adrese. * Primer: `cbnz x0, label` — Ako je vrednost u `x0` različita od nule, preskače do `label`. -* **`tbnz`**: Testiranje bita i skok ako nije nula +* **`tbnz`**: Testiraj bit i skoči ako nije nula * Primer: `tbnz x0, #8, label` -* **`tbz`**: Testiranje bita i skok ako je nula +* **`tbz`**: Testiraj bit i skoči ako je nula * Primer: `tbz x0, #8, label` * **Uslovne selektne operacije**: Ovo su operacije čije ponašanje varira u zavisnosti od uslovnih bitova. * `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Ako je tačno, X0 = X1, ako nije, X0 = X2 @@ -220,24 +220,24 @@ ARM64 instrukcije generalno imaju **format `opcode dst, src1, src2`**, gde je ** * `cneg Xd, Xn, cond` -> Ako je tačno, Xd = - Xn, ako nije, Xd = Xn * `cset Xd, Xn, Xm, cond` -> Ako je tačno, Xd = 1, ako nije, Xd = 0 * `csetm Xd, Xn, Xm, cond` -> Ako je tačno, Xd = \, ako nije, Xd = 0 -* **`adrp`**: Računa **adresu stranice simbola** i smešta je u registar. -* Primer: `adrp x0, symbol` — Ovo računa adresu stranice `symbol` i smešta je u `x0`. -* **`ldrsw`**: **Učitava** potpisanu **32-bitnu** vrednost iz memorije i **proširuje je na 64** bita. +* **`adrp`**: Izračunava **adresu stranice simbola** i smešta je u registar. +* Primer: `adrp x0, symbol` — Ovo izračunava adresu stranice `symbol` i smešta je u `x0`. +* **`ldrsw`**: **Učitaj** potpisanu **32-bitnu** vrednost iz memorije i **proširi je na 64** bita. * Primer: `ldrsw x0, [x1]` — Ovo učitava potpisanu 32-bitnu vrednost sa lokacije u memoriji na koju pokazuje `x1`, proširuje je na 64 bita i smešta je u `x0`. -* **`stur`**: **Čuva vrednost registra na lokaciji u memoriji**, koristeći ofset od drugog registra. +* **`stur`**: **Smešta vrednost registra na lokaciju u memoriji**, koristeći ofset od drugog registra. * Primer: `stur x0, [x1, #4]` — Ovo smešta vrednost iz `x0` na adresu u memoriji koja je 4 bajta veća od adrese u `x1`. -* **`svc`** : Pravi **sistemski poziv**. Ovo označava "Supervizorski poziv". Kada procesor izvrši ovu instrukciju, prelazi iz korisničkog režima u režim jezgra i skače na određenu lokaciju u memoriji gde se nalazi kod za **obradu sistemskog poziva jezgra**. +* **`svc`** : Napravi **sistemski poziv**. Ovo označava "Supervizorski poziv". Kada procesor izvrši ovu instrukciju, prelazi iz korisničkog režima u režim jezgra i skače na određenu lokaciju u memoriji gde se nalazi kod za **obradu sistemskog poziva jezgra**. * Primer: ```armasm -mov x8, 93 ; Učitava broj sistema za izlazak (93) u registar x8. -mov x0, 0 ; Učitava kod statusa izlaska (0) u registar x0. -svc 0 ; Pravi sistemski poziv. +mov x8, 93 ; Učitaj broj sistema za izlazak (93) u registar x8. +mov x0, 0 ; Učitaj kod statusa izlaska (0) u registar x0. +svc 0 ; Napravi sistemski poziv. ``` ### **Prolog funkcije** -1. **Sačuvajte registar linka i pokazivač okvira na steku**: +1. **Sačuvaj registar linka i pokazivač okvira na steku**: {% code overflow="wrap" %} ```armasm @@ -261,13 +261,13 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th 3. **Povratak**: `ret` (vraća kontrolu pozivaocu koristeći adresu u registru veze) -## Stanje izvršenja AARCH32 +## Stanje izvršavanja AARCH32 -Armv8-A podržava izvršenje 32-bitnih programa. **AArch32** može raditi u jednom od **dva skupa instrukcija**: **`A32`** i **`T32`** i može prelaziti između njih putem **`interworking`**-a.\ -**Privilegovani** 64-bitni programi mogu zakazati **izvršenje 32-bitnih** programa izvršavanjem transfera nivoa izuzetka na niže privilegovani 32-bitni program.\ -Napomena da se prelazak sa 64-bitnog na 32-bitni dešava sa nižim nivoom izuzetka (na primer, 64-bitni program u EL1 pokreće program u EL0). Ovo se postiže postavljanjem **bita 4 od** **`SPSR_ELx`** specijalnog registra **na 1** kada je `AArch32` procesna nit spremna za izvršenje, a ostatak `SPSR_ELx` čuva **`AArch32`** programe CPSR. Zatim, privilegovani proces poziva instrukciju **`ERET`** kako bi procesor prešao u **`AArch32`** ulazeći u A32 ili T32 u zavisnosti od CPSR\*\*.\*\* +Armv8-A podržava izvršavanje 32-bitnih programa. **AArch32** može raditi u jednom od **dva skupa instrukcija**: **`A32`** i **`T32`** i može prelaziti između njih putem **`interworking`**-a.\ +**Privilegovani** 64-bitni programi mogu zakazati **izvršavanje 32-bitnih** programa izvršavanjem transfera nivoa izuzetka na niže privilegovani 32-bitni program.\ +Napomena da se prelazak sa 64-bitnog na 32-bitni dešava sa nižim nivoom izuzetka (na primer, 64-bitni program u EL1 pokreće program u EL0). Ovo se postiže postavljanjem **bita 4 od** **`SPSR_ELx`** specijalnog registra **na 1** kada je `AArch32` procesna nit spremna za izvršavanje, a ostatak `SPSR_ELx` čuva **`AArch32`** programe CPSR. Zatim, privilegovani proces poziva instrukciju **`ERET`** kako bi procesor prešao u **`AArch32`** ulazeći u A32 ili T32 u zavisnosti od CPSR-a\*\*.\*\* -**`Interworking`** se dešava korišćenjem bitova J i T u CPSR-u. `J=0` i `T=0` znači **`A32`** i `J=0` i `T=1` znači **T32**. Ovo se u osnovi prevodi u postavljanje **najnižeg bita na 1** kako bi se naznačilo da je skup instrukcija T32.\ +**`Interworking`** se dešava korišćenjem bitova J i T u CPSR-u. `J=0` i `T=0` znači **`A32`** i `J=0` i `T=1` znači **T32**. Ovo se u osnovi prevodi na postavljanje **najnižeg bita na 1** kako bi se naznačilo da je skup instrukcija T32.\ Ovo se postavlja tokom **instrukcija grana interworking-a**, ali se takođe može postaviti direktno i drugim instrukcijama kada je PC postavljen kao registar odredišta. Primer: Još jedan primer: @@ -292,23 +292,23 @@ Postoje 16 registara od 32 bita (r0-r15). **Od r0 do r14** mogu se koristiti za - **`r14`**: Registar za povezivanje Osim toga, registri se čuvaju u **`bankovnim registrima`**. To su mesta koja čuvaju vrednosti registara omogućavajući **brzo prebacivanje konteksta** u rukovanju izuzecima i privilegovanim operacijama kako bi se izbegla potreba za ručnim čuvanjem i vraćanjem registara svaki put.\ -Ovo se postiže **čuvanjem stanja procesora od `CPSR` do `SPSR`** režima procesora u koji se preuzima izuzetak. Prilikom povratka izuzetka, **`CPSR`** se obnavlja iz **`SPSR`**. +Ovo se postiže **čuvanjem stanja procesora od `CPSR` do `SPSR`** procesorskog moda u koji se preuzima izuzetak. Prilikom povratka izuzetka, **`CPSR`** se obnavlja iz **`SPSR`**. ### CPSR - Trenutni registar statusa programa -U AArch32, CPSR funkcioniše slično kao **`PSTATE`** u AArch64 i takođe se čuva u **`SPSR_ELx`** kada se preuzme izuzetak radi kasnijeg obnavljanja izvršenja: +U AArch32, CPSR radi slično kao **`PSTATE`** u AArch64 i takođe se čuva u **`SPSR_ELx`** kada se preuzme izuzetak radi kasnijeg obnavljanja izvršenja:
Polja su podeljena u neke grupe: -- Registar statusa aplikacije (APSR): Aritmetički zastavice i pristupačne iz EL0 +- Registar statusa programa aplikacije (APSR): Aritmetički zastavice i pristupačne iz EL0 - Registri stanja izvršenja: Ponašanje procesa (upravljano od strane OS-a). -#### Registar statusa aplikacije (APSR) +#### Registar statusa programa aplikacije (APSR) - Zastavice **`N`**, **`Z`**, **`C`**, **`V`** (kao i u AArch64) -- Zastavica **`Q`**: Postavlja se na 1 kada se **desi zasićenje celobrojnih vrednosti** tokom izvršenja specijalizovane aritmetičke instrukcije. Kada se jednom postavi na **`1`**, zadržava vrednost dok se ručno ne postavi na 0. Takođe, ne postoji instrukcija koja implicitno proverava njegovu vrednost, već se to mora uraditi čitanjem ručno. +- Zastavica **`Q`**: Postavlja se na 1 kada se **desi zasićenje celobrojnih vrednosti** tokom izvršenja specijalizovane aritmetičke instrukcije. Kada se jednom postavi na **`1`**, zadržava vrednost dok se ručno ne postavi na 0. Osim toga, ne postoji instrukcija koja implicitno proverava njegovu vrednost, već se mora pročitati ručno. - **`GE`** (Veće ili jednako) zastavice: Koriste se u SIMD (Single Instruction, Multiple Data) operacijama, poput "paralelnog sabiranja" i "paralelnog oduzimanja". Ove operacije omogućavaju obradu više podataka u jednoj instrukciji. Na primer, instrukcija **`UADD8`** **sabira četiri para bajtova** (iz dva 32-bitna operanda) paralelno i čuva rezultate u 32-bitnom registru. Zatim **postavlja `GE` zastavice u `APSR`** na osnovu ovih rezultata. Svaka GE zastavica odgovara jednom od sabiranja bajtova, ukazujući da li je sabiranje za taj par bajtova **prekoračilo**. @@ -320,7 +320,7 @@ Instrukcija **`SEL`** koristi ove GE zastavice za izvođenje uslovnih radnji. - Bitovi **`J`** i **`T`**: **`J`** treba da bude 0, a ako je **`T`** 0, koristi se skup instrukcija A32, a ako je 1, koristi se T32. - Registar stanja bloka IT (`ITSTATE`): Ovo su bitovi od 10-15 i 25-26. Čuvaju uslove za instrukcije unutar grupe sa prefiksom **`IT`**. - Bit **`E`**: Označava **endianness**. -- Bitovi moda i maski izuzetka (0-4): Određuju trenutno stanje izvršenja. Peti označava da li program radi kao 32-bitni (1) ili 64-bitni (0). Ostala 4 predstavljaju **trenutni korišćeni režim izuzetka** (kada se desi izuzetak i kada se rukuje njime). Postavljeni broj označava **trenutni prioritet** u slučaju da se desi još jedan izuzetak dok se ovaj rukuje. +- Bitovi moda i maski izuzetka (0-4): Određuju trenutno stanje izvršenja. Peti označava da li program radi kao 32-bitni (1) ili 64-bitni (0). Ostala 4 predstavljaju **trenutni korišćeni režim izuzetka** (kada se desi izuzetak i kada se rukuje njime). Broj postavljen **označava trenutni prioritet** u slučaju da se desi drugi izuzetak dok se ovaj rukuje.
@@ -345,9 +345,36 @@ dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Lib dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64 ``` {% hint style="success" %} -Ponekad je lakše proveriti **dekompilovani** kod iz **`libsystem_kernel.dylib`** **nego** proveravati **izvorni kod** jer je kod nekoliko syscalls (BSD i Mach) generisan putem skripti (proverite komentare u izvornom kodu), dok u dylib datoteci možete videti šta se poziva. +Ponekad je lakše proveriti **dekompilovani** kod iz **`libsystem_kernel.dylib`** **nego** proveravati **izvorni kod** jer je kod nekoliko syscalls (BSD i Mach) generisan putem skripti (proverite komentare u izvornom kodu), dok u dylib-u možete pronaći šta se poziva. {% endhint %} +### objc\_msgSend + +Veoma je često pronaći ovu funkciju korišćenu u Objective-C ili Swift programima. Ova funkcija omogućava pozivanje metode objekta Objective-C. + +Parametri ([više informacija u dokumentaciji](https://developer.apple.com/documentation/objectivec/1456712-objc\_msgsend)): + +* x0: self -> Pokazivač na instancu +* x1: op -> Selektor metode +* x2... -> Ostali argumenti pozvane metode + +Dakle, ako postavite prekidnu tačku pre grananja ka ovoj funkciji, lako možete pronaći šta je pozvano u lldb-u sa (u ovom primeru objekat poziva objekat iz `NSConcreteTask` koji će pokrenuti komandu): +``` +(lldb) po $x0 + + +(lldb) x/s $x1 +0x1736d3a6e: "launch" + +(lldb) po [$x0 launchPath] +/bin/sh + +(lldb) po [$x0 arguments] +<__NSArrayI 0x1736801e0>( +-c, +whoami +) +``` ### Shellkodovi Za kompajliranje: @@ -358,14 +385,14 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm # You could also use this ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem ``` -Da izvučemo bajtove: +Da biste izvukli bajtove: ```bash # Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do echo -n '\\x'$c done ``` -
+ C kod za testiranje shell koda ```c @@ -699,7 +726,7 @@ Drugi načini da podržite HackTricks: * Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) -* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) +* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.