5.10 ספריות משותפות תרגול
תרגול - ספריות משותפות¶
תרגיל 1 - בדיקת ספריות עם ldd¶
השתמשו בפקודה ldd כדי לבדוק את הספריות המשותפות של שלוש תוכניות:
- /bin/ls
- /bin/bash
- /usr/bin/python3
ענו על השאלות:
1. אילו ספריות משותפות משותפות לכל שלוש התוכניות?
2. מה הנתיב של הdynamic linker שמופיע ברשימה?
3. מה זה linux-vdso.so.1 שמופיע בכולן?
תרגיל 2 - השוואת סטטי מול דינמי¶
כתבו תוכנית פשוטה בC שמדפיסה "Hello World" עם printf.
- קמפלו אותה בצורה דינמית (ברירת מחדל):
gcc -o dynamic_hello hello.c - קמפלו אותה בצורה סטטית:
gcc -static -o static_hello hello.c - השוו את גודל שני הקבצים עם
ls -la - הריצו
lddעל שניהם - מה ההבדל? - הריצו
fileעל שניהם - מה ההבדל בפלט?
תרגיל 3 - יצירת ספריה משותפת¶
צרו ספריה משותפת בשם libmath.so שמכילה שתי פונקציות:
- int add(int a, int b) - מחזירה a + b
- int multiply(int a, int b) - מחזירה a * b
ואז:
1. כתבו את הקוד של הספריה (math_lib.c)
2. קמפלו אותה לספריה משותפת עם -shared -fPIC
3. כתבו תוכנית ראשית (main.c) שמשתמשת בשתי הפונקציות
4. קמפלו את התוכנית הראשית עם -L. -lmath
5. הריצו עם LD_LIBRARY_PATH=.
6. וודאו עם ldd שהתוכנית תלויה ב-libmath.so
תרגיל 4 - טעינה דינמית עם dlopen¶
כתבו תוכנית בC שעושה את הדברים הבאים:
1. טוענת את הספריה libm.so.6 בזמן ריצה עם dlopen
2. מחפשת את הפונקציה cos עם dlsym
3. קוראת ל-cos עם הערך 0 ומדפיסה את התוצאה
4. קוראת ל-cos עם הערך 3.14159265 ומדפיסה את התוצאה
5. משחררת את הספריה עם dlclose
שימו לב: קמפלו עם
-ldlכדי לקשר עם ספריית dl.
תרגיל 5 - שאלת הבנה¶
הסבירו במילים שלכם:
1. מה היתרון האבטחתי של ASLR (Address Space Layout Randomization) בהקשר של ספריות משותפות וטבלת הGOT?
2. למה תוקף שרוצה לבצע GOT overwrite (דריסת כתובת בGOT) צריך לדעת את הכתובת של הפונקציה שהוא רוצה לקפוץ אליה? ואיך ASLR מקשה עליו?