Translated ['binary-exploitation/format-strings/README.md'] to tr

This commit is contained in:
Translator 2024-09-25 16:48:48 +00:00
parent 7185b39c04
commit 290cec7d87

View file

@ -17,7 +17,7 @@ GCP Hacking'i öğrenin ve pratik yapın: <img src="/.gitbook/assets/grte.png" a
## Temel Bilgiler
C'de **`printf`** bazı metinleri **yazdırmak için** kullanılabilen bir fonksiyondur. Bu fonksiyonun beklediği **ilk parametre**, **formatlayıcılarla birlikte ham metin**'dir. Beklenen **sonraki parametreler**, ham metindeki **formatlayıcıları** **değiştirmek için** **değerler**dir.
C'de **`printf`** bazı metinleri **yazdırmak** için kullanılabilen bir fonksiyondur. Bu fonksiyonun beklediği **ilk parametre**, **formatlayıcılarla birlikte ham metin**'dir. Beklenen **sonraki parametreler**, ham metindeki **formatlayıcıları** **değiştirmek için** **değerler**'dir.
Diğer savunmasız fonksiyonlar **`sprintf()`** ve **`fprintf()`**'dir.
@ -51,7 +51,7 @@ printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5
```c
printf("%x %x %x", value); // Unexpected output: reads random values from the stack.
```
* fprintf zayıf:
* fprintf vulnerable:
```c
#include <stdio.h>
@ -78,15 +78,15 @@ printf("%4$x")
```
ve doğrudan dördüncüyü okuyun.
Saldırganın `pr`**`intf` parametresini kontrol ettiğini unutmayın, bu temelde** onun girdiğinin `printf` çağrıldığında yığında olacağı anlamına gelir, bu da belirli bellek adreslerini yığında yazabileceği anlamına gelir.
Saldırganın `printf` **parametresini kontrol ettiğini unutmayın, bu temelde** onun girdiğinin `printf` çağrıldığında yığın içinde olacağı anlamına gelir, bu da belirli bellek adreslerini yığında yazabileceği anlamına gelir.
{% hint style="danger" %}
Bu girişi kontrol eden bir saldırgan, **yığında keyfi adres ekleyebilecek ve `printf`'in bunlara erişmesini sağlayabilecektir**. Bu davranışın nasıl kullanılacağı bir sonraki bölümdeıklanacaktır.
Bu girişi kontrol eden bir saldırgan, **yığında keyfi adres ekleyebilecek ve `printf`'in bunlara erişmesini sağlayabilecektir**. Bir sonraki bölümde bu davranışın nasıl kullanılacağııklanacaktır.
{% endhint %}
## **Keyfi Okuma**
Formatlayıcı **`%n$s`** kullanarak **`printf`**'in **n pozisyonunda** bulunan **adres**i alması ve **bunu bir dizeymiş gibi yazdırması** (0x00 bulunana kadar yazdırma) mümkündür. Yani, ikili dosyanın temel adresi **`0x8048000`** ise ve kullanıcı girdisinin yığında 4. pozisyonda başladığını biliyorsak, ikilinin başlangıcını yazdırmak mümkündür:
Biçimlendiriciyi **`%n$s`** kullanarak **`printf`'in** **n pozisyonunda** bulunan **adres**i alması ve **bunu bir dizeymiş gibi yazdırması** (0x00 bulunana kadar yazdır) mümkündür. Yani, ikili dosyanın temel adresi **`0x8048000`** ise ve kullanıcı girdisinin yığında 4. pozisyonda başladığını biliyorsak, ikilinin başlangıcını yazdırmak mümkündür:
```python
from pwn import *
@ -149,16 +149,16 @@ Rastgele okumalar şunlar için faydalı olabilir:
## **Rastgele Yazma**
Formatlayıcı **`$<num>%n`** **yazılan bayt sayısını** **belirtilen adrese** **yazar**. Eğer bir saldırgan printf ile istediği kadar karakter yazabiliyorsa, **`$<num>%n`** ile rastgele bir sayıyı rastgele bir adrese yazabilecektir.
Formatlayıcı **`%<num>$n`** **yazılan bayt sayısını** **belirtilen adrese** **yazar**. Eğer bir saldırgan printf ile istediği kadar karakter yazabiliyorsa, **`%<num>$n`** ile rastgele bir sayıyı rastgele bir adrese yazabilecektir.
Neyse ki, 9999 sayısını yazmak için girdiye 9999 "A" eklemek gerekmez, bunun yerine **`%.<num-write>%<num>$n`** formatlayıcısını kullanarak **`<num-write>`** sayısını **`num` pozisyonu tarafından gösterilen adrese** yazmak mümkündür.
Neyse ki, 9999 sayısını yazmak için girdiye 9999 "A" eklemek gerekmez, bu nedenle **`%.<num-write>%<num>$n`** formatlayıcısını kullanarak **`<num-write>`** sayısını **`num` pozisyonu tarafından gösterilen adrese** yazmak mümkündür.
```bash
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
AAAA.%500\$08x —> Param at offset 500
```
Ancak, genellikle `0x08049724` gibi bir adres yazmak için (bu, bir seferde yazılması gereken BÜYÜK bir sayıdır), **`$hn`** kullanılır, **`$n`** yerine. Bu, **sadece 2 Bayt** yazmaya olanak tanır. Bu nedenle, bu işlem iki kez yapılır; bir kez adresin en yüksek 2B'si için ve bir kez de en düşük olanlar için.
Ancak, genellikle `0x08049724` gibi bir adres yazmak için (bu, bir seferde yazılması gereken BÜYÜK bir sayıdır), **`$hn`** kullanılır, **`$n`** yerine. Bu, **sadece 2 Bayt** yazmaya olanak tanır. Bu nedenle, bu işlem iki kez yapılır; bir kez adresin en yüksek 2B'si için ve bir kez de en düşük 2B'si için.
Bu nedenle, bu zafiyet **herhangi bir adrese (keyfi yazma)** **yazmaya** olanak tanır.
Bu nedenle, bu zafiyet **herhangi bir adrese (keyfi yazma)** **herhangi bir şeyi yazmaya** olanak tanır.
Bu örnekte, hedef, daha sonra çağrılacak olan **GOT** tablosundaki bir **fonksiyonun** **adresini** **üst üste yazmak** olacaktır. Bu, diğer keyfi yazma ile exec tekniklerini kötüye kullanabilir:
@ -166,13 +166,13 @@ Bu örnekte, hedef, daha sonra çağrılacak olan **GOT** tablosundaki bir **fon
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
{% endcontent-ref %}
Bir **fonksiyonu** **üst üste yazacağız** ki bu **fonksiyon**, **kullanıcıdan** **argümanlarını** **alır** ve **`system`** **fonksiyonuna** **işaret eder**.\
Belirttiğimiz gibi, adresi yazmak için genellikle 2 adım gereklidir: Önce adresin 2 Bayt'ını yazarsınız ve sonra diğer 2'sini. Bunu yapmak için **`$hn`** kullanılır.
Bir **fonksiyonu** **üst üste yazacağız** ki bu **kullanıcıdan** **argümanlarını** **alır** ve **`system`** **fonksiyonuna** **işaret eder**.\
Yazmak için genellikle 2 adım gereklidir: Önce adresin 2 Bayt'ını yazarsınız ve sonra diğer 2 Bayt'ı. Bunu yapmak için **`$hn`** kullanılır.
* **HOB**, adresin 2 yüksek baytına çağrılır
* **LOB**, adresin 2 düşük baytına çağrılır
* **HOB**, adresin en yüksek 2 Bayt'ına çağrılır
* **LOB**, adresin en düşük 2 Bayt'ına çağrılır
Daha sonra, format dizesinin nasıl çalıştığı nedeniyle, önce \[HOB, LOB] içindeki en küçüğü **yazmanız** ve ardından diğerini yazmanız gerekir.
Daha sonra, format dizesinin nasıl çalıştığı nedeniyle, önce \[HOB, LOB] içindeki en küçüğü **yazmanız** gerekir ve sonra diğerini.
Eğer HOB < LOB\
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
@ -229,7 +229,7 @@ Bir format string zafiyetinin yazma eylemlerini kötüye kullanarak **stack adre
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
* 32 bit, relro var, canary yok, nx, pie yok, `fflush` adresini win fonksiyonu ile (ret2win) üzerine yazmak için format string
* [https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html)
* 32 bit, relro var, canary yok, nx, pie yok, `.fini_array` içinde main'de bir adres yazmak için format string (böylece akış bir kez daha döner) ve `strlen`'a işaret eden GOT tablosundaki `system` adresini yazmak. Akış main'e döndüğünde, kullanıcı girişi ile `strlen` çalıştırılır ve `system`'a işaret eder, geçilen komutları çalıştırır.
* 32 bit, relro var, canary yok, nx, pie yok, `.fini_array` içinde main'e bir adres yazmak için format string (böylece akış bir kez daha döner) ve `strlen`'a işaret eden GOT tablosundaki `system` adresini yazmak. Akış main'e geri döndüğünde, kullanıcı girişi ile `strlen` çalıştırılır ve `system`'a işaret eder, geçilen komutları çalıştırır.
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\