Application Security & Debugging – 2

Geçen yazı da genel olarak debugging konusuna bir giriş yapmıştık ve stabil çalışmayan uygulamaların temel olarak sistemlere etkilerinden söz etmiştik. Bu yazı da devam niteliğinde “signal” kavramından bahsetmeye çalışacağım.

Sinyaller işletim sistemleri tarafindan belirlenen ve süreçlerin birbirleriyle iletişim halinde olmalarını sağlayan kavramlardır, aynı zamanda bir süreç kendi içerisinde kendine sinyal gonderebilir ve genel anlamda asenkron olarak çalışmaktadırlar.Sinyaller işletim sistemimlerine göre değişmektedir, Windows sistemler uzerinde Unix işletim sistemine göre daha az signal vardir. Aşagıda Linux işletim sistemi üzerinde saglanan “signal” bir listesi yer almaktadır.


1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8 ) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Assembly ile yazdığınız kodlarda bir çok kez “illegal instruction” hatasi ile karsilasmisizdir ve debug islemi esnasinda “SIGILL” sinyali buna işaret etmektedir. Yahut SIGINT signal ile konsol üzerinde (Ctrl-C) kesme gönderdiğiniz olmuştur işte tüm bunlar süreçlerin akışını etkileyecek etkenlerdir. Örneğin, grsec kernel patch, olası atakları “SIGSEGV” takibi ile yapmaktadır. Muhtemel hafıza sorunları yani “segmentation fault” tespiti bu sayede olmaktadır.

Program terminated with signal 11, Segmentation fault.
#0 0x00007f44154a7fdb in ?? ()

#0 0x0013a2c2 in abort () from /lib/tls/libc.so.6
#1 0x0016c4ea in __libc_message () from /lib/tls/libc.so.6
#2 0x00172c6f in _int_free () from /lib/tls/libc.so.6
#3 0x00172fea in free () from /lib/tls/libc.so.6
#4 0x01287c44 in php_error_cb (type=1, error_filename=0xc36f894 "theme.php(10) : eval()'d code",
error_lineno=9, format=0x1570b84 "Maximum execution time of %d second%s exceeded",
args=0xa0f6195c "36") at /tmp/php-5.2.13/main/main.c:836
#5 0x012c8b2a in zend_error (type=1,
format=0x1570b84 "Maximum execution time of %d second%s exceeded")
at /tmp/php-5.2.13/Zend/zend.c:976
#6 0x012bd76d in zend_timeout (dummy=27) at /tmp/php-5.2.13/Zend/zend_execute_API.c:1347
#7
#8 0x00175030 in malloc () from /lib/tls/libc.so.6
#9 0x00179cd0 in strdup () from /lib/tls/libc.so.6
#10 0x012879e7 in php_error_cb (type=2, error_filename=0xc36f894 "theme.php(10) : eval()'d code",
error_lineno=9, format=0x15723f4 "%s%s%s(): supplied argument is not a valid %s resource",
args=0xa0f61d48 "ŃKT01ŃKT01OjT01FŽU01x35ö 01") at /tmp/php-5.2.13/main/main.c:845

Doğrudan sinyal kaynakli problemlerin yakalanması nispeten daha zordur, GDB ile signal’a gösterilecek tepkinin ayarlanması mümkündür.

(gdb) handle SIGSEGV print nostop pass
Signal Stop Print Pass to program Description
SIGSEGV No Yes Yes Segmentation fault

Exception’lar istenmeyen durumların yakalanması için kullanılan ve bir çok programlama diline implement edilmiş bir özelliktir. C++ bunlardan biridir. Exception genel olarak aynı süreç içerisinde  oluşma “throw” ve sonlanma “caught aşamasından oluşmaktadır. GDB bu tip hataların incelenmesi aşamasında önemli görevler üstlenebilmekte. GDB konsolda catch throw ile hata bloguna atıldığı anda debugger’ın tepki vermesini sağlayabilirsiniz veya hatanın oluşması anında inceleme yapabilmek için catch catch komutu kullanılabilir.

(gdb) catch throw
Catchpoint 2 (throw)
(gdb) catch catch
Catchpoint 3 (catch)
(gdb) cont
Continuing.
Catchpoint 2 (exception thrown), 0x00007ffff7b8f9e0 in __cxa_throw () from /usr/lib/libstdc++.so.6
(gdb) where
#0 0x00007ffff7b8f9e0 in __cxa_throw () from /usr/lib/libstdc++.so.6
#1 0x0000000000400afd in f1() ()
#2 0x0000000000400b3e in main ()

Yukarıda görüldüğü gibi catch ve throw komutlari runtime library yuklendikten sonra çalışmaktadır, komutları vermeden önce sürecin çalıştığından emin olmak gerekmekte.Aynı işlemi Windows işletim sistemi üzerinden yapmak mümkün, kullandığınız IDE veya debugger’a göre bu işlem tabii ki değişecektir.