Advertisement
emin_int11

istədim komment yazım məqalə oldu :D

May 29th, 2016
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.61 KB | None | 0 0
  1. Pointer sadə dildə desək hər hansı bir dəyərin digər dəyərə adres istifadə edərək istinad etməsidir. Əməliyyat 2 operatordan ibarətdir. Reference və Dereference operatorları. Pointer yaddaşda bir yere istinad edərək dəyər əldə edir (address) və həmçinin əldə edilən dəyəri (address) dereference edərək alınmış value hər hansı bir nöqtədə yerləşdirir. Belə bir deyişdə var )) kitab indeksində qeyd edilmiş səhifə nömrəsi pointer olaraq düşünülə bilər (address). Data primitive və yaxud data aggreagate əməliyyatlarından fərqli olaraq pointer referencing üçün memory address olaraq istifadə edilir. Buna görədə pointer-lar data read və write əməliyyatlarından fərqli olaraq istifadə olunan arxitekturadan aslı olaraq byte addressable və yaxud word addressable ola bilər yəni:
  2.  
  3. pointer === > 0xfeedbeef (Intel x86 = 4 byte (2^32) without PAE)
  4. word alignment
  5.  
  6. yəni reference olaraq address istifadə edildi.
  7. Bir misalda assemblerdə müxtəlif addressing modları/formları var. Bunlardan biridə absolute addressing modudur. Əlimizdə eax registeri var və bu registerdə 0x41414141 dəyəri var direct addressing istifadə etsək əgər bu zaman:
  8. mov ebx,[eax] = bu zaman 32 bitlik absolute address istifadə edərək (adresimiz budur 0x41414141) bu memory addresdeki dəyəri ebx-ə movement etdik.
  9.  
  10. C syntax qayıtsaq.
  11.  
  12. #include <stdio.h>
  13. #include <stdint.h>
  14. void main(){
  15. uint32_t *test=0x41414141;
  16. *test=1;
  17. }
  18.  
  19. uint32_t *test=0x41414141;
  20. 0x00000000004004f1 <+4>: mov QWORD PTR [rbp-0x8],0x41414141
  21. 0x00000000004004f9 <+12>: mov rax,QWORD PTR [rbp-0x8]
  22. *test=1;
  23. <main+16> mov DWORD PTR [rax],0x1 ← $pc
  24. son əməliyyatdan sonra exception generasiya olundu (page fault) çünki bu address bizim pricess space-də allocate edilməyib və yaxud digər process space aid bir address-dir. Addressləmə mexanizmlərində bu kimi problemlər çox ola bilər digər bir ssenari kimi deyə bilərəmki 64 bit arxitekturada üst addres limit cəmi 48 bitə qədər qalxıb. Buda canonical form olaraq qeyd edilir əgər pointer reference etdiyi address noncanonical address olarasa bu zamanda GPF (general protection fault) exception generasiya olacaq. Pointerin istifadə sahələridə çoxdur. Hər hansı bir file offset, array indekslərində və yaxud object reference-lərdə istifadə edilir. Optimal variant olaraqda ələ alına bilir misal üçün: (çox dərinə getmədən)
  25. array əməliyyatları apararkən saxlanan dəyərlər üçün lookup table (linear searching or bruteforce searching) hazırlamaq əvəzinə birbaşa address hesablama əməliyyatı aparmaq performans üçün daha üstündür. Təbii ki bunu biz yox compiler edir (performance optimization stage-də). Misal olaraq baxaq:
  26. Intel instruction format-da addressing form olaraq (index into a array) (index*scale)+displacement SIB modu verilib yəni yaddaş üzərində
  27. 0x40 = [AA,BB,CC,DD] olan array
  28. 2 4 6 8
  29. 0x40+(4*2)=0x48 `address hesablama nəticəsi.`
  30. artıq burada göründüyü kimi address hesablama əməliyyatı vasitəsi ilə indeksin addressi tam olaraq əldə edildi. Yaxud digər istifadə tərəfi kernel developing sırasında misal üçün frame buffer portion yerləşir memory üzərində və bura display frame-lərin yerləşdirilməsi üçün pointer istifadə edilir həmçinin. Misal:
  31. char *fb = (char *) 0x000B8000;
  32. fb[i] = 0x41; (print "A")
  33. fb[i + 1] = ((0 & 0x0F) << 4) | (9 & 0x0F);
  34.  
  35.  
  36. Həmçinin OOP based misallar çoxdur Virtual method table yaxud Destructor/Constructor və s.
  37.  
  38. Gələk secure və insecure tərəflərinə
  39. `linked list` data strukturasından istifadə edərək bir memory allocator hazırlamışdım və həmçinin bildiyimz heap allocator-da var sadəcə (doubly linked list) burada bir nodun digər noda reference edilməsi üçün pointer reference istifadə edilir.
  40.  
  41. struct beef{
  42. char data[22];
  43. struct heap *next;
  44. };
  45.  
  46. allocate sonrası data space istifadə üçün bizim processe təqdim edilir. Ancaq bilinən Heap overflow texnikalarında üstünlük yaranır ki, əgər attacker data space-i 22 byte-dan doldurarsa next reference overwrite edə bilər bu anda da attacker proqram axışını istədiyi addressə yönləndirə bilər ortayada böyük bir təhlükə çıxır. Bu mövzular ümümiyyətlə çox uzun mövzulardır compiler-dən aslı olaraq pointer mexanizmi birçox yerlərdə istifadə oluna bilər. Bildiyimiz kimidə C və C++ dilləri architecture depended dillər olduğun görə computer architecture-sı haqqında da informaisyanız olsa daha yaxşı başa düşmək olar. Uğurlar.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement