gpt4 book ai didi

无法访问 .bss 部分中的内存,但 gdb 'info files' 显示地址在范围内

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:01 24 4
gpt4 key购买 nike

我有一个生成 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 mappingsprocess 16533Mapped 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 filesSymbols 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 0x63d7cc0x63d7cc:       Cannot access memory at address 0x63d7cc(gdb) x 0x63cff80x63cff8:       0x00000000(gdb) x 0x63cffc0x63cffc:       0x00000000(gdb) x 0x63cffd0x63cffd:       Cannot access memory at address 0x63d000

问题是:
是什么阻止了这种访问?
还有哪些其他方法可用于检查运行时内存访问权限?
还有什么可以修改正在运行的进程的访问权限?

最佳答案

The code at this location is:

.bss 通常是不可执行的,所以很可能这就是您在尝试跳转到它时得到 SIGBUS 的原因。

您的 readelf 输出显示 RW 标志(注意缺少 Executable 标志)。

您需要先mprotect 该部分以添加执行权限。

请注意,某些环境,例如SELinux,禁止使用RWE进行内存映射,将映射更改为R-E会导致程序无法写入其(通常可写的)全局数据。这就是为什么将可执行代码放入 .bss 可能不是最好的主意。

关于无法访问 .bss 部分中的内存,但 gdb 'info files' 显示地址在范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45360082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com