Neden Trambolin Kullanıyoruz? - Bilgi Danışma Merkezi - Sizlere Kaliteli Bilgiler Sunar !
Neden Trambolin Kullanıyoruz?
2 Kasım Bilgisayar kategorisinde ♦kt (8.7k puan) sordu
Diyelim ki hedef süreçteki MessageBoxA apisini kancalayacağız ve bunu yönlendirme’ye kendi istediğimiz argümanları geçirip öyle çağırmak istiyoruz. Bu işlemi yonlendirme fonksiyonumumuzun içinde yapmamız sonucu sonsuz yinelemeye girecek ve durum stack taşmasıyla sonuçlanacaktır. MessageBoxA yı yönlendirme fonksiyonumuz içinden çıkartabiliriz ama eğer MessageBoxA’ya erişen başka iş parçacıkları varsa bu bir yarış durumuna neden olacak ve muhtemelen programın çökmesiyle sonuçlanacaktır. Bu gibi sorunları engellemek için şöyle bir şey yapacağız; Öncelikle hedef süreçteki MessageBoxA apisinin ilk 5 byte’nı depolayacağız, ihtiyaç durumunda kancasız olan bu komutları çalıştırabiliriz.
İlk 5 byte ekstrem talimatlar olmadığı sürece yürütmede bir problem çıkmayacaktır. Çözmemiz gereken başka bir problem de fonksiyonun ilk 5 byte’nın tüm komut setini içermemesi. Örnekte fonksiyonun ilk 5 byte 3 talimattan oluşmakta.
Eğer programın ilk talimatı 10 byte olsaydı ve biz 5 bytelik alan depolamış olsaydık, bu sefer çağrı eksik talimatlar ile yürütülmeye çalışacak ve bom! Bunu engellemek için bütün talimatların uzunluğunu kontrol edebileceğimiz bir disassembler kullanacağız. Senaryodaki en iyi durum ilk talimatların tam olarak 5 byte tutmasıdır, en kötü durum da ise ilk set için 4 byte ikinci komut seti için 16 (x86 komut setinin maksimum uzunluğu dahilinde) byte’lık daha yer gerekecek, 4 + 16 = 20 byte ve 5 byte’da kanca işlevinde geri gitmek için yani toplamda 25 byte’lik bir alana ihtiyacımız olacak.
Öncelikle kancalanan fonksiyonu yönlendirebileceğimiz bir yonlendirici fonksiyon tanımlamamız gerekiyor. Bu hedefle aynı çağrı kuralı, dönüş tipi ve parametrelere sahip olacak. Örneğimizde kancalanan hedef MessageBoxA fonksiyonun parametrelerini çekip ekrana print edecek bir işlev yazacağız., print işleminden sonra Asıl MessageBoxA’nın yedeklediğimiz eskiMessageBoxA yı çağırarak normal bir çağrı işlevini de tamamlamış olacağız.
eskiMessageBox kanca işlevinin trambolinini depolayacağı 25 byte’lık bir alana işaret eden bir tür olarak tanımlıyoruz..
Kanca fonksiyonu için aşağıdaki parametreleri tanımlayıp kullanacağız.
1-) isim = Kanca fonksiyonunun ismi.
2-) dll = Hedef fonksiyonun dll’si.
3-) yonlendir = Yönlendirici fonksiyona bir gösterici. (yeniMessageBoxA)
4-) original = Trambolinin depolanacağı 25 byte’lık bir alana işaret eden işaretçi.
5-) uzunluk = Tramboline depolanan talimatların byte değerini tutan bir işaretçi.
Kanca fonksiyonunun içinde hedef fonksiyonun adresini alacağız, her talimatın uzunluğunu öğrenmek için bir disassembler ek kütüphanesini projeye dahil edeceğiz. hde32_disasm’ı parametrenin işaret ettiği talimatların uzunluğunu döndürür.
<img src=" " style='bac
22 Mayıs Bilgisayar kategorisinde ♦kt (8.7k puan) sordu
Telnet Protokolü Neden Güvenli Değil ?
Torku neden Cola Üretmiyor ?
7 Mart Alışveriş ve Gıda kategorisinde ♦kt (8.7k puan) sordu
MikroPascal ile STM32F4 Discovery USB HID arasında Bağlantı kurma
4 gün önce Bilgisayar kategorisinde ♦kt (8.7k puan) sordu
Removable Çıkarılabilir Disk Listesi Alma Kodu
12 Kasım Bilgisayar kategorisinde ♦kt (8.7k puan) sordu
Today Visits : 1173
All Visits : 407349