Translated ['binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-e

This commit is contained in:
Translator 2024-04-19 14:50:18 +00:00
parent 2fb25258d6
commit c7a2498454

View file

@ -1,4 +1,4 @@
# Stokpunt Verskuiwing - EBP2Ret - EBP-ketting
# Stokpivoting - EBP2Ret - EBP-ketting
<details>
@ -6,9 +6,9 @@
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)!
* 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)
* 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.
@ -16,9 +16,9 @@ Ander maniere om HackTricks te ondersteun:
## Basiese Inligting
Hierdie tegniek maak gebruik van die vermoë om die **Base Pointer (EBP)** te manipuleer om die uitvoering van meerdere funksies aan mekaar te koppel deur sorgvuldige gebruik van die EBP-register en die **`leave; ret`** instruksievolgorde.
Hierdie tegniek maak gebruik van die vermoë om die **Basewysiger (EBP)** te manipuleer om die uitvoering van verskeie funksies aan mekaar te koppel deur sorgvuldige gebruik van die EBP-register en die **`leave; ret`** instruksievolgorde.
As 'n herinnering, beteken **`leave`** basies:
Ter herinnering, **`leave`** beteken basies:
```
mov ebp, esp
pop ebp
@ -28,19 +28,19 @@ En aangesien die **EBP in die stapel** voor die EIP is, is dit moontlik om dit t
### 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 is met uitvoer.
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 is met uitvoer.
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 die EIP indirek 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 'n adres wat deur die aanvaller daar gestoor is.**\
Let op hoe jy **2 adresse moet weet**: Die een waar ESP gaan, waar jy die adres moet skryf wat deur ESP aangedui word.
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. Soos `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 'n adres wat deur die aanvaller daar gestoor is.**\
Let op hoe jy **2 adresse moet weet**: Die een waar ESP gaan wees, waar jy die adres moet skryf wat deur ESP aangedui word.
#### Uitbuiting Konstruksie
Eerstens moet jy 'n **adres weet waar jy arbitrêre data / adresse kan skryf**. Die ESP sal hierheen wys en die eerste `ret` **uitvoer**.
Eerstens moet jy 'n **adres weet waar jy arbitrêre data / adresse kan skryf**. Die ESP sal hierheen wys en die eerste `ret` **hardloop**.
Dan moet jy die adres weet wat deur `ret` gebruik word wat **arbitrêre kode uitvoer**. Jy kan gebruik:
* 'n geldige [**ONE\_GADGET**](https://github.com/david942j/one\_gadget) adres.
* Die adres van **`system()`** gevolg deur **4 rommel byte** en die adres van `"/bin/sh"` (x86-bits).
* Die adres van **`system()`** gevolg deur **4 rommelbyte** en die adres van `"/bin/sh"` (x86-bits).
* Die adres van 'n **`jump esp;`** gadget ([**ret2esp**](../rop-return-oriented-programing/ret2esp-ret2reg.md)) gevolg deur die **shellcode** om uit te voer.
* 'n paar [**ROP**](../rop-return-oriented-programing/) ketting
@ -48,8 +48,8 @@ Onthou dat voor enige van hierdie adresse in die beheerde deel van die geheue, m
#### 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 betekenisvolle byte van die EBP kan **verander**. In so 'n geval moet die geheueplek wat die adres om na te spring met die **`ret`** stoor, die eerste drie byte deel met die EBP, wat 'n soortgelyke manipulasie met meer beperkte toestande toelaat.\
Gewoonlik word die byte 0x00 verander om so ver as moontlik te spring.
Daar is 'n spesifieke variasie van hierdie tegniek bekend as 'n "Off-By-One Uitbuiting". Dit word gebruik wanneer jy **slegs die minst betekenisvolle byte van die EBP kan wysig**. In so 'n geval moet die geheueplek wat die adres om na te spring met die **`ret`** stoor, die eerste drie byte deel met die EBP, wat 'n soortgelyke manipulasie met meer beperkte toestande toelaat.\
Gewoonlik word die byte 0x00 gewysig om so ver as moontlik te spring.
Dit is ook algemeen om 'n RET-glybaan in die stapel te gebruik en die werklike ROP-ketting aan die einde te plaas om dit waarskynliker te maak dat die nuwe ESP binne die RET-glybaan wys en die finale ROP-ketting uitgevoer word.
@ -57,11 +57,11 @@ Dit is ook algemeen om 'n RET-glybaan in die stapel te gebruik en die werklike R
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 hierdie in die beheerde ESP-plek te plaas:
Nou word die **`ESP`** beheer deur na 'n gewenste adres te wys en die volgende instruksie wat uitgevoer moet word, is 'n `RET`. Om hiervan misbruik te maak, is dit moontlik om hierdie in die beheerde ESP-plek 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 die stelsel eindig, dit sal ESP na die valse EBP skuif en weer begin
* **`&(leave;ret)`** -> Geroep nadat stelsel eindig, dit sal ESP na die valse EBP skuif en weer begin
* **`&("/bin/sh")`**-> Param vir `system`
Op hierdie manier is dit moontlik om verskeie valse EBPs aan mekaar te koppel om die vloei van die program te beheer.
@ -135,7 +135,7 @@ ret # return
### **`pop rsp`** apparaat
[**Op hierdie bladsy**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) kan jy 'n voorbeeld vind 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 **leak vanaf die stok**:
[**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 **lek vanaf die stok**:
```python
# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp
# This version has added comments
@ -200,13 +200,38 @@ Kyk na die ret2esp tegniek hier:
* [https://guyinatuxedo.github.io/17-stack\_pivot/dcquals19\_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/dcquals19\_speedrun4/index.html)
* 64 bits, off by one exploitation with a rop chain starting with a ret sled
* [https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)
* 64 bit, no relro, canary, nx and pie. The program grants a leak for stack or pie and a WWW of a qword. First get the stack leak and use the WWW to go back and get the pie leak. Then use the WWW to create an eternal loop abusing `.fini_array` entries + calling `__libc_csu_fini` ([more info here](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md)). Abusing this "eternal" write, it's written a ROP chain in the .bss and end up calling it pivoting with RBP.
* 64 bit, no relro, canary, nx and pie. Die program gee 'n lek vir stack of pie en 'n WWW van 'n qword. Kry eers die stack lek en gebruik die WWW om terug te gaan en die pie lek te kry. Gebruik dan die WWW om 'n ewige lus te skep deur `.fini_array` inskrywings te misbruik + `__libc_csu_fini` te roep ([meer inligting hier](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md)). Deur hierdie "ewige" skryf te misbruik, word 'n ROP-ketting in die .bss geskryf en eindig dit met dit te roep deur te pivoteer met RBP.
## ARM64
In ARM64, the **prologue and epilogues** of the functions **don't store and retrieve the SP registry** in the stack. Therefore, by default, you **won't be able to control the SP registry** by overwriting some data inside the stack.
In ARM64, die **proloog en epiloge** van die funksies **stoor en herstel nie die SP-register** in die stapel nie. Verder, die **`RET`** instruksie keer nie terug na die adres wat deur SP aangedui word nie, maar **na die adres binne `x30`**.
Daarom, standaard, deur net die epiloog te misbruik sal jy **nie die SP-register kan beheer** deur 'n paar data binne die stapel te oorskryf nie. Selfs as jy daarin slaag om die SP te beheer, sal jy steeds 'n manier nodig hê om **die `x30`-register te beheer**.
* proloog
```armasm
sub sp, sp, 16
stp x29, x30, [sp] // [sp] = x29; [sp + 8] = x30
mov x29, sp // FP wys na die raamrekord
```
* epiloog
```armasm
ldp x29, x30, [sp] // x29 = [sp]; x30 = [sp + 8]
add sp, sp, 16
ret
```
{% hint style="danger" %}
Die manier om iets soortgelyks as stapel pivoteering in ARM64 uit te voer, sou wees om in staat te wees om die `SP` te beheer (deur 'n register te beheer waarvan die waarde aan `SP` oorgedra word of omdat vir een of ander rede `SP` sy adres van die stapel neem en ons 'n oorvloei het) en dan die epiloog te misbruik om die `x30`-register van 'n beheerde `SP` te laai en daarna daarnaar te **`RET`**.
{% endhint %}
Ook op die volgende bladsy kan jy die ekwivalent van **Ret2esp in ARM64** sien:
{% content-ref url="../rop-return-oriented-programing/ret2esp-ret2reg.md" %}
[ret2esp-ret2reg.md](../rop-return-oriented-programing/ret2esp-ret2reg.md)
{% endcontent-ref %}
<details>
@ -214,10 +239,10 @@ In ARM64, the **prologue and epilogues** of the functions **don't store and retr
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 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Kry die [**offisiële PEASS & HackTricks swag**](https://peass.creator-spring.com)
* 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.
* **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 repos.
</details>