簡體   English   中英

無法訪問.bss部分中的內存,但gdb'info files'顯示地址在范圍內

[英]Can not access memory in the .bss section, but gdb 'info files' shows the address is in range

我有一個生成Bus error (core dumped)消息的二進制文件。 當我在調試器( gdb )下運行它時,它無法訪問.bss部分中的內存位置。

Program received signal SIGBUS, Bus error.
0x0000000000412275 in ?? ()

這個位置的代碼是:

41226f:       0f 8f 33 ff ff ff       jg     4121a8 
  412275:       8b 35 51 b5 22 00       mov    0x22b551(%rip),%esi        # 63d7cc 
  41227b:       85 f6                   test   %esi,%esi

所以它試圖訪問位於0x63d7cc內存,這顯然位於.bss部分: 0x63c4e0 - 0x63d7e0

gdb (以及/ proc / $ pid / maps)將此內存顯示為已映射:

(gdb) info proc mappings
process 16533
Mapped address spaces:

          Start Addr           End Addr       Size     Offset objfile
            0x400000           0x43a000    0x3a000        0x0 /somepath/someapp
            0x639000           0x63e000     0x5000    0x39000 /somepath/someapp
            0x63e000           0x65f000    0x21000        0x0 [heap]
(gdb) info files
Symbols from "/somepath/someapp".
...
        0x0000000000639c80 - 0x000000000063c498 is .data
        0x000000000063c4e0 - 0x000000000063d7e0 is .bss

兩個ELF部分的檢查:

% readelf -S someapp
...
  [24] .data             PROGBITS         0000000000639c80  00039c80
       0000000000002818  0000000000000000  WA       0     0     32
  [25] .bss              NOBITS           000000000063c4e0  0003c498
       0000000000001300  0000000000000000  WA       0     0     32
  [26] .gnu_debuglink    PROGBITS         0000000000000000  0003c498
       000000000000000c  0000000000000000           0     0     1
...

和Segments將此內存顯示為已映射:

% readelf -l someapp
...
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000003976c 0x000000000003976c  R E    200000
  LOAD           0x0000000000039770 0x0000000000639770 0x0000000000639770
                 0x0000000000004070 0x0000000000004070  RW     200000
...

但是gdb無法訪問它(因此應用程序失敗的原因)。 有趣的是, gdb能夠訪問.bss內存,直到0x63d000

(gdb) x 0x63d7cc
0x63d7cc:       Cannot access memory at address 0x63d7cc
(gdb) x 0x63cff8
0x63cff8:       0x00000000
(gdb) x 0x63cffc
0x63cffc:       0x00000000
(gdb) x 0x63cffd
0x63cffd:       Cannot access memory at address 0x63d000

問題是:
有什么可能阻止這種訪問?
還有哪些其他方法可用於檢查運行時內存訪問權限?
還有什么可以修改正在運行的進程的訪問權限?

這個位置的代碼是:

.bss通常不是可執行的,所以很可能這就是為什么你在嘗試跳轉到它時得到SIGBUS

您的readelf輸出也顯示RW標志(注意缺少E xecutable標志)。

您需要先mprotect該部分以首先添加執行權限。

請注意,某些環境(如SELinux )禁止使用RWE進行內存映射,並且將映射更改為RE將導致程序無法寫入其(通常可寫)全局數據。 這就是為什么將可執行代碼放入.bss可能不是最好的想法。

暫無
暫無

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

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