linux ASLR应该如何使用核心转储?

sf6xfgos  于 2023-03-17  发布在  Linux
关注(0)|答案(1)|浏览(118)

我遇到了核心转储(在远程系统上生成)与.o文件中的符号不匹配的情况。我怀疑这是由于ASLR造成的。不幸的是,我不确定ASLR应该如何与核心转储一起工作,所以我无法验证。
我的逻辑是,因为coredump转储实际内存,所以必须将ASLR偏移合并到核心文件本身中(所以现在,核心文件中对函数foo的所有地址引用实际上都包含foo.vaddr + aslr_offset)。gdb必须知道aslr偏移量是什么,以便将该地址转换回foo。不过,我没有找到aslr偏移量存储在核心文件中的位置。有人知道这样的机制是否存在吗?如果存在,它应该如何运作?

wwtsj6pe

wwtsj6pe1#

有人知道这样的机制是否存在吗?如果存在,它应该如何运作?
它确实存在,您可以通过创建一个本地core并将其加载到GDB中来验证。
您可以在NT_FILE注解中检查filesegment的Map。

eu-readelf -n core

  CORE                 846  FILE
    15 files:
      5645cecd5000-5645cecd6000 00000000 4096        /tmp/a.out
      5645cecd6000-5645cecd7000 00001000 4096        /tmp/a.out
      5645cecd7000-5645cecd8000 00002000 4096        /tmp/a.out
      5645cecd8000-5645cecd9000 00002000 4096        /tmp/a.out
      5645cecd9000-5645cecda000 00003000 4096        /tmp/a.out
      7f6ea8322000-7f6ea8348000 00000000 155648      /usr/lib/x86_64-linux-gnu/libc.so.6
      7f6ea8348000-7f6ea849d000 00026000 1396736     /usr/lib/x86_64-linux-gnu/libc.so.6
      7f6ea849d000-7f6ea84f0000 0017b000 339968      /usr/lib/x86_64-linux-gnu/libc.so.6
      7f6ea84f0000-7f6ea84f4000 001ce000 16384       /usr/lib/x86_64-linux-gnu/libc.so.6
      7f6ea84f4000-7f6ea84f6000 001d2000 8192        /usr/lib/x86_64-linux-gnu/libc.so.6
      7f6ea851c000-7f6ea851d000 00000000 4096        /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      7f6ea851d000-7f6ea8542000 00001000 151552      /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      7f6ea8542000-7f6ea854c000 00026000 40960       /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      7f6ea854c000-7f6ea854e000 00030000 8192        /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
      7f6ea854e000-7f6ea8550000 00032000 8192        /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

我不确定这是不是GDB实际使用的机制。

相关问题