首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >饼基地址固定在gdb中。

饼基地址固定在gdb中。
EN

Stack Overflow用户
提问于 2014-03-03 13:29:34
回答 1查看 4K关注 0票数 3

我使用的是ubuntu-13.10,启用了ASLR

代码语言:javascript
复制
root@ubuntu:/home/meltdown# cat /proc/sys/kernel/randomize_va_space 
2

我用gcc的-pie选项编写了一个简单的hello world程序。如果我单独运行这个程序,饼可执行文件的基址是随机的。就像这样。

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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]

有人能解释一下为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-03 13:33:27

默认情况下,gdb调试器会关闭地址空间布局随机化。这部分是为了确保您始终在调试相同的环境。来自 documentation (搜索disable-randomization):

此选项对于多个调试会话非常有用,可以使执行更好地在调试会话中重用,并使内存地址可重用。

这也是为什么我在代码开始时(仅在调试时)使用srand(42)而不是srand(time(NULL))的原因--它提供了一个从运行到运行的绝对一致的环境,从而使调试更容易。

如果您的代码位于地址空间的位置导致了一个非常微妙的错误,那么它可能会在调试器中不同的运行,除非ASLR被禁用。

您可以使用:

代码语言:javascript
复制
set disable-randomization off

在从gdb内部启动程序以重新启用gdb之前,请参阅gdb文档。

我怀疑您也可以使用gdb来附加到已经运行的进程(这是在ASLR效应下),而不是让gdb从头开始您的程序,尽管我倾向于使用~/.gdbinit来强制激活~/.gdbinit

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22148084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档