אהלן!
קודם כל, שנים לא הייתי פה, ואני מודה שממש התגעגעתי!
לגבי השאלה:
אני מנסה למצוא כתובת של פונקציה של libc בזיכרון. עם gdb מאוד קל:
קוד: |
$ gdb ./getaddr
...
(gdb) p system
$2 = {<text variable, no debug info>} 0xb7ecffb0 <__libc_system>
|
אבל שמתי לב שאם אני הולך לתוכנה אחרת, הכתובת שונה!
קוד: |
$ gdb ./getaddr2
...
(gdb) p system
$1 = {<text variable, no debug info>} 0xb7ecbfb0 <__libc_system> |
מסתכל עם ldd:
קוד: |
$ ldd getaddr
linux-gate.so.1 => (0xb7fe4000)
libc.so.6 => /lib/libc.so.6 (0xb7e99000)
/lib/ld-linux.so.2 (0xb7fe5000)
$ ldd getaddr2
linux-gate.so.1 => (0xb7fe4000)
libdl.so.2 => /lib/libdl.so.2 (0xb7fda000)
libc.so.6 => /lib/libc.so.6 (0xb7e95000)
/lib/ld-linux.so.2 (0xb7fe5000)
|
באמת libc נמצא במקומות שונים.
אז חשבתי פשוט למצוא את ה-offset, ובאמת:
קוד: |
0xb7ecffb0-0xb7e99000 = 0x36fb0
0xb7ecbfb0-0xb7e95000 = 0x36fb0 |
אבל למרבה ההפתעה עם nm אני מקבל offset קצת שונה:
קוד: |
$ nm -D /lib/libc.so.6 | grep system
00038fb0 T __libc_system
00038fb0 W system
|
המסקנה היחידה: עשיתי פה סמטוחה שלמה ואני לא מבין מה קורה פה. מישהו יכול להאיר את עייני?
שאלות ממוקדות:
1. למה הכתובות משתנות עבור כל תוכנה? מה המנגנון שעשוה את זה ולמה?
2. למה nm מצא לי כתובת טיפה שונה מה-offset שמצאתי בתוכנות?
הערות חשובות:
1. ASLR כבוי, אז זה (כנראה) לא זה.
2. חיפשתי כבר בגוגל, לא הייתי שואל פה בלי לחפש לפני. (אבל לגמרי זורם על לינקים שמסבירים את זה)
תודה רבה!