Ortam değişkenlerinin yeri neden bu kadar değişiyor?


9

Hacking: Sömürü Sanatı kitabını okurken Jon Erickson, SHELLCODEbir programı kullanmak için bir ortam değişkeninin adresini tahmin etmeye çalışıyorum .

Ben her çalıştırıldığında getenv("SHELLCODE");yerini almak için, sonuç tamamen farklıdır.

Kabuğumdan çıkar:

> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3

Program adı değiştirilirse veya yeni ortam değişkenleri eklenirse, konumun biraz farklı olacağını, ancak konumun neden bu kadar değiştiğini anlıyorum.


getenvManuel o değişkenin değeri içeren bir dize bir gösterici ile döner diyor. Diğer her şey belirtilmedi, bu nedenle çekirdek ve / veya derleyiciniz, işaretçi vaadi doğru kaldığı sürece değeri istedikleri yere yapıştırabilir. Bunun kesin cevabının ağır sihirbazlık olabileceğini ve çeşitli bellek haritalama uygulama detaylarına ve ayın evresine bağlı olabileceğini tahmin ediyorum . (Sana kesin cevabı verecek kadar sihirbaz değilim.)
Anko

"Program adı değiştirilirse veya yeni ortam değişkenleri eklenirse, konumun biraz farklı olacağını, ancak konumun neden bu kadar değiştiğini anlıyorum." Bu mümkün olan en basit uygulamalarda doğrudur, ancak kesinlikle gerekli değildir.
dmckee --- ex-moderatör kedi yavrusu

Yanıtlar:


13

Açıkladığınız şey Adres Alanı Düzeni Rastgeleleştirme (ASLR) adı verilen bir istismar önleme özelliğidir . Temel olarak, çekirdek, programın ELF dosyasını diskten her yüklediğinde, bir programın işlev çağrısı yığınının en üst adresini biraz farklı ("rasgele") bir adrese koyar. argvKabuk kodunuzun bir olduğu adresler ve ortam değişkenleri, her bir program çağrısıyla değişen bir adrese dönüşür.

ASLR'nin arabellek taşmalarından ve yığınla ilgili diğer güvenlik açıklarından yararlanmayı zorlaştırması beklenir. Sömürücü, işlev çağrısı yığınındaki değişkenlerin ve değerlerin değişen adreslerini hesaplamak veya kod yazmak zorundadır.

ASLR'yi aşağıdaki gibi bir şey yaparak devre dışı bırakabileceğiniz anlaşılıyor:

echo 0 > /proc/sys/kernel/randomize_va_space

kök kullanıcı olarak. Alıntı Ubuntu'yu açıkça belirttiğiniz için yukarıdaki komut farklıdır:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

Evet, bu işe yaradı. Kitap yazarının henüz ASLR'si olmayan Ubuntu 10.04 kullandığını fark ettim.
Janman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.