Linux安全机制(一):Linux基础

Linux基础

常用命令

​ shell是一个用户与Linux进行交互的接口程序,通常它会输出一个提示符,等待用户输入命令。bash是当前Linux标准的默认shell.

Linux中日常使用的命令

ls [option]…[file]列出文件信息
cd /代表根目录 .当前目录 …上级目录 ~当前用户的默认工作目录切换工作目录
pwd [-LP]显示当前目录
uname 【option】打印系统信息
whoami 【option】打印用户名
man 【option…】 [section] page查询帮助信息
find [options] [path…] [expression]查找文件
echo [SHORT-OPTION]… [STRING]…打印文本,参数“-e”可激活转义字符
cat [option] [file]打印到标准输出
less [options] file分页打印文本,比more提供更丰富的功能
head/tail [option]… [file]…打印文本的前后N行
grep [option]… PATTERN [FILE]…匹配文本模式
cut option… [file]…通过列提取文本
diff [option]… files比较文本差异
ps [options]查看进程状态
top [options]实时查看系统运行情况
kill [options] […]杀死进程
ifconfig [-v] [-a] [-s] [interface]查看或设置网络设备
ping [options] destination判断网络主机是否响应
netstat [options]查看网络、路由器、接口等信息
nc [options]建立TCP/UDP连接并监听
touch [option]… file创建文件
mkdir [option] directory创建

流、管道和重定向

​ 在操作系统中,流是非常重要的概念,可以把它简单理解城一串连续的、可边读边处理的数据。其中标准流可以分为标准输入、标准输出和标准错误。

​ 文件描述符是内核为管理已打开文件所创建的索引,使用一个非负整数来指代被打开的文件。Linux中一切皆可看作文件,流也不例外,所以输入和输出就被当作对应文件的读和写来执行。标准流定义在头文件unistd.h中

文件描述符常量用途stdio流
0STDIN_FILENO标准输入stdin
1STDPUT_FILENO标准输出stdout
2STDERR_FILENO标准错误stderr

​ 管道(pipeline)是指一系列进程通过标准流连接在了一起,前一个进程的输出(stdout)直接作为后一个进程的输入(stdin)。管道符号为“|”,例如:“ $ ps-aux | grep bash"。

​ 什么是输入输出重定向

重定向符号作 用
cmd>file将cmd的标准输出重定向并覆盖file
cmd>>file将cmd的标准输出重定向并追加到file
cmd<file将file作为cmd的标准输入
cmd<<tag从标准输入中读取,直到遇到tag为止
cmd< file1 >file2将file1作为cmd的标准输入并将标准输出重定向到file2
cmd 2>file将cmd的标准错误重定向并覆盖file
cmd 2>>file将cmd的标准错误重定向并追加到fie
2>& 1将标准错误和标准输出合并

根目录结构

​ Linux中一切都可以看成文件,所有文件和目录被组织成一个根节点(斜杠/)开始的倒置的树状结构,系统中的每个文件都是根目录的直接或间接后代

​ Linux文件的三种基本文件类型分别如下

  • 普通文件:包括文本文件(只含ASCII或Unicode字符,换行符为”\n“,即十六进制0x0A)和二进制文件(所有其他文件)
  • 目录:包含一组链接的文件,其中每一个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录
  • 特殊文件:包括块文件、符号链接、管道、套接字等。

​ 目录层次结构中的位置用路径名来指定,分为绝对路径名(从根节点开始)和相对路径名(从当前工作目录开始)两种。通过tree命令可以更直观地查看目录树。

用户组及文件权限

​ Linux是一个支持多用户地操作系统,每个用户都有UserID(UID)和Group ID(GID),其中UID是对一个用户地单一身份标识,而GID则对应多个UID。直到某个用户地UID和GID是非常有用的,一些程序可能就需要UID/GID来运行。

可以使用id命令来查看:

在这里插入图片描述

UID为0的root用户类似于系统管理员,它具有系统的完全访问权。

GID的关系存储在/etc/group文件中
在这里插入图片描述

所有用户的信息(除了密码)都保存在/etc/passwd文件中,为了安全起见,加密过的用户密码则保存在/etc/shadow文件中,此文件只有root权限可以访问。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LRq2Qaox-1685972641801)(C:\Users\86153\AppData\Roaming\Typora\typora-user-images\image-20230605160824218.png)]

由于普通用户的权限比较低,这里使用sudo命令可以让普通用户以root用户的身份运行某命令。而su命令可以切换用户。

在Linux中,文件或目录权限的控制分别以读取、写入和执行3中一般权限来区分,另有3种特殊权限可供运用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C71GSeC0-1685972641802)(C:\Users\86153\AppData\Roaming\Typora\typora-user-images\image-20230605162231133.png)]

ls-l [file]来查看某文件或目录的信息。

第一栏的第一个字母代表文件类型,此文件是一个普通文件(-)

第一栏从第二个字母开始就是权限字符串,权限标志三个为一组,依次是所有者权限、组权限、其他人权限。每组的顺序均为”rwx“,权限表示成对应的字母,没有权限用”-“表示。

环境变量

​ 环境变量相当于给系统或应用程序设置了一些参数,例如共享库的位置,命令行的参数等信息,对于程序的运行十分重要。环境变量字符串以”name=value“这样的形式存在,通常把name部分称为环境变量名,value部分称为环境变量的值,其中value需要以”/0“结尾。

​ Linux环境变量的分类方式

  1. 按照生命周期划分
  • 永久环境变量:修改相关配置文件,永久生效;

  • 临时环境变量:通过export命令在当前终端下声明,关闭终端后失效。

    2 .按照作用域划分

  • 系统环境变量:对该系统中所有用户生效,可以在”/etc/profile“文件中声明;

  • 用户环境变量:对特定用户生效,可以在”~/.bashrc“文件中声明。

在这里插入图片描述

使用env命令可以打印出所有的环境变量,也可以对环境变量进行设置。

LD_PRELOAD

​ LD_PRELOAD环境变量可以定义程序运行时休闲加载的动态链接库,这就允许预加载库中的函数和符号能够覆盖掉后加载的库中的函数和符号。在CTF中,我们可能需要加载一个特定的libc(C的函数库),这时就可以通过定义该变量来实现。
在这里插入图片描述


ldd命令用来打印或者查看程序运行所需的共享库(访问共享对象依赖关系),常用来解决程序因缺少某个库文件而不能运行的一些问题。

需要注意的是。ELF文件的INTERP字段指定了解释器ld.so的位置,如果该路径与动态链接库的位置不匹配,则会触发错误。

environ

​ libc中定义的全局变量environ指向内存中的环境变量表,更具体地,该表就位于栈上,因此通过泄露environ指针的地址,即可获得栈地址。

procfs文件系统

​ procfs文件系统是Linux内核提供的虚拟文件系统,为访问内核数据提供接口。之所以说是虚拟文件系统,是因为它只占用内存而不占用存储。用户可以通过procfs查看有关系统硬件及当前正在运行进行的信息,甚至可以通过修改其中的某些内容来改变内核的运行状态。

​ 每个正在运行的进程都对应/proc的下一个目录,目录名就是进程的PID。
在这里插入图片描述

ps -ef | grep xx 查找进程

在这里插入图片描述

文件名作用
auxv传递给进程的解释器信息
cmdline启动进程的命令行
cwd -> /home/pwn当前工作目录
environ进程的环境变量
exe -> /bin/zsh最初的可执行文件
fd进程打开的文件
fdinfo每个打开文件的信息
maps内存映射信息
mem内存空间
root -> /进程的根目录
stack内存调用栈
status进程的基本信息
syscall正在执行的系统调用
task进程包含的所有进程

字节序

计算机中采用了两种字节存储机制:大端(Big-endian)和小端(little-endian)。其中大端规定MSB(Most Significan Bit/byte)在存储时放在低地址,在传输时放在流的开始;LSB(Least Significan Bit/byte)存放时放在高地址,在传输时放在流的末尾。小端正好相反。常见的Intel处理器使用小端,而PowerPC系列处理器则使用大端,另外,TCP/IP协议和Java虚拟机的字节序也是大端。

举个例子,将16进制整数0x12345678存入以1000H开始的内存,大端和小端的存储方式如下图:
在这里插入图片描述

调用约定

​ 函数地要用约定是函数调用时如何传递参数的一种约定。

​ 分别从内核接口和用户接口两方面介绍32位和64位Linux的调用约定

  1. 内核接口
  • x86-32 系统调用约定:Linux系统调用使用寄存器传递参数。eax位syscall_NUMBER,ebx、ecx、edx、esi和ebp用于将6个参数传递给系统调用返回值保存在EAX中。所以其他寄存器(包括EFLAGS(标志寄存器))都保存在int0x80中。
  • x86-64 系统调用约定:内核接口使用的寄存器有rdi、rsi、rdx、r10、r8和r9.系统调用通过syscall指令完成。除了rcx、r11和rax,其他的寄存器都被保留。系统调用的编号必须在寄存器rax中传递系统调用的参数限制为6个,不直接从堆栈上传递任何参数。返回时,rax中包含了系统调用的结果,而且只有INTEGER或者MEMORY类型的值才会被传递给内核。

​ 2 . 用户接口

  • x86-32函数调用约定:参数通过栈进行传递。最后一个参数第一个被放入栈中,直到所有的参数都放置完毕,然后执行call指令。这也是Linux上C语言默认的方式
  • x86-64函数调用约定:x86-64下通过寄存器传递参数,这样做比通过栈具有更高的效率。它避免了内存中参数的存取和额外的指令。根据参数类型的不同,会使用寄存器或传参方式。如果参数的类型时MEMORY,则在栈上传递参数。如果类型是INTERGER,则顺序使用rdi、rsi、rdx、rcx、r8和r9.所以如果有多于6个的INTEGER参数,则后面的而参数在栈上传递。

核心转储

​ 当程序运行的过程中出现异常终止或崩溃,系统就会将系统崩溃时的内存、寄存器状态、堆栈指针、内存管理信息等记录下来,保存到一个文件中,叫做核心转储(core Dump)。

​ 会产生核心转储的信号

信 号动 作解 释
SIGQUITCore通过键盘退出时
SIGILLCore遇到不合法的指令时
SIGABRTCore从abort中产生的信息
SIGSEGVCore无效的内存访问
SIGTRAPCoretrace/breakpint陷阱

系统调用

​ 在Linux中,系统调用是一些内核空间函数,是用户空间(用户程序的内存空间)访问内核的唯一手段。

​ 在使用汇编写程序(Shellcode)的时候,常常使用系统调用。

参考书文:《CTF竞赛权威指南PWN篇》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值