- 一字节溢出修改了什么 ( 调一下 ) 修改楽这个大小的结构体 free 之后在被其他东西 malloc 所在的新结构体
- slub allocator 向 buddy system 请求页面的过程
- buddy system
- 进程的 task_struct 的 cred 为 init_cred
【CTF.0x08】D^ 3CTF2023 d3kcache 出题手记
https://blog.xmcve.com/2023/11/12/%E5%BC%BA%E7%BD%91%E6%8B%9F%E6%80%812023-Writeup/#title-7
linux kernel debug symbol
pwndbg> ptype/ox kmem_cache
type = <data variable, no debug info>
两种方法获取调试符号,一种是编译时带调试符号信息,另一种是下载源代码并在调试时附加
kernel-debug - butter-fly ubuntu 提供了调试信息仓库,不过应该只能下载发新版 kernel (?)小版本没有?
没有符号表就感觉只能肉眼识别/自己写结构体导入/编译一个,可是我不知道题目的内核的 CONFIG 是什么呀…
内核编译
什么是堆风水
从 corCTF 一道 kernel pwn 看 Linux 内核 cross-cache overflow 与页级堆风水 - 先知社区
首先让我们重新审视 slub allocator 向 buddy system 请求页面的过程,当 freelist page 已经耗空且 partial 链表也为空时(或者 kmem_cache
刚刚创建后进行第一次分配时),其会向 buddy system 申请页面:
kmalloc 分配顺序
linuxStack/关于内存分配的一些事.md at master · g0dA/linuxStack
slab_alloc_node
- 慢分配
if (!USE_LOCKLESS_FAST_PATH() ||
unlikely(!object || !slab || !node_match(slab, node))) {
object = __slab_alloc(s, gfpflags, node, addr, c, orig_size);
- 快分配
void *next_object = get_freepointer_safe(s, object);
if (unlikely(!this_cpu_cmpxchg_double(
s->cpu_slab->freelist, s->cpu_slab->tid,
object, tid,
next_object, next_tid(tid)))) {
note_cmpxchg_failure("slab_alloc", s, tid);
goto redo;
}
prefetch_freepointer(s, next_object);
stat(s, ALLOC_FASTPATH);
___slab_alloc
slab = alloc_slab_page(alloc_gfp, node, oo);
if (unlikely(!slab)) {
oo = s->min;
alloc_gfp = flags;
/*
* Allocation may have failed due to fragmentation.
* Try a lower order alloc if possible
*/
slab = alloc_slab_page(alloc_gfp, node, oo);
if (unlikely(!slab))
return NULL;
stat(s, ORDER_FALLBACK);
}
处理新分配的 slab
freelist = slab->freelist;
slab->freelist = NULL;
slab->inuse = slab->objects;
slab->frozen = 1;
inc_slabs_node(s, slab_nid(slab), slab->objects);
Buddy System
专门用来分配以页为单位的大内存空间, 且大小必须是 2 的整数次幂, $2^{order}×PGSIZE$. 分配时会找 order 对应的块, 如果没有, 则向上找更大的去分割一半, 直到分割出一块 order 对应大小的 (线段树动态开点!). 释放时, 如果可以, 会将相邻的两个合并成一个大的, 一直往上合并.