警告:禁用地址空间随机化时出错:不允许操作

Jas*_*Jas 65 c gdb docker

我做错了什么(或没做错)gdb对我来说不合适?

root@6be3d60ab7c6:/# cat minimal.c 
int main()
{
  int i = 1337;
  return 0;
}
root@6be3d60ab7c6:/# gcc -g minimal.c -o minimal
root@6be3d60ab7c6:/# gdb minimal
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
.
.
.
Reading symbols from minimal...done.
(gdb) break main
Breakpoint 1 at 0x4004f1: file minimal.c, line 3.
(gdb) run
Starting program: /minimal 
warning: Error disabling address space randomization: Operation not permitted
During startup program exited normally.
(gdb) 
(gdb) print i   
No symbol "i" in current context.
Run Code Online (Sandbox Code Playgroud)

wis*_*cky 105

如果您正在使用Docker,则可能需要该--security-opt seccomp=unconfined选项(以及启用ptrace):

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你 - 我不知道有多少时间我已经失去了学习这个困难的方法! (4认同)
  • 有没有办法将此命令应用于已经运行的实例?因为我不想删除此实例并启动一个新实例 (4认同)
  • 我认为只有在将gdb附加到已经运行的进程时才需要--cap-add = SYS_PTRACE。 (2认同)

Chr*_*ing 16

无论出于何种原因,您的用户帐户无权禁用此进程的内核地址空间布局随机化.默认情况下,gdb将其关闭,因为它使某些调试更容易(特别是,这意味着每次运行程序时堆栈对象的地址都是相同的).在这里阅读更多.

您可以通过禁用gdb的此功能来解决此问题set disable-randomization off.

至于让你的用户获得禁用ASLR所需的权限,它可能归结为具有写权限/proc/sys/kernel/randomize_va_space.在这里阅读更多.


Kev*_*ews 7

基于wisbucky的答案(谢谢!),以下是Docker组合的相同设置:

security_opt:
  - seccomp:unconfined
cap_add:
  - SYS_PTRACE
Run Code Online (Sandbox Code Playgroud)

安全选项seccomp:unconfirmed修复了address space randomization警告.

即使Docker文档声明SYS_PTRACE是"默认情况下未授予"的功能,但SYS_PTRACE功能似乎没有明显的效果.也许我不知道该找什么.

  • 你打错字了,是unconfeded,不是unconfirmed (2认同)