Blackhat.az

Loading...

Blackhat.az

Register

Cyber Security - Digital Forensics - Hacking - Pentest - Information Gathering - Social engineering - 01 March 2021

İstismardan Əvvəl – 1: Yaddaş Haqqında

Sadə ifadə ilə n, yaddaş yazma və oxuma əməliyyatları kimi əməliyyatların yerinə yetirildiyi elektron bir aparatdır. PC avadanlığında bir çox yaddaş mexanizmi istifadə olunur. Bu yazıda, növbəti məqalədə RAM (Random Access Memory) və qeydlərə diqqət yetirəcəyik. RAM kimi tanınan təsadüfi giriş yaddaş sahələri müvəqqəti yaddaş sahələridir və prosessora yaxın işləyən aparatla işləyən bir sahədir. Qeydlərdən sonra ən sürətli işləyən yaddaş sahəsidir. Bu sahələrdəki məlumatlar müvəqqəti məlumatlardır. Fiziki cihazın gücü kəsildikdə, içindəki məlumatlar itir.

Virtual Yaddaş

Virtual yaddaş mexanizmi fiziki yaddaş sahəsinin ölçüsündən asılı olmayaraq hər işləyən proses üçün yaddaş sahəsi təmin edən bir mexanizmdir. Bu quruluşa görə bir tətbiq işlədildikdə, fiziki yaddaş boşluğundan asılı olmayaraq, o müddət üçün geniş və istifadə edilə bilən bir yaddaş sahəsi ayrılır. Faktiki olaraq ayrılan bu yaddaş sahəsi əməliyyat sistemi tərəfindən idarə olunur.

Virtual yaddaşın (Wikipedia) istifadəsinin iki əsas səbəbi var:

  • Proqramların yerləşdirilməsi, effektiv və etibarlı şəkildə proqramlar arasında yaddaşın bölüşdürülməsi.
  • Məhdud əsas yaddaşın proqramlaşdırma və istifadə çətinliklərini aradan qaldırmaq.

Bu səbəbdən bu məqalədə və sonrakı məqalələrdə istifadə etdiyimiz ünvanlar, virtual yaddaş mexanizminə aid ünvan dəyərləridir.

Yaddaş seqmentasiyası

Əməliyyat sistemində aparılacaq hər bir əməliyyatın əməliyyat zamanı yaddaşdakı öz boşluğuna ehtiyacı var. Proses üçün ayrılmış bu yaddaş sahəsi, əməliyyat sistemi tərəfindən müxtəlif məqsədlər üçün istifadə ediləcək hissələrə bölünür. Bu bölmələr haqqında qısaca danışaq

. mətn seqmenti

Bu yaddaş sahəsi ikili faylın kodlarının saxlandığı yaddaşdır. Bu sahədə tətbiqin maşın kodları şəklində mövcuddur. Tətbiq işlədildikdə, prosessor proqram sayğacı vasitəsilə bu sahədəki kodları işləyərək tətbiqetmə əməliyyatını həyata keçirir.

. məlumat seqmenti

Qlobal olaraq təyin olunan və bu sahədə yazdığınız proqramda ilk dəyər verilən dəyişənlər var.

.bss seqmenti

Bu sahədə, .data seqmentində olduğu kimi, qlobal olaraq təyin olunan dəyişənlər saxlanılır. Lakin kodlaşdırma zamanı bu dəyişənlər ilk dəyəri ala bilmədi.

Yığın seqmenti

Yığın sahəsi proqramın icrası zamanı dinamik istifadə olunan bir sahədir. Bu sahənin istifadəsi proqramçı tərəfindən idarə olunur. Proqram bunu yoxlayarkən malloc (), new () kimi ayırıcı funksiyalarından istifadə etməlidir.

Yığma seqmenti

Bu sahə tətbiqetmə işləyərkən istifadə edilən xüsusi bir sahədir. İşləyən funksiyaların müvəqqəti dəyərləri bu ərazidə saxlanılır. Sistemdə bir funksiya yaradıldıqda, yığında bu funksiya ilə əlaqəli bir sahə yaranır. Funksiyanın icrası başa çatdıqdan sonra həmin funksiyanın yaddaş sahəsi istifadə olunmur və yığın buna görə yenidən düzəldilir. Bu sahənin proqramçı tərəfindən idarə olunmasına ehtiyac yoxdur. Digər yaddaş sahələrindən fərqli olaraq yığın yüksək ünvan sahəsindən aşağı ünvan sahəsinə qədər böyüyür.

Yuxarıda qeyd etdiyimiz yaddaş sahələri ilə aşağıdakı kod parçasına baxdığımızda daha yaxşı başa düşüləcəkdir.

1. #include <stdio.h>
2. char g_varData = 0; // Data segment
3. char g_varBSS; // BSS Segment
4. int main()
5. {
6. int varStack = 10; // Stack
7. static int s_var1 = 12; // Data Segment
8. static int s_var2; // BSS Segment
9. int *ptrHeap; // Heap
10. ptrHeap = (int*)malloc(sizeof(int));
11. return 0;
12. }
Bu kod parçasının dəyişən ünvan dəyərlərinə baxaq. Kodu GDB ilə işləyək və dəyişən ünvanları əldə edək.
root@kali-x86:~# gdb a.out -q
Reading symbols from /mnt/hgfs/D/VM_DATA/codes_and_examples/www.cihatyildiz.net/a.out…done.
(gdb) list
1 #include <stdio.h>
2
3 char g_varData = 0; // Data segment
4 char g_varBSS; // BSS Segment
5
6 int main()
7 {
8 int varStack = 10; // Stack
9 static int s_var1 = 12; // Data Segment
10 static int s_var2; // BSS Segment
11 int *ptrHeap; // Heap
12
13 ptrHeap = (int*)malloc(sizeof(int));
14
15 return 0;
16 }
(gdb) break 15
Breakpoint 1 at 0x804843d: file memory_segment.c, line 15.
(gdb) p &g_varData
$1 = 0x8049684 “”
(gdb) p &g_varBSS
$2 = 0x804968c “”
(gdb) p &varStack
$3 = (int *) 0xbffff45c
(gdb) p ptrHeap
$4 = (int *) 0x804a008
(gdb) p &s_var1
$5 = (int *) 0x804967c
(gdb) p &s_var2
$6 = (int *) 0x8049688
(gdb) info registers eip
eip 0x804843d 0x804843d <main+33>
(gdb)
GDB istifadə edərək işləyən tətbiqdə dəyişən ünvanları görə bilərik. Bu vəziyyətdə yazdığımız kodu yuxarıda göstərdiyimiz forma ilə əlaqələndirə bilərik. Bu rəqəmlə dəyişənlərin yaddaşdakı mövqeləri daha yaxşı başa düşülə bilər.