เหตุใดที่อยู่ของ __libc_start_main จึงเหมือนกันภายใน GDB แม้ว่า ASLR จะเปิดอยู่


16
Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/firstlove/projects/org-ioslide/example/a.out 

Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/firstlove/projects/org-ioslide/example/a.out 

Breakpoint 1, 0x00007ffff7de8060 in __libc_start_main () from /usr/lib/libc.so.6
(gdb) Quit
(gdb) quit
A debugging session is active.

        Inferior 1 [process 16372] will be killed.

Quit anyway? (y or n) y
firstlove-pc% cat /proc/sys/kernel/randomize_va_space
2

IIUC, ASLR ควรสุ่มที่อยู่ทั้งหมดรวมถึงที่อยู่หนึ่งlibc.soแต่ฉันพบว่าที่อยู่ของ__libc_start_main()อยู่0x00007ffff7de8060ในเครื่อง Linux เสมอทำไม เกิดอะไรขึ้น?


1
การสุ่มพื้นที่ที่อยู่ยังสุ่มที่อยู่ของฟังก์ชันหรือเฉพาะของตัวแปรหรือไม่
rubenvb

คุณเห็นผลลัพธ์เดียวกันหรือไม่ถ้าคุณเริ่มเซสชัน gdb ใหม่เพื่อตรวจสอบที่อยู่แทนการเรียกใช้โปรแกรมซ้ำในเซสชัน gdb เดียวกันหรือไม่
John Bollinger

@JohnBollinger ฉันได้ลองแล้วอย่างแน่นอน
陳力

คำตอบ:


24

เมื่อคุณเรียกใช้ภายในโปรแกรมgdb, gdbพยายามที่จะช่วยให้คุณแก้จุดบกพร่องโดยการปิดการสุ่มที่อยู่ คุณสามารถใช้คำสั่งต่อไปนี้เพื่อเปิดใช้งาน (มีผลบังคับใช้จากการรันโปรแกรมครั้งถัดไป):

set disable-randomization off
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.