如何从核心转储文件中提取AT_EXECFN



我需要从coredump文件中提取AT_EXECFN的值。对于那些不知道这个值是辅助向量的一部分的人来说。在运行过程中获得这个值非常简单,只需使用getauxval,但是当您有ELF核心转储文件时,我找不到任何关于如何做到这一点的信息。我可以找到这个文件的NT_AUXV部分,但我找不到如何找到AT_EXECFN所指向的确切字符串。假设我在coredump中找到了AT_EXECFN。根据这个,我将得到一个具有ann地址的结构,实际值存储在其中。我的问题是如何在coredump文件中找到这个地址?

下面是一个例子:

int main() { abort(); }
gcc -w -O2 t.c && ulimit -c unlimited && ./a.out
Aborted (core dumped)

首先我们可以看看GDB:

gdb -q ./a.out core
Reading symbols from ./a.out...
(No debugging symbols found in ./a.out)
[New LWP 86]
Core was generated by `./a.out'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) info auxv
33   AT_SYSINFO_EHDR      System-supplied DSO's ELF header 0x7ffd4037a000
16   AT_HWCAP             Machine-dependent CPU capability hints 0x178bfbff
...
31   AT_EXECFN            File name of executable        0x7ffd40374ff0 "./a.out"
15   AT_PLATFORM          String identifying platform    0x7ffd403739c9 "x86_64"
0    AT_NULL              End of vector                  0x0

这证明了信息实际上存在于core中,也显示了期望的值。

因此,步骤是:

  • 读取/解码NT_AUXV注释,直到找到包含.a_type == AT_EXECFN(31(的条目。找到指向字符串的指针($addr,在这里可以找到0x7ffd40374ff0(。

    使用eu-readelf -n core有助于验证您是否正在读取预期值。这是输出:

CORE                 320  AUXV
SYSINFO_EHDR: 0x7ffd4037a000
HWCAP: 0x178bfbff  <fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht>
...
EXECFN: 0x7ffd40374ff0
PLATFORM: 0x7ffd403739c9
NULL
  • 使用.p_type == PT_LOAD迭代所有程序头,直到找到一个具有.p_vaddr <= $addr$addr < .p_vaddr + .p_memsz的程序头(即"覆盖"所需地址的LOAD段(。在上面的情况下,这是一个条目:
Program Headers:
Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
...
LOAD           0x016000 0x00007ffd40354000 0x0000000000000000 0x021000 0x021000 RW  0x1000
...
  • 最后,您可以在.p_offset + $addr - .p_vaddrcore文件中找到字符串的位置。使用以上数字,我们预计字符串在文件中的偏移量为0x016000 + 0x7ffd40374ff0 - 0x00007ffd40354000 = 225264字节。

    我们确实在那里找到了它:

dd status=none bs=1 skip=225264 count=10 if=core | xxd -g1
00000000: 2e 2f 61 2e 6f 75 74 00 00 00                    ./a.out...

最新更新