Advanced IO
genops.c
其中定义了许多公共子函数,为具体跳表函数的实现提供基础功能
int _IO_switch_to_get_mode (FILE *fp)
此函数在同一个文件描述符变为get模式时可用,也就是准备从文件想缓冲区写入东西时可用
fileops.c
跳表函数的核心实现
int _IO_new_file_overflow (FILE *f, int ch)
此函数用于刷新和维护输出缓冲区
流程:
1.错误检查
2.从读切换到write,或第一次write都会进入此分支
2.1 若没有缓冲区,则设置缓冲区
2.2 backup的处理,目前还没学过
2.3 调整读写缓冲区指针,基本思想为:将writeptr与writebase更新为readptr,防止readbase和readptr有数据未读取完成;将writeend更新为bufend,尽可能利用缓冲区;将readptr,readbase,readend放到同一个位置。(感觉这操纵有点迷,自己想维护readbase到readptr之间的数据,后面又将他们放到同一个位置,这不前后矛盾吗,可能由于版本迭代之后逻辑比较 ...
Kernel_proctect & exploit
摘抄自https://pawnyable.cafe/linux-kernel/introduction/security.html
保护措施SMEP(Supervisor Mode Execution Prevention)
它禁止在执行内核空间代码时突然执行用户空间代码,硬件安全机制
/*可查看系统的保护信息,其中的flag字段显示*/cat /proc/cpuinfo
SMAP(Supervisor Mode Access Prevention)
如果启用了 SMAP,则用户空间(ROP 链)中的数据 mmapped 在内核空间中不可见,因此堆栈枢轴的 ret 指令会触发内核崩溃,硬件安全机制
KASLR/FGKASLR
它可以随机化 Linux 内核和设备驱动程序代码数据区域的地址。一旦内核加载,它就不会移动,因此 KASLR 在启动时只工作一次。
自 2020 年初以来,出现了一种名为 FGKASLR(功能粒度 KASLR)的更强大的 KASLR。 截至 2022 年,它似乎默认处于禁用状态,但这是一种为 Linux 内核中的每个函数随机化地址的技术。 即使 L ...
Kernel(Local Privilege Escalation)
摘抄自https://pawnyable.cafe/linux-kernel/introduction/security.html
部分参考:深入理解LINUX内核
https://yuanfentiank789.github.io/2016/12/31/security1/
https://book.hacktricks.xyz/linux-hardening/privilege-escalation/euid-ruid-suid
task_struct部分结构
主要考虑其中的指向cred的指针
/* / include / linux / sched.h*/struct task_struct { ... /* Process credentials: */ /* Tracer's credentials at attach: */ const struct cred __rcu *ptracer_cred; /* Objective and real subjective task credentials (COW): */ const struct ...
KernelStart
参考教程做个总结
https://pawnyable.cafe/linux-kernel/introduction/introduction.html
磁盘映像的挂载
可以本地修改,如修改初始化相关和符号表相关
/*文件系统*/mkdir rootmount rootfs.img root/*cpio*/mkdir rootcd rootcpio -idv < ../rootfs.cpio/*归档操作*/find . -print0 | cpio -o --format=newc --null > ../rootfs_updated.cpio
gdb调试初始化相关
当内核启动时,它首先运行一个程序。 该程序的路径因配置而异,但在大多数情况下,它位于 /init、/sbin/init 等中。
/*获得加载模块的基址*/cat /proc/modules/*获得符号信息更改/home/l/kernelpwn/LK01/qemu/root/etc/init.d/S99pawnyable*/echo 2 > /proc/sys/kernel/kptr_restri ...
POC for LagerbinAttach
关于largebin图片来源:[原创]Largebin attack总结-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com
任意地址写入堆地址思路1.需要存在uaf漏洞,也就是可以修改largebin的bcksize字段2.需要申请足够多的堆块(用于隔离和清空unsortedbin)
原理
主要是largechunk入链的时候的漏洞,若unsortedbin中没有合适堆块,则会将unsortedbin中的堆块放到smallbin和lagerbin中。完整代码:
/* place chunk in bin */ if (in_smallbin_range (size)) { victim_index = smallbin_index (size); bck = bin_at (av, victim_index); fwd = bck->fd; } else { ...
POC for SmallbinAttach
感觉挺恶心的回来用的时候再学吧(应用范围貌似没那么广)。
POC for IOFILE
深入学习一下IO的比较简单的部分的源代码,并简单写一下poc
参考链接:https://xz.aliyun.com/t/6567?time__1311=n4%2BxnD0Dg7G%3DBhDBqooGkDRm8DCY1DuAAnOoD
DEMO1-Fread
演示了如何利用fread进行任意地址写,主要就是将缓冲区构造成目标地址,需要注意的是缓冲区当占满的时候可能会被新数据覆盖,因此小心使用。简单总结一下原理:
1.将缓冲区读写和目标位置的读写分开,分成大概两个模块,一个是将缓冲区的数据读到目标位置,一个是利用系统调用将文件中的数据督导缓冲区,这两个模块都会维护读指针和缓冲区的关系。
2.总体方向就如1所说,其中的比较重要的细节可以分为(本人理解):
2.1 缓冲区的分配,需要设置flag来绕过,否则就会覆盖之前构造好的指针
2.2 关于其他的flag,我的建议是越少越好,flag多的话,设计的函数也会变多,虽然说逻辑可以明白,但是非常混乱,包括但不限于,save buf的交替处理,读写缓冲区共用,等等,但是中心思想还是第一点所说的,这是非常重要的。
2.3 当writ ...
os文件系统
关于os持久化的一些学习
硬件基础(磁盘)几何结构访问机制RAID初始化与os访问机制(文件系统与挂载)
磁盘进行格式化的方式无非就是加入一些元信息来让os实现软件式的数据交互与管理,初始化为不同的文件系统的类型有多种多样的管理方式,但是机制无非就那几种。
核心还是理解数据结构,算法的话,有多种多样的实现
文件系统的整体架构(以VSFS为例)
S:为文件系统挂载之后所需用来描述文件系统的一些核心信息,在ELF中类似于fileheader
i:inode位图,用来描述哪个inode为空
d:数据位图,用来描述哪个数据块为空
inodes:在每个inode中,实际上是所有关于文件的信息:文件类型(例如,常规文件、目录等)、大小、分配给它的块数、保护信息(如谁拥有该文件以及谁可以访问它)、一些时间信息(包括文件创建、修改或上次访问的时间文件下),以及有关其数据块驻留在磁盘上的位置的信息(如某种类型的指针)。我们将所有关于文件的信息称为元数据(metadata)。实际上,文件系统中除了纯粹的用户数据外,其他任何信息通常都称为元数据。
inode机制
在每个inode中,实际上是所有关 ...
一些库调用链
关于链接器的库装载过程学习了动态链接的过程之后,想深入学习一下,奈何实现过程过于复杂,实在没有能力去理解代码,就了解一下其调用过程吧,以64位程序动态链接为例子。
_start -> _dl_start,这两步主要是链接器的自举,跳过中间几步的关于数据收集的一些函数就到了dl_main这个函数,可以看出实现基本尚在rtld.c这个文件,但最开始start的函数是在dl-machine.h定义的,可以自行观看。pwndbg> info bNum Type Disp Enb Address What6 breakpoint keep y 0x00007ffff7fe44e0 in elf_machine_rela at ../sysdeps/x86_64/dl-machine.h:3237 breakpoint keep y 0x00007ffff7fe4030 in _dl_start at ./elf/rtld.c:5278 breakpoint keep ...
程序装载简析
作为一个高视角的科普吧,动态链接在装载过程中做了非常复杂的操作,还需要深入学习。
关于分段和分页核心思想就是虚拟化,如何共用同一块内存,如何实现物理内存的复用,MMU和交换空间的发展使之一步一步成为可能,至于如何进行换页,如何进行映射这是OS该管的事,OS使用MMU提供的接口实现一些列换页算法,如LRU等等,装载器的实现的核心代码也是定义在内核中的,主要分为以下几步:
按我的理解就是,根据elf的各个段的大小以及类型等各个字段,来建立虚拟内存和文件系统以及物理内存之间的映射关系(俗称页表)。当然进程管理系统,也应该做事,这里只讨论文件装载。决定装载的映射关系的一个重要的地方就是内部碎片和外部碎片,感觉这两个非常矛盾,需要trade-off。段页式管理,多级页表虽然缓解了外部碎片,但是同样加剧了内部碎片,使本应该不占一个页的段,占据一个页空间。感觉这里面极度需要平衡,至于该如何装载那就是OS的事了。但是装载之前elf也是做了一些工作,可执行文件有一个叫程序头的东西,俗称段表,貌似也可以对装载的过程一窥一二。
program header
其中描述了各个段的信息,大概就是描述了什么文件偏 ...