0x07_缓冲区溢出_基础知识
Protostar 安装、配置与使用
- 下载地址
- 注意网络设置,方便后续通过ssh连接。可以选择桥接模式
- 账密
- 用户名:user
- 密码:user
- 使用命令
/bin/bash
优化命令行输出
Linux 基础
- 执行
file stack0
,查看输出,发现是一个setuid ELF 32-bit
的文件 - 通过 Linux 的
man
命令查看setuid
定义- 执行
man setuid
- setuid() 设置调用进程的有效用户ID。如果调用者的有效UID是root,还设置了真实UID和保存的设置用户ID。
- 执行
- 查看所有用户:
cat /etc/passwd
- 当前用户 ID 为 1001,root 用户 ID 为 0
- 是否可以通过编写一个 C 程序调用
setuid
方法篡改当前用户权限使其以 root 用户权限运行程序?- 答案是否定的,在 setuid 文档中有相关说明
- 用户没有权限(Linux: 没有CAP_SETUID功能),uid与调用进程的真实uid或保存的用户ID不匹配。
- setuid 的作用:root 用户下放权限给普通用户
- 运行一个普通的程序,如 Vim,使用
ps aux | grep vim
查看 vim 进程,调用者为普通用户 - 运行 stack0 文件,查看进程却发现调用者为 root 用户
- 重新查看目录权限,stack0 的权限为
-rwsr-xr-x
- 补充 Linux 权限位表示
-
Linux下文件的权限位共有十个:按照 “1333” 来划分
-
第一位代表文件类型
- 文件类型表
文件属性 文件类型 - 普通文件 d 目录文件 c 字符设备文件 b 块文件 p 管道文件 s socket文件
- 文件类型表
-
2~4位代表文件拥有者对于该文件所拥有的权限
-
5~7位代表文件所属组对于该文件所拥有的权限
-
后三位代表其他人(除了拥有者和所属组之外的人)对于该文件所拥有的权限。
- 文件权限表
权限符号 符号全称 符号含义 r read 可读 w write 可写 x execute 可执行
- 文件权限表
-
Linux 附加权限:linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做 Linux 附加权限。包括 SET位权限(suid,sgid)和粘滞位权限(sticky)。
- SET位权限:
suid/sgid
是为了使没有取得特权用户要完成一项必须要有特权才可以执行的任务而产生的。 一般用于给可执行的程序或脚本文件进行设置,其中 SUID 表示对属主用户增加SET位权限,SGID 表示对属组内用户增加 SET 位权限。执行文件被设置了 SUID、SGID 权限后,任何用户执行该文件时,将获得该文件属主、属组账号对应的身份。 suid
(set User ID,set UID) 的意思是进程执行一个文件时通常保持进程拥有者的 UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的 UID。- 如果一个文件被设置了
suid
或sgid
位,会分别表现在所有者或同组用户的权限的可执行位上;如果文件设置了suid
还设置了x(执行)位,则相应的执行位表示为s(小写)。但是,如果没有设置x位,它将表示为S(大写)。如:1、-rwsr-xr-x 表示设置了suid,且拥有者有可执行权限 2、-rwSr--r-- 表示suid被设置,但拥有者没有可执行权限 3、-rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限 4、-rw-r-Sr-- 表示sgid被设置,但群组用户没有可执行权限
- SET位权限:
-
- 运行一个普通的程序,如 Vim,使用
- setuid 的例子
- sudo:允许普通用户以 root 用户权限执行程序
- ping:允许用户从底层创建 ICMP 原始数据包,因为 Linux 系统一般不允许普通用户这样做
- 利用 setuid,可以获得安卓或 IOS 系统的 root 权限