mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['binary-exploitation/format-strings/README.md'] to tr
This commit is contained in:
parent
a095035b96
commit
7185b39c04
1 changed files with 15 additions and 15 deletions
|
@ -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 savunmasız:
|
||||
* fprintf zayıf:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -74,19 +74,19 @@ ve birinci parametreden dördüncü parametreye kadar okuyabilirsiniz.
|
|||
|
||||
Ya da şunu yapabilirsiniz:
|
||||
```c
|
||||
printf("$4%x")
|
||||
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.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Bu girişi kontrol eden bir saldırgan, **yığında rastgele adresler ekleyebilecek ve `printf`'in bunlara erişmesini sağlayabilecektir**. Bir sonraki bölümde bu davranışın nasıl kullanılacağı açıklanacaktır.
|
||||
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 açıklanacaktır.
|
||||
{% endhint %}
|
||||
|
||||
## **Rastgele Okuma**
|
||||
## **Keyfi Okuma**
|
||||
|
||||
Biçimlendiriciyi **`%n$s`** kullanarak **`printf`'in** **n pozisyonunda** bulunan **adres**i alması ve **bunu bir dizeymiş gibi yazdırması** mümkündür (0x00 bulunana kadar yazdır). Yani, eğer 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:
|
||||
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:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -145,20 +145,20 @@ p.close()
|
|||
Rastgele okumalar şunlar için faydalı olabilir:
|
||||
|
||||
* **Bellekten** **ikili** **veriyi** **dökme**
|
||||
* **Hassas** **bilgilerin** saklandığı **belleğin belirli kısımlarına** erişim sağlama (örneğin, bu [**CTF meydan okumasında**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value) olduğu gibi canary'ler, şifreleme anahtarları veya özel şifreler)
|
||||
* **Hassas** **bilgilerin** saklandığı **belleğin belirli kısımlarına** erişim sağlama (örneğin, bu [**CTF zorluğu**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value) gibi canary'ler, şifreleme anahtarları veya özel şifreler)
|
||||
|
||||
## **Rastgele Yazma**
|
||||
|
||||
Formatlayıcı **`$<num>%n`** **yazılan baytların sayısını** **belirtilen adrese** **yazar**. Eğer bir saldırgan printf ile istediği kadar karakter yazabiliyorsa, **`$<num>%n`**'nin rastgele bir sayıyı rastgele bir adrese yazmasını sağlayabilir.
|
||||
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, bu nedenle **`%.<num-write>%<num>$n`** formatlayıcısını kullanarak **`<num-write>`** sayısını **`num` konumunu gösteren adrese** yazmak mümkündür.
|
||||
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.
|
||||
```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.
|
||||
|
||||
Bu nedenle, bu zafiyet **herhangi bir adrese (keyfi yazma)** **herhangi bir şeyi yazmaya** olanak tanır.
|
||||
Bu nedenle, bu zafiyet **herhangi bir adrese (keyfi yazma)** **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,11 +166,11 @@ 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 **kullanıcıdan** **argümanlarını** **alır** ve **`system`** **fonksiyonuna** **işaret eder**.\
|
||||
Yazı adresini 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 **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.
|
||||
|
||||
* **HOB**, adresin en yüksek 2 baytına çağrılır
|
||||
* **LOB**, adresin en düşük 2 baytına çağrılır
|
||||
* **HOB**, adresin 2 yüksek baytına çağrılır
|
||||
* **LOB**, adresin 2 düşük 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.
|
||||
|
||||
|
@ -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'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.
|
||||
* 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.
|
||||
|
||||
{% 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">\
|
||||
|
|
Loading…
Reference in a new issue