簡體   English   中英

餅圖基地址在gdb中是固定的

[英]pie base address is fixed in gdb

我正在使用啟用了ASLR的ubuntu-13.10

root@ubuntu:/home/meltdown# cat /proc/sys/kernel/randomize_va_space 
2

我用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]

但是,如果我使用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]

有人可以解釋為什么嗎?

默認情況下, gdb調試器關閉地址空間布局隨機化。 這部分是為了確保您始終在調試相同的環境。 gdb文檔中 (搜索disable-randomization ):

對於多個調試會話,此選項很有用,以使執行過程的再現性更好,並且在調試會話之間可重用內存地址。

這就是為什么我在代碼開始時(僅在調試時)而不是srand(time(NULL))而不是srand(time(NULL))才使用srand(42)原因-它提供了從運行到運行的絕對一致的環境,從而使調試更加容易。

如果您有一個非常細微的錯誤是由代碼在地址空間中的位置引起的,則除非禁用了ASLR,否則它可能會在調試器中進行不同的運行。

您可以使用:

set disable-randomization off

根據gdb文檔,在從gdb啟動程序以重新啟用ASLR之前。

我懷疑您也可以使用gdb附加到已在運行的進程中(這受ASLR的影響),而不是讓gdb從頭開始啟動程序,盡管我傾向於使用~/.gdbinit來強制激活ASLR。 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM