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