Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met

This commit is contained in:
Translator 2025-08-18 20:36:53 +00:00
parent d720958130
commit ade4623f5f

View File

@ -4,7 +4,7 @@
## Program Başlıkları
Yükleyiciye **ELF**'yi belleğe nasıl yükleyeceğini tarif eder:
Yükleyiciye **ELF**'yi belleğe nasıl yükleyeceğini ıklar:
```bash
readelf -lW lnstat
@ -37,54 +37,70 @@ Segment Sections...
07
08 .init_array .fini_array .dynamic .got
```
Önceki programda **9 program başlığı** bulunmaktadır, ardından **segment haritalaması** her bölümün hangi program başlığında (00'dan 08'e) **bulunduğunu** gösterir.
The previous program has **9 program headers**, then, the **segment mapping** indicates in which program header (from 00 to 08) **each section is located**.
### PHDR - Program HeaDeR
Program başlığı tablolarını ve meta verileri içerir.
Contains the program header tables and metadata itself.
### INTERP
İkili dosyayı belleğe yüklemek için kullanılacak yükleyicinin yolunu gösterir.
Indicates the path of the loader to use to load the binary into memory.
> Tip: Statik bağlı veya statik-PIE ikili dosyalar `INTERP` girişi olmayacaktır. Bu durumlarda dinamik yükleyici yer almaz, bu da ona dayanan teknikleri devre dışı bırakır (örneğin, `ret2dlresolve`).
### LOAD
Bu başlıklar, **bir ikili dosyayı belleğe nasıl yükleyeceğinizi** belirtmek için kullanılır.\
Her **LOAD** başlığı, **bellek** bölgesini (boyut, izinler ve hizalama) belirtir ve ELF **ikilisinden oraya kopyalanacak baytları** gösterir.
These headers are used to indicate **how to load a binary into memory.**\
Each **LOAD** header indicates a region of **memory** (size, permissions and alignment) and indicates the bytes of the ELF **binary to copy in there**.
Örneğin, ikincisi 0x1190 boyutundadır, 0x1fc48'de bulunmalı, okuma ve yazma izinlerine sahip olmalı ve 0xfc48'den 0x528 ile doldurulacaktır (tüm ayrılan alanı doldurmaz). Bu bellek, `.init_array .fini_array .dynamic .got .data .bss` bölümlerini içerecektir.
For example, the second one has a size of 0x1190, should be located at 0x1fc48 with permissions read and write and will be filled with 0x528 from the offset 0xfc48 (it doesn't fill all the reserved space). This memory will contain the sections `.init_array .fini_array .dynamic .got .data .bss`.
### DYNAMIC
Bu başlık, programları kütüphane bağımlılıklarına bağlamaya ve yeniden konumlandırmaları uygulamaya yardımcı olur. **`.dynamic`** bölümüne bakın.
This header helps to link programs to their library dependencies and apply relocations. Check the **`.dynamic`** section.
### NOTE
Bu, ikili dosya hakkında satıcı meta veri bilgilerini saklar.
This stores vendor metadata information about the binary.
- On x86-64, `readelf -n` will show `GNU_PROPERTY_X86_FEATURE_1_*` flags inside `.note.gnu.property`. If you see `IBT` and/or `SHSTK`, the binary was built with CET (Indirect Branch Tracking and/or Shadow Stack). This impacts ROP/JOP because indirect branch targets must start with an `ENDBR64` instruction and returns are checked against a shadow stack. See the CET page for details and bypass notes.
{{#ref}}
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
{{#endref}}
### GNU_EH_FRAME
Yığın geri sarma tablolarının konumunu tanımlar, bu tablolar hata ayıklayıcılar ve C++ istisna işleme çalışma zamanı işlevleri tarafından kullanılır.
Defines the location of the stack unwind tables, used by debuggers and C++ exception handling-runtime functions.
### GNU_STACK
Yığın yürütme önleme savunmasının yapılandırmasını içerir. Etkinleştirilirse, ikili dosya yığın üzerinden kod çalıştıramaz.
Contains the configuration of the stack execution prevention defense. If enabled, the binary won't be able to execute code from the stack.
- Check with `readelf -l ./bin | grep GNU_STACK`. To forcibly toggle it during tests you can use `execstack -s|-c ./bin`.
### GNU_RELRO
İkili dosyanın RELRO (Yeniden Konumlandırma Salt Okunur) yapılandırmasını gösterir. Bu koruma, program yüklendikten sonra ve çalışmaya başlamadan önce belleğin belirli bölümlerini (örneğin `GOT` veya `init` ve `fini` tabloları) salt okunur olarak işaretler.
Indicates the RELRO (Relocation Read-Only) configuration of the binary. This protection will mark as read-only certain sections of the memory (like the `GOT` or the `init` and `fini` tables) after the program has loaded and before it begins running.
Önceki örnekte, 0x3b8 baytını 0x1fc48'e salt okunur olarak kopyalıyor ve `.init_array .fini_array .dynamic .got .data .bss` bölümlerini etkiliyor.
In the previous example it's copying 0x3b8 bytes to 0x1fc48 as read-only affecting the sections `.init_array .fini_array .dynamic .got .data .bss`.
RELRO'nun kısmi veya tam olabileceğini unutmayın, kısmi versiyon **`.plt.got`** bölümünü korumaz, bu bölüm **tembel bağlama** için kullanılır ve kütüphanelerin adresinin ilk kez arandığında yazma izinlerine sahip bu bellek alanına ihtiyaç duyar.
Note that RELRO can be partial or full, the partial version do not protect the section **`.plt.got`**, which is used for **lazy binding** and needs this memory space to have **write permissions** to write the address of the libraries the first time their location is searched.
> For exploitation techniques and up-to-date bypass notes, check the dedicated page:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
### TLS
İş parçacığına özgü değişkenler hakkında bilgi saklayan bir TLS girişleri tablosunu tanımlar.
Defines a table of TLS entries, which stores info about thread-local variables.
## Bölüm Başlıkları
## Section Headers
Bölüm başlıkları, ELF ikilisinin daha ayrıntılı bir görünümünü sunar.
Section headers gives a more detailed view of the ELF binary
```
objdump lnstat -h
@ -145,11 +161,11 @@ CONTENTS, READONLY
25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 000101bc 2**2
CONTENTS, READONLY
```
Ayrıca, konum, ofset, izinler ve bölümün **veri türü** hakkında bilgi verir.
Aynı zamanda konumu, ofseti, izinleri ama aynı zamanda bölümün **veri türünü** de gösterir.
### Meta Bölümleri
- **String table**: ELF dosyası için gerekli olan tüm dizeleri içerir (ancak program tarafından gerçekten kullanılanları değil). Örneğin, `.text` veya `.data` gibi bölüm adlarını içerir. Ve eğer `.text` string tablosunda 45. ofsetteyse, **name** alanında **45** numarasını kullanır.
- **String table**: ELF dosyası tarafından gereken tüm dizeleri içerir (ancak program tarafından gerçekten kullanılanları değil). Örneğin, `.text` veya `.data` gibi bölüm adlarını içerir. Ve eğer `.text` string tablosunda 45. ofsette ise, **name** alanında **45** numarasını kullanır.
- String tablosunun nerede olduğunu bulmak için, ELF string tablosuna bir işaretçi içerir.
- **Symbol table**: Semboller hakkında isim (string tablosundaki ofset), adres, boyut ve sembol hakkında daha fazla meta veri gibi bilgileri içerir.
@ -164,7 +180,7 @@ Ayrıca, konum, ofset, izinler ve bölümün **veri türü** hakkında bilgi ver
## Semboller
Semboller, programda bir işlev, global veri nesnesi, thread-local değişkenler olabilecek adlandırılmış bir konumdur...
Semboller, programda bir fonksiyon, bir global veri nesnesi, thread-local değişkenler olabilecek adlandırılmış bir konumdur...
```
readelf -s lnstat
@ -188,12 +204,16 @@ Num: Value Size Type Bind Vis Ndx Name
Her sembol girişi şunları içerir:
- **İsim**
- **Bağlama özellikleri** (zayıf, yerel veya küresel): Yerel bir sembol yalnızca program tarafından erişilebilirken, küresel semboller programın dışındaki paylaşılan sembollerdir. Zayıf bir nesne, örneğin, farklı bir fonksiyonla geçersiz kılınabilen bir fonksiyondur.
- **Tür**: NOTYPE (tip belirtilmemiş), OBJECT (küresel veri değişkeni), FUNC (fonksiyon), SECTION (bölüm), FILE (hata ayıklayıcılar için kaynak kodu dosyası), TLS (iş parçacığına özgü değişken), GNU_IFUNC (yer değiştirme için dolaylı fonksiyon)
- **Bağlama özellikleri** (zayıf, yerel veya global): Yerel bir sembol yalnızca program tarafından erişilebilirken, global semboller programın dışındaki paylaşımlardır. Zayıf bir nesne, örneğin, farklı bir fonksiyonla geçersiz kılınabilen bir fonksiyondur.
- **Tür**: NOTYPE (tip belirtilmemiş), OBJECT (global veri değişkeni), FUNC (fonksiyon), SECTION (bölüm), FILE (hata ayıklayıcılar için kaynak kodu dosyası), TLS (iş parçacığına özgü değişken), GNU_IFUNC (yer değiştirme için dolaylı fonksiyon)
- **Bölüm** indeksi nerede bulunduğu
- **Değer** (bellek adresi)
- **Boyut**
#### GNU Sembol Versiyonlama (dynsym/dynstr/gnu.version)
Modern glibc, sembol versiyonlarını kullanır. `.gnu.version` ve `.gnu.version_r` içinde girişler göreceksiniz ve `strlen@GLIBC_2.17` gibi sembol adları. Dinamik bağlayıcı, bir sembolü çözerken belirli bir versiyon talep edebilir. Manuel yer değiştirmeler oluştururken (örneğin, ret2dlresolve) doğru versiyon indeksini sağlamalısınız, aksi takdirde çözümleme başarısız olur.
## Dinamik Bölüm
```
readelf -d lnstat
@ -229,11 +249,28 @@ Tag Type Name/Value
0x000000006ffffff9 (RELACOUNT) 15
0x0000000000000000 (NULL) 0x0
```
NEEDED dizini, programın devam edebilmesi için **belirtilen kütüphaneyi yüklemesi gerektiğini** gösterir. NEEDED dizini, paylaşılan **kütüphane tamamen çalışır ve kullanıma hazır olduğunda** tamamlanır.
GEREKEN dizini, programın devam edebilmesi için **belirtilen kütüphaneyi yüklemesi gerektiğini** gösterir. GEREKEN dizini, paylaşılan **kütüphane tamamen çalışır hale geldiğinde ve kullanıma hazır olduğunda** tamamlanır.
## Yeniden Yerleştirmeler
### Dinamik yükleyici arama sırası (RPATH/RUNPATH, $ORIGIN)
Yükleyici, bağımlılıkları yükledikten sonra yeniden yerleştirmeleri de yapmalıdır. Bu yeniden yerleştirmeler, REL veya RELA formatlarında yeniden yerleştirme tablosunda belirtilir ve yeniden yerleştirmelerin sayısı dinamik bölümlerde RELSZ veya RELASZ ile verilir.
`DT_RPATH` (kullanımdan kaldırılmış) ve/veya `DT_RUNPATH` girdileri, dinamik yükleyicinin bağımlılıkları nerede arayacağını etkiler. Kabaca sıralama:
- `LD_LIBRARY_PATH` (setuid/sgid veya başka bir "güvenli yürütme" programları için göz ardı edilir)
- `DT_RPATH` (sadece `DT_RUNPATH` yoksa)
- `DT_RUNPATH`
- `ld.so.cache`
- `/lib64`, `/usr/lib64` gibi varsayılan dizinler
`$ORIGIN`, ana nesnenin dizinine atıfta bulunmak için RPATH/RUNPATH içinde kullanılabilir. Bir saldırgan perspektifinden bu, dosya sistemi düzenini veya ortamı kontrol ettiğinizde önemlidir. Sertleştirilmiş ikili dosyalar (AT_SECURE) için çoğu ortam değişkeni yükleyici tarafından göz ardı edilir.
- İncelemek için: `readelf -d ./bin | egrep -i 'r(path|unpath)'`
- Hızlı test: `LD_DEBUG=libs ./bin 2>&1 | grep -i find` (arama yolu kararlarını gösterir)
> Priv-esc ipucu: Yazılabilir RUNPATH'leri veya sizin sahip olduğunuz yanlış yapılandırılmış `$ORIGIN`-göreli yolları kullanmayı tercih edin. LD_PRELOAD/LD_AUDIT, güvenli yürütme (setuid) bağlamlarında göz ardı edilir.
## Yeniden konumlandırmalar
Yükleyici, bağımlılıkları yükledikten sonra bunları yeniden konumlandırmak zorundadır. Bu yeniden konumlandırmalar, REL veya RELA formatlarında yeniden konumlandırma tablosunda belirtilir ve yeniden konumlandırmaların sayısı dinamik bölümlerde RELSZ veya RELASZ ile verilir.
```
readelf -r lnstat
@ -274,7 +311,6 @@ Offset Info Type Sym. Value Sym. Name + Addend
00000001fea0 000900000402 R_AARCH64_JUMP_SL 0000000000000000 perror@GLIBC_2.17 + 0
00000001fea8 000b00000402 R_AARCH64_JUMP_SL 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0
00000001feb0 000c00000402 R_AARCH64_JUMP_SL 0000000000000000 putc@GLIBC_2.17 + 0
00000001feb8 000d00000402 R_AARCH64_JUMP_SL 0000000000000000 opendir@GLIBC_2.17 + 0
00000001fec0 000e00000402 R_AARCH64_JUMP_SL 0000000000000000 fputc@GLIBC_2.17 + 0
00000001fec8 001100000402 R_AARCH64_JUMP_SL 0000000000000000 snprintf@GLIBC_2.17 + 0
00000001fed0 001200000402 R_AARCH64_JUMP_SL 0000000000000000 __snprintf_chk@GLIBC_2.17 + 0
@ -308,9 +344,9 @@ Offset Info Type Sym. Value Sym. Name + Addend
```
### Statik Yeniden Yerleştirmeler
Eğer **program tercih edilen adresten** (genellikle 0x400000) farklı bir yere yüklenirse, bu adresin zaten kullanılıyor olması veya **ASLR** ya da başka bir sebepten dolayı, statik bir yeniden yerleştirme **işaretçileri düzeltir** ki bu işaretçiler, ikili dosyanın tercih edilen adreste yükleneceğini bekliyordu.
Eğer **program tercih edilen adresten** (genellikle 0x400000) farklı bir yere yüklenirse, bu adresin zaten kullanılıyor olmasından veya **ASLR** gibi başka bir nedenden dolayı, statik bir yeniden yerleştirme **işaretçileri düzeltir**; bu işaretçiler, ikili dosyanın tercih edilen adreste yükleneceğini bekleyen değerler içerir.
Örneğin, `R_AARCH64_RELATIV` türündeki herhangi bir bölüm, yeniden yerleştirme kayması artı ekleme değeri ile adresin değiştirilmesini gerektirir.
Örneğin, `R_AARCH64_RELATIV` türündeki herhangi bir bölüm, yeniden yerleştirme kayması artı ek değer ile adresi değiştirmelidir.
### Dinamik Yeniden Yerleştirmeler ve GOT
@ -318,13 +354,31 @@ Yeniden yerleştirme, bir dış sembole (bir bağımlılıktan bir fonksiyon gib
### Prosedür Bağlantı Tablosu
PLT bölümü tembel bağlama yapmayı sağlar, bu da bir fonksiyonun yerinin çözümlemesinin ilk kez erişildiğinde gerçekleştirileceği anlamına gelir.
PLT bölümü, tembel bağlama yapmayı sağlar; bu, bir fonksiyonun konumunun çözümlemesinin ilk kez erişildiğinde gerçekleştirileceği anlamına gelir.
Bu nedenle bir program malloc çağırdığında, aslında PLT'deki `malloc`'un karşılık gelen konumunu çağırır (`malloc@plt`). İlk kez çağrıldığında `malloc`'un adresini çözer ve bunu saklar, böylece bir sonraki `malloc` çağrıldığında, bu adres PLT kodu yerine kullanılır.
Bu nedenle, bir program malloc'u çağırdığında, aslında PLT'deki `malloc`'un karşılık gelen konumunu çağırır (`malloc@plt`). İlk kez çağrıldığında `malloc`'un adresini çözer ve depolar, böylece bir sonraki `malloc` çağrıldığında, bu adres PLT kodu yerine kullanılır.
#### Sömürmeyi Etkileyen Modern Bağlama Davranışları
- `-z now` (Tam RELRO) tembel bağlamayı devre dışı bırakır; PLT girişleri hala mevcuttur ancak GOT/PLT yalnızca okunabilir olarak haritalanmıştır, bu nedenle **GOT yazma** ve **ret2dlresolve** gibi teknikler ana ikili dosyaya karşı çalışmaz (kütüphaneler hala kısmen RELRO olabilir). Bakınız:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
- `-fno-plt` derleyicinin dış fonksiyonları **GOT girişi üzerinden doğrudan** çağırmasını sağlar, PLT stub'u üzerinden gitmek yerine. `call func@plt` yerine `mov reg, [got]; call reg` gibi çağrı dizileri göreceksiniz. Bu, spekülatif yürütme istismarını azaltır ve PLT stub'ları etrafında ROP gadget avını biraz değiştirir.
- PIE vs statik-PIE: PIE (ET_DYN ile `INTERP`) dinamik yükleyiciye ihtiyaç duyar ve olağan PLT/GOT mekanizmasını destekler. Statik-PIE (ET_DYN `INTERP` olmadan) çekirdek yükleyici tarafından uygulanan yeniden yerleştirmelere sahiptir ve `ld.so` yoktur; çalışma zamanında PLT çözümlemesi beklemeyin.
> Eğer GOT/PLT bir seçenek değilse, diğer yazılabilir kod işaretçilerine geçin veya klasik ROP/SROP'u libc'ye kullanın.
{{#ref}}
../arbitrary-write-2-exec/aw2exec-got-plt.md
{{#endref}}
## Program Başlatma
Program yüklendikten sonra çalıştırma zamanı gelmiştir. Ancak, çalıştırılan ilk kod **her zaman `main`** fonksiyonu değildir. Bunun nedeni, örneğin C++'ta eğer bir **global değişken bir sınıfın nesnesi ise**, bu nesne **main çalışmadan önce** **başlatılmalıdır**, örneğin:
Program yüklendikten sonra çalışması için zamanı gelmiştir. Ancak, çalıştırılan ilk kod **her zaman `main`** fonksiyonu değildir. Bunun nedeni, örneğin C++'ta eğer bir **global değişken bir sınıfın nesnesi ise**, bu nesnenin **main çalışmadan önce** **başlatılması** gerektiğidir, örneğin:
```cpp
#include <stdio.h>
// g++ autoinit.cpp -o autoinit
@ -347,20 +401,30 @@ return 0;
```
Bu global değişkenlerin `.data` veya `.bss` içinde bulunduğunu unutmayın, ancak `__CTOR_LIST__` ve `__DTOR_LIST__` listelerinde başlatılacak ve yok edilecek nesneler saklanır, böylece bunların takibi yapılabilir.
C kodundan aynı sonuca GNU uzantılarını kullanarak ulaşmak mümkündür:
C kodundan, GNU uzantılarını kullanarak aynı sonuca ulaşmak mümkündür:
```c
__attributte__((constructor)) //Add a constructor to execute before
__attributte__((destructor)) //Add to the destructor list
```
Derleyici perspektifinden, `main` fonksiyonu çalıştırılmadan önce ve sonra bu eylemleri gerçekleştirmek için, dinamik bölümde **`INIT`** ve **`FIN`** olarak referans verilecek bir `init` fonksiyonu ve bir `fini` fonksiyonu oluşturmak mümkündür. Bu fonksiyonlar ELF'nin `init` ve `fini` bölümlerinde yer alır.
Bir derleyici perspektifinden, `main` fonksiyonu çalıştırılmadan önce ve sonra bu eylemleri gerçekleştirmek için, dinamik bölümde **`INIT`** ve **`FIN`** olarak referans verilecek bir `init` fonksiyonu ve bir `fini` fonksiyonu oluşturmak mümkündür. Bu fonksiyonlar ELF'nin `init` ve `fini` bölümlerinde yer alır.
Diğer bir seçenek, bahsedildiği gibi, dinamik bölümdeki **`INIT_ARRAY`** ve **`FINI_ARRAY`** girişlerinde **`__CTOR_LIST__`** ve **`__DTOR_LIST__`** listelerine referans vermektir ve bunların uzunluğu **`INIT_ARRAYSZ`** ve **`FINI_ARRAYSZ`** ile belirtilir. Her giriş, argüman olmadan çağrılacak bir fonksiyon işaretçisidir.
Ayrıca, **`INIT_ARRAY`** işaretçileri **önce** çalıştırılacak **işaretçileri** içeren bir **`PREINIT_ARRAY`** olması da mümkündür.
Ayrıca, **`INIT_ARRAY`** işaretçileri **önce** çalıştırılacak **işaretçiler** ile bir **`PREINIT_ARRAY`** olması da mümkündür.
#### Sömürü notu
- Kısmi RELRO altında bu diziler, `ld.so` `PT_GNU_RELRO`'yu salt okunur hale getirmeden önce hala yazılabilir olan sayfalarda yaşar. Eğer yeterince erken bir keyfi yazma elde ederseniz veya bir kütüphanenin yazılabilir dizilerini hedef alırsanız, bir girişi seçtiğiniz bir fonksiyonla üst üste yazarak kontrol akışını ele geçirebilirsiniz. Tam RELRO altında bunlar çalışma zamanında salt okunurdur.
- Çalışma zamanında keyfi sembolleri çözmek için dinamik bağlayıcının tembel bağlama istismarı için, özel sayfaya bakın:
{{#ref}}
../rop-return-oriented-programing/ret2dlresolve.md
{{#endref}}
### Başlatma Sırası
1. Program belleğe yüklenir, statik global değişkenler **`.data`** bölümünde başlatılır ve başlatılmamış olanlar **`.bss`** bölümünde sıfırlanır.
1. Program belleğe yüklenir, statik global değişkenler **`.data`** içinde başlatılır ve başlatılmamış olanlar **`.bss`** içinde sıfırlanır.
2. Program veya kütüphaneler için tüm **bağımlılıklar** **başlatılır** ve **dinamik bağlantı** gerçekleştirilir.
3. **`PREINIT_ARRAY`** fonksiyonları çalıştırılır.
4. **`INIT_ARRAY`** fonksiyonları çalıştırılır.
@ -375,8 +439,35 @@ Her bir thread, bu değişken için benzersiz bir konum tutacaktır, böylece ya
Bu kullanıldığında, ELF'de **`.tdata`** ve **`.tbss`** bölümleri kullanılır. Bunlar, TLS için `.data` (başlatılmış) ve `.bss` (başlatılmamış) gibidir.
Her değişken, boyutu ve thread'in yerel veri alanındaki kullanacağı TLS ofsetini belirten TLS başlığında bir girişe sahip olacaktır.
Her değişken, boyutu ve thread'in yerel veri alanındaki kullanacağı TLS ofsetini belirten bir TLS başlığında bir girişe sahip olacaktır.
`__TLS_MODULE_BASE`, thread yerel depolamanın temel adresine atıfta bulunmak için kullanılan bir semboldür ve bir modülün tüm thread yerel verilerini içeren bellek alanına işaret eder.
## Yardımcı Vektör (auxv) ve vDSO
Linux çekirdeği, çalışma zamanı için yararlı adresler ve bayraklar içeren bir yardımcı vektörü süreçlere iletir:
- `AT_RANDOM`: glibc tarafından yığın canavarı ve diğer PRNG tohumları için kullanılan 16 rastgele bayta işaret eder.
- `AT_SYSINFO_EHDR`: vDSO haritalamasının temel adresi ( `__kernel_*` sistem çağrılarını ve gadget'ları bulmak için kullanışlı).
- `AT_EXECFN`, `AT_BASE`, `AT_PAGESZ` vb.
Bir saldırgan olarak, eğer `/proc` altında bellek veya dosyaları okuyabiliyorsanız, genellikle hedef süreçte bir bilgi sızıntısı olmadan bunları sızdırabilirsiniz:
```bash
# Show the auxv of a running process
cat /proc/$(pidof target)/auxv | xxd
# From your own process (helper snippet)
#include <sys/auxv.h>
#include <stdio.h>
int main(){
printf("AT_RANDOM=%p\n", (void*)getauxval(AT_RANDOM));
printf("AT_SYSINFO_EHDR=%p\n", (void*)getauxval(AT_SYSINFO_EHDR));
}
```
`AT_RANDOM`'ın sızdırılması, o işaretçiyi dereferanslayabilirseniz size canary değerini verir; `AT_SYSINFO_EHDR` ise gadget'lar için madencilik yapmak veya hızlı sistem çağrılarını doğrudan çağırmak için bir vDSO tabanı sağlar.
## References
- ld.so(8) Dinamik Yükleyici arama sırası, RPATH/RUNPATH, güvenli yürütme kuralları (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
- getauxval(3) Yardımcı vektör ve AT_* sabitleri: https://man7.org/linux/man-pages/man3/getauxval.3.html
{{#include ../../banners/hacktricks-training.md}}