N0rth3ty's Blog.

深入理解linux proc虚拟文件系统

字数统计: 1.8k阅读时长: 6 min
2019/11/03 Share

Proc文件系统

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)

它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

我们常常用它来追踪进程的状态、内核的状态、内存信息、CPU使用率、系统启动时间(可以使用系统正常运行时间)等相应的信息;

个人理解就是系统内存的映射,可以直接访问这个目录来获取系统信息
体现了linux系统万物皆文件的特性
image
所以Proc文件系统是一个虚拟的文件系统

Proc目录介绍

proc目录截图
image

/proc目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件。

除此之外还直接有一些命名文件,这些文件记录了一些系统的信息

进程目录中的常见文件介绍

随便打开一个进程目录
image

cmdline

启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息

cwd

指向当前进程运行目录的一个符号链接

exe

指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝

fd

这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接

environ

进程环境变量列表

其它

  • /proc/N/exe 链接到进程的执行命令文件

  • /proc/N/fd 包含进程相关的所有的文件描述符

  • /proc/N/maps 与进程相关的内存映射信息

  • /proc/N/mem 指代进程持有的内存,不可读

  • /proc/N/root 链接到进程的根目录

  • /proc/N/stat 进程的状态

  • /proc/N/statm 进程使用的内存的状态

  • /proc/N/status 进程状态信息,比stat/statm更具可读性

Proc根目录下常见文件介绍

/proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关

/proc/cmdline 启动时传递给kernel的参数信息

/proc/cpuinfo cpu的信息

/proc/crypto 内核使用的所有已安装的加密密码及细节

/proc/devices 已经加载的设备并分类

/proc/dma 已注册使用的ISA DMA频道列表

/proc/execdomains linux内核当前支持的execution domains

/proc/fb 帧缓冲设备列表,包括数量和控制它的驱动

/proc/filesystems 内核当前支持的文件系统类型

/proc/interrupts x86架构中的每个IRQ中断数

/proc/iomem 每个物理设备当前在系统内存中的映射

/proc/ioports 一个设备的输入输出所使用的注册端口范围

/proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb

/proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理

/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关

/proc/locks 内核锁住的文件列表

/proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)

/proc/meminfo RAM使用的相关信息

/proc/misc 其他的主要设备(设备号为10)上注册的驱动

/proc/modules 所有加载到内核的模块列表

/proc/mounts 系统中使用的所有挂载

/proc/mtrr 系统使用的Memory Type Range Registers (MTRRs)

/proc/partitions 分区中的块分配信息

/proc/pci 系统中的PCI设备列表

/proc/slabinfo 系统中所有活动的 slab 缓存信息

/proc/stat 所有的CPU活动信息

/proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的

/proc/uptime 系统已经运行了多久

/proc/swaps 交换空间的使用情况

/proc/version Linux内核版本和gcc版本

/proc/bus 系统总线(Bus)信息,例如pci/usb等

/proc/driver 驱动信息

/proc/fs 文件系统信息

/proc/ide ide设备信息

/proc/irq 中断请求设备信息

/proc/net 网卡设备信息

/proc/scsi scsi设备信息

/proc/tty tty设备信息

/proc/net/dev 显示网络适配器及统计信息

/proc/vmstat 虚拟内存统计信息

/proc/vmcore 内核panic时的内存映像

/proc/diskstats 取得磁盘信息

/proc/schedstat kernel调度器的统计信息

/proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用

/proc/self

/proc/self 是一个有趣的子目录,它使得程序可以方便地使用 /proc 查找本进程地信息。/proc/self 是一个链接到 /proc 中访问 /proc 的进程所对应的 PID 的目录的符号链接。

经常在实战中会运用到
ctf和实战中常用到的就是/proc/self/cwd和/proc/self/environ

CTF和实战

就是运用于可以读取文件但是不知道绝对路径的情况
或者需要一些其他的环境变量

今年CNSS的招新题目

image
直接读flag是不行了,有一个读源码的接口,读取下来看看

1
2
3
4
5
6
7
8
9
10
11
12
@app.route('/file')
def profile():
filename = os.path.join('./', request.args['name'])

try:
if os.path.abspath(filename).startswith(os.getcwd()) and filename != './profile':
return 'No No No', 422

content = open(filename).read()
return content, 200
except Exception:
return 'Error in reading your profile', 500

这里的意思是如果要读取的文件在当前目录,那文件名必须是profile,如果不是就返回no

实战中可能是不支持相对路径,然后我们又不知道绝对路径,或者我们需要往绝对路径写等

这个时候就可以利用proc虚拟文件系统

image

CATALOG
  1. 1. Proc文件系统
    1. 1.1. Proc目录介绍
  2. 2. 进程目录中的常见文件介绍
    1. 2.1. cmdline
    2. 2.2. cwd
    3. 2.3. exe
    4. 2.4. fd
    5. 2.5. environ
    6. 2.6. 其它
  3. 3. Proc根目录下常见文件介绍
    1. 3.1. /proc/self
  4. 4. CTF和实战