[DESCRIPTION]
踩内存是最难调试的问题之一,kernel里大部分kernel结构体都是从slub分配出去的,因此slub踩内存也是常见的问题。
通常遇到踩内存,我们会切换的eng版本复现,eng版本有开slub debug功能,会对free memory填充0x6b,pad填充0x5a等等,同时还会记录申请和释放的调用栈,可以轻易查出use after free问题。
下面将给出查看slub内存申请/释放的调用栈的方法。
[SOLUTION]
在eng版本,抓到minidump或ramdump情况下,如果有dump到slub memory,那么可以根据slub memory layout找出存放申请/释放的调用栈的位置,推导出申请/释放调用栈。具体位置看对应的代码就知道了:
[C/C++]
hide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
static
struct
track *get_track(
struct
kmem_cache *s,
void
*object,
enum
track_item alloc)
{
struct
track *p;
if
(s->offset)
p = object + s->offset +
sizeof
(
void
*);
else
p = object + s->inuse;
return
p + alloc;
}
|
可以看到是放在后面,已下面的例子来讲:
[C/C++]
hide