/proc/kcore 是 vmlinux在内存中的动态映像,可以使用gdb,objdump,crash等工具对其进行调试,从而获取当前系统内存中的数据。
下面我们将介绍如何从/proc/kcore中找到想要的数据。
首先和大多数ELF文件一样,/proc/kcore
中也包含了ELF Header
, Program Headers
等信息。
使用readelf -l
查看程序头信息,
root@A029129-PC:~# readelf -l /proc/kcore
Elf file type is CORE (Core file)
Entry point 0x0
There are 10 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
NOTE 0x0000000000000270 0x0000000000000000 0x0000000000000000
0x0000000000001d24 0x0000000000000000 0x0
LOAD 0x00007fff81002000 0xffffffff81000000 0x0000000001000000
0x0000000002a2c000 0x0000000002a2c000 RWE 0x1000
LOAD 0x0000490000002000 0xffffc90000000000 0xffffffffffffffff
0x00001fffffffffff 0x00001fffffffffff RWE 0x1000
LOAD 0x00007fffc0002000 0xffffffffc0000000 0xffffffffffffffff
0x000000003f000000 0x000000003f000000 RWE 0x1000
LOAD 0x0000088000003000 0xffff888000001000 0x0000000000001000
0x000000000009f000 0x000000000009f000 RWE 0x1000
LOAD 0x00006a0000002000 0xffffea0000000000 0xffffffffffffffff
0x0000000000003000 0x0000000000003000 RWE 0x1000
LOAD 0x0000088000202000 0xffff888000200000 0x0000000000200000
0x00000000f7e00000 0x00000000f7e00000 RWE 0x1000
LOAD 0x00006a000000a000 0xffffea0000008000 0xffffffffffffffff
0x0000000003df8000 0x0000000003df8000 RWE 0x1000
LOAD 0x0000088100002000 0xffff888100000000 0x0000000100000000
0x0000000105000000 0x0000000105000000 RWE 0x1000
LOAD 0x00006a0004002000 0xffffea0004000000 0xffffffffffffffff
0x0000000004140000 0x0000000004140000 RWE 0x1000
通过程序头信息我们可以得到VirtAddr和Offset之间的对应关系。
计算出符号在对应程序段之间的偏移,加上该程序段在文件中的偏移即可得到该符号在文件中的地址。
现在假设我们想要查看ext4_readdir
在内存中的数据,
/proc/kallsyms
查看ext4_readdir
在内存中的地址root@A029129-PC:~# cat /proc/kallsyms | grep ext4_readdir
ffffffff813bd750 t ext4_readdir
读取addr数据,即为ext4_readdir在内存中的真实数据,该数据可以判断系统内存中是否存在攻击。