Buffer Overflow Zaafiyeti Olan Program Geliştirme
Bu yazıda basitçe buffer overflow zaafiyetine sebep olabilecek örnek bir C programı yazımı anlatılacak ve daha sonra exploit edebilmek amacıyla çeşitli yorumlar yapılacaktır.
Programı basitçe anlatmak gerekirse bir tane komut satırı parametresi alacak ve bunu bir karakter dizisinde saklayacak, ardından sakladığı bu değeri ekrana basacaktır.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int bar(char *arg, char *out)
{
strcpy(out, arg);
return 0;
}void foo(char *argv[])
{
char buf[256];
bar(argv[1], buf);
fprintf(stdout,"%s",buf);
}int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "target1: argc != 2\n");
exit(EXIT_FAILURE);
}
setuid(0);
foo(argv);
return 0;
}
Fonksiyonlara hızlıca göz atacak olursak foo
fonksiyonu komut satırı parametrelerini alıp bar
fonksiyonunu çağırıyor. Bu fonksiyon da strcpy fonksiyonunu kullanarak kullanıcının girmiş olduğu komut satırı parametresini ilgili bellek alanına kopyalamaktadır.
İşte buffer overflow zaafiyetine sebep olan durum da burada gözükmektedir. Kullanıcıdan gelen değerin uzunluğu 256'dan fazlaysa bellek taşacak ve kullanıcı izni olmayan alanlara erişebilecektir. Buffer overflow saldırısına hedef olabilecek bir C programının kaynak kodlarını inceledik yazı dizisinin ilerleyen adımlarında bu uygulamada bulunan zaafiyeti nasıl keşfedip kullanacağımıza değineceğiz.
Buffer overflow’un ne olduğu ile ilgili temel bilgileri almak için daha önce yazdığım blog yazısını ve Stanford CS155 dersinin materyallerini takip edebilirsiniz.