System call dediğimizde kernel tarafından user-space programlarına sunulan fonksiyonları anlarız. En basitinden C' de bir program yazdığımızda printf kullanarak ekrana basarız. Bu printf standart c library sinde geliyor ve kendi içinde o da system call(printf, write system call unu çağırıyordur herhalde) yapıyor. Bunu strace adlı tool ile görebilirsiniz.
Çalışan sisteminizde hangileri var ve hangi modüle ait olduğunu görmek için /proc/kallsyms e bakabilirsiniz.
Bu system call lar sys_call_table'ında tutulur. Mesela "open" system call unu değiştirmek istiyoruz, naparız? Yeni bir modül yazıp kendi open fonksiyonumuzu yazdıktan sonra sys_call_table a yeni yazdığımız open fonksiyonunu göstermek yeterlidir. Bundan sonra her open çağırıldığında(c de fopen çağırınca çağırılır mesela) bizim fonksiyonumuz çağırılacak. Herşey ne güzel değil mi? Ama Linux 2.6 dan itibaren sys_call_table export edilmiyor bu yüzden böyle şeyler yapamıyoruz artık. Tabi kernel i patch edersek o ayrı :)
Bunun kaldırılma nedeni elbette güvenlik değil, çünkü modül yükleyebiliyorsak zaten root kullanıcısıyız demektir ve herşeyi yapabiliriz. Bunun kaldırılma nedeni iyi yazılmayan modüller veya birbirinden habersiz aynı şeyi değiştirmeye kalkan farklı modüller gibi daha bir çok neden üretilebilir. Sistemimizin unstable bir duruma girmesini istemeyiz değil mi? :-)
Kaydol:
Kayıt Yorumları (Atom)
Hiç yorum yok:
Yorum Gönder