我使用的是ubuntu-13.10,启用了ASLR
root@ubuntu:/home/meltdown# cat /proc/sys/kernel/randomize_va_space
2我用gcc的-pie选项编写了一个简单的hello world程序。如果我单独运行这个程序,饼可执行文件的基址是随机的。就像这样。
root@ubuntu:/home/meltdown# cat /proc/8872/maps
b758b000-b758c000 rw-p 00000000 00:00 0
b758c000-b773a000 r-xp 00000000 08:01 10749216 /lib/i386-linux-gnu/libc-2.17.so
b773a000-b773c000 r--p 001ae000 08:01 10749216 /lib/i386-linux-gnu/libc-2.17.so
b773c000-b773d000 rw-p 001b0000 08:01 10749216 /lib/i386-linux-gnu/libc-2.17.so
b773d000-b7740000 rw-p 00000000 00:00 0
b7752000-b7756000 rw-p 00000000 00:00 0
b7756000-b7757000 r-xp 00000000 00:00 0 [vdso]
b7757000-b7777000 r-xp 00000000 08:01 10749212 /lib/i386-linux-gnu/ld-2.17.so
b7777000-b7778000 r--p 0001f000 08:01 10749212 /lib/i386-linux-gnu/ld-2.17.so
b7778000-b7779000 rw-p 00020000 08:01 10749212 /lib/i386-linux-gnu/ld-2.17.so
b7779000-b777a000 r-xp 00000000 08:01 14942231 /tmp/a
b777a000-b777b000 r--p 00000000 08:01 14942231 /tmp/a
b777b000-b777c000 rw-p 00001000 08:01 14942231 /tmp/a
bf9f4000-bfa15000 rw-p 00000000 00:00 0 [stack]但是,如果我使用gdb调试此程序,则饼形基地址总是相同的(80000000)。
root@ubuntu:/home/meltdown# cat /proc/8840/maps
80000000-80001000 r-xp 00000000 08:01 14942231 /tmp/a
80001000-80002000 r--p 00000000 08:01 14942231 /tmp/a
80002000-80003000 rw-p 00001000 08:01 14942231 /tmp/a
b7e12000-b7e13000 rw-p 00000000 00:00 0
b7e13000-b7fc1000 r-xp 00000000 08:01 10749216 /lib/i386-linux-gnu/libc-2.17.so
b7fc1000-b7fc3000 r--p 001ae000 08:01 10749216 /lib/i386-linux-gnu/libc-2.17.so
b7fc3000-b7fc4000 rw-p 001b0000 08:01 10749216 /lib/i386-linux-gnu/libc-2.17.so
b7fc4000-b7fc7000 rw-p 00000000 00:00 0
b7fdb000-b7fdd000 rw-p 00000000 00:00 0
b7fdd000-b7fde000 r-xp 00000000 00:00 0 [vdso]
b7fde000-b7ffe000 r-xp 00000000 08:01 10749212 /lib/i386-linux-gnu/ld-2.17.so
b7ffe000-b7fff000 r--p 0001f000 08:01 10749212 /lib/i386-linux-gnu/ld-2.17.so
b7fff000-b8000000 rw-p 00020000 08:01 10749212 /lib/i386-linux-gnu/ld-2.17.so
bffdf000-c0000000 rw-p 00000000 00:00 0 [stack]有人能解释一下为什么吗?
发布于 2014-03-03 13:33:27
默认情况下,gdb调试器会关闭地址空间布局随机化。这部分是为了确保您始终在调试相同的环境。来自 documentation (搜索disable-randomization):
此选项对于多个调试会话非常有用,可以使执行更好地在调试会话中重用,并使内存地址可重用。
这也是为什么我在代码开始时(仅在调试时)使用srand(42)而不是srand(time(NULL))的原因--它提供了一个从运行到运行的绝对一致的环境,从而使调试更容易。
如果您的代码位于地址空间的位置导致了一个非常微妙的错误,那么它可能会在调试器中不同的运行,除非ASLR被禁用。
您可以使用:
set disable-randomization off在从gdb内部启动程序以重新启用gdb之前,请参阅gdb文档。
我怀疑您也可以使用gdb来附加到已经运行的进程(这是在ASLR效应下),而不是让gdb从头开始您的程序,尽管我倾向于使用~/.gdbinit来强制激活~/.gdbinit。
https://stackoverflow.com/questions/22148084
复制相似问题