C ikilileri: ELF, bağlama ve sertleştirme
Derlenmiş bir C programının ELF yapısını, bağlanmasını ve bellekte yerleşimini inceler, ASLR, NX, RELRO ve seccomp gibi korumalarla sertleştirilmiş sürümler çıkarırsın.
Seviye 501 · 19 ders · 18 pratik lab
Dersler
ELF ve bağlama
- ELF dosyasının anatomisi: readelf ve objdump
- Bölümler ve bölütler: .text, .data, .bss
- Semboller ve yeniden konumlandırma
- Dinamik bağlama: PLT, GOT ve ld.so
- LD_PRELOAD ile işlev sarmalamak ve riskleri
- Kısa görev: bir ikili dosyanın künyesini çıkar
Çalışma zamanı belleği
- Süreç bellek haritası: /proc/self/maps
- Yığın çerçeveleri ve çağrı kuralları (x86-64)
- malloc’un içi: parçalar, kutular ve tcache
- Kendi bellek ayırıcını yazmak: arena ve havuz
- Kısa görev: ayırıcını sanitizer ve testlerle doğrula
Sertleştirme
- ASLR ve PIE: adresleri tahmin edilemez yapmak
- Yığın koruyucular ve çalıştırılamaz bellek (NX)
- RELRO ve BIND_NOW
- Denetim akışı bütünlüğü ve gölge yığın (CET)
- checksec ile ikilileri denetlemek
- seccomp ile sistem çağrısı süzgeci
- Kısa görev: aynı programı farklı korumalarla derle ve karşılaştır
Bitirme
- Bitirme görevi: sertleştirilmiş ve denetlenmiş bir sürüm yayınla
Pratik lablar
- Bölüm boyutlarını readelf ile çıkarmak: Bir ikilinin .text, .data ve .bss boyutlarını readelf ile bul ve bir global dizinin hangi bölüme düştüğünü açıkla.
- ELF başlığını C ile okumak: elf.h kullanarak bir dosyanın sınıfını, makine türünü ve giriş noktasını yazdıran, bozuk dosyaları reddeden aracı yaz.
- Dışa açılan sembolleri azaltmak: Bir paylaşılan kütüphanenin gereksiz dışa açık sembollerini visibility ayarlarıyla gizle ve nm ile doğrula.
- Yer değiştirme kayıtlarını yorumlamak: Bir nesne dosyasındaki yer değiştirme kayıtlarını listeleyip hangi çağrının bağlayıcı tarafından çözüleceğini raporla.
- PLT ve GOT girişlerini izlemek: Bir programın puts çağrısının PLT ve GOT üzerinden nasıl çözüldüğünü gdb ile adım adım göster ve not al.
- LD_PRELOAD ile test için saat sahtelemek: Testlerde sabit zaman döndüren bir LD_PRELOAD kütüphanesi yaz ve bu tekniğin ayrıcalıklı programlardaki riskini açıkla.
- Eklenti yükleyicisini güvenli yapmak: Göreli yoldan dlopen yapan eklenti yükleyicisini mutlak yol, sahiplik ve izin kontrolleriyle sağlamlaştır.
- Basit bir bölge ayırıcısı yazmak: Hizalamayı koruyan ve tek seferde serbest bırakılan bir bölge ayırıcısı yaz; ayrılan adreslerin hizalı olduğunu test et.
- Sabit boyutlu havuz ayırıcısı: Serbest liste kullanan sabit boyutlu bir havuz ayırıcısı yaz ve çift serbest bırakmayı tespit edip raporla.
- Kendi ayırıcını ASan ile görünür yapmak: Havuz ayırıcısına ASan zehirleme makrolarını ekle ve serbest bırakılmış bloğa erişimin yakalandığını göster.
- PIE olan ve olmayan ikiliyi karşılaştırmak: Aynı programı PIE ile ve PIE olmadan derleyip /proc/self/maps adreslerinin çalıştırmalar arasında nasıl değiştiğini kaydet.
- Tam RELRO ile derlemek: Bir hizmet ikilisini tam RELRO ve BIND_NOW ile derleyecek şekilde Makefile'ı güncelle ve checksec ile kanıtla.
- Sürüm ikililerini denetlemek: Beş ikiliyi checksec ile tarayıp eksik korumaları bul, derleme ayarlarını düzelt ve önce-sonra tablosu üret.
- Basit bir seccomp izin listesi: Yalnızca read, write ve exit çağrılarına izin veren bir seccomp filtresi kur ve yasaklı çağrıda sürecin durduğunu göster.
- Ayrıştırıcıyı seccomp ile kafese almak: Dosyayı açtıktan sonra ayrıştırma aşamasına seccomp filtresi uygula ve ayrıştırıcının yeni dosya açamadığını test et.
- Eksik sistem çağrısını strace ile bulmak: Seccomp filtresi eklenince çöken servisin hangi çağrıya ihtiyaç duyduğunu strace ile bul ve listeyi en az yetkiyle güncelle.
- Tanımsız ve dışa açık simgeleri listelemek: nm çıktısını işleyip bir paylaşımlı kitaplığın dışa açtığı ve dışarıdan beklediği simgeleri iki ayrı listede veren küçük aracı tamamla.
- Sürüm betiğiyle genel arayüzü sabitlemek: Bağlayıcı sürüm betiği yazarak kitaplığın yalnızca belgelenen işlevlerini dışa aç ve eski derlenmiş programın hâlâ çalıştığını doğrula.
Kurs hakkında
Derlenmiş bir C programının ELF yapısını, bağlanmasını ve bellekte yerleşimini inceler, ASLR, NX, RELRO ve seccomp gibi korumalarla sertleştirilmiş sürümler çıkarırsın.
Ne öğreneceksin
- ELF ve bağlama
- Çalışma zamanı belleği
- Sertleştirme
- Bitirme
Ön koşullar
Aynı yolun 401 düzeyine kadar olan konularında deneyimli olmalısın.
Lab ortamı
Dersler, tarayıcında açılan sana özel bir Kali Linux terminalinde geçer. Kurulum gerekmez; lab her derste temiz başlar.
Sık sorulan sorular
- Bu kurs benim düzeyime uygun mu?
- Kurs 501 düzeyindedir; daha düşük düzeydeki kursların konularını bildiğin varsayılır.
- Kurulum gerekir mi?
- Hayır. Her ders tarayıcında açılan sana özel bir lab ortamında geçer.
- Dersler nasıl işleniyor?
- Her ders 8 ile 10 adımdan ve bir kısa sınavdan oluşur. İlk adımlarda yazman gereken komut gösterilir, sonraki adımlarda yardım azalır; iki denemede takılırsan çözüm açılır.
- Ücretsiz deneyebilir miyim?
- Evet. Her kursun ilk üç dersi ücretsizdir.