userfaultfd
userfaultfd 是一个系统调用, 可以用来自定义 handler 处理缺页等情况. 简单来说是通过新建一个线程, 然后监视一个页面. 在任何时刻出现了缺页的情况, 触发缺页的线程挂起, 监视线程进行处理, 处理完毕后唤醒之前挂起的线程.
在 CTF 题中通常用来卡条件竞争. 当内核模块中有 copy from/to user 的时候, 内核模块会访问用户的空间. 如果我们传入的是一个被 uffd 监视的地址, 那么这个线程将会被挂起直到处理结束. 这样就能够控制内核中线程的执行顺序, 从而更好的达到想要的竞争效果.
uffd 使用模板如下:
Kernel Pwn Struct ldt_struct and Syscall modify_ldt
Kernel Pwn Struct seq_operations and Struct pt_regs
seq_operations
代码分析
当打开一个 stat 文件, 如 /proc/self/stat 时, 内核会从 kalloc-32 中分配一个 seq_operations (0x20), 这个结构体如下:
「笔记」随机过程与排队论
「笔记」应用密码学与网络安全
古典密码
代替和置换
凯撒密码
单表代替密码.
$c = p + k \mod |\Sigma|$
统计频率可以攻击
Playfair
多字母代替密码
在 $5 \times 5$ 的矩阵中, 从左到右从上到下, 先填入密钥, 然后再按顺序填入剩余字母. 其中 I = J.
明文两个字母一组. 若一组字母相同, 则插入一个字母 (如 x). 若明文长度奇数, 则最后补一个字母 (如 x).
两字母在表上
- 同行, 用右边一个代替
- 同列, 用下面一个代替
- 对角线代替, (第一个字母所在行, 第二个字母所在列), (第一个字母所在列, 第二个字母所在行)
明密文不是一一对应关系, 能够降低统计规律, 但仍然有结构信息, 可被攻破.
Hill 密码
多字母代替密码
$n \times n$ 可逆矩阵 K, 明文分组, $n \times 1$ 的列向量 $p$.
加密: $c = Kp \mod |\Sigma|$
解密: $p = K^{-1}c \mod |\Sigma|$