1. linux kernel debug symbol
  2. 内核编译
  3. 什么是堆风水
  4. kmalloc 分配顺序
    1. slab_alloc_node
    2. ___slab_alloc
  5. Buddy System
  6. slab 和 buddy 之间 order 计算

【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 是什么呀…

内核编译

前言 - Kernel Exploring

什么是堆风水

从 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 对应大小的 (线段树动态开点!). 释放时, 如果可以, 会将相邻的两个合并成一个大的, 一直往上合并.

linux-source-code-analyze/physical-memory-buddy-system.md at master · liexusong/linux-source-code-analyze

slab 和 buddy 之间 order 计算