dae*_*hee 4 linux gcc gdb pie-chart
我正在使用启用了 ASLR 的 ubuntu-13.10
root@ubuntu:/home/meltdown# cat /proc/sys/kernel/randomize_va_space
2
Run Code Online (Sandbox Code Playgroud)
我用 gcc -pie 选项编译了一个简单的 hello world 程序。如果我独立运行这个程序,PIE 可执行文件的基地址是随机的。像这样。
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]
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用 gdb 调试该程序,PIE 基地址始终相同(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]
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么吗?
默认情况下,调试gdb器关闭地址空间布局随机化。这部分是为了确保您始终调试相同的环境。从gdb文档(搜索disable-randomization):
此选项对于多个调试会话很有用,可以使执行具有更好的可重复性,并且可以在调试会话之间重用内存地址。
srand(42) 这与我在代码开始时使用(仅在调试时)而不是相同的原因srand(time(NULL))- 它提供了从运行到运行绝对一致的环境,以使调试更容易。
如果您有一个非常微妙的错误,该错误是由代码在地址空间中的位置引起的,则它可能会在调试器中进行不同的运行,除非禁用 ASLR。
您可以使用:
set disable-randomization off
Run Code Online (Sandbox Code Playgroud)
根据文档,从内部启动程序gdb以重新启用 ASLR之前gdb。
我怀疑您还可以使用gdb附加到已经运行的进程(在 ASLR 效果下),而不是gdb从头开始启动程序,尽管我倾向于使用~/.gdbinit强制激活 ASLR。
| 归档时间: |
|
| 查看次数: |
5198 次 |
| 最近记录: |