Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


[리눅스커널][디버깅] 슬럽(슬랩) 오브젝트 레드존 데이터 구조 T32로 메모리 디버깅(1) 14. Memory Management

이번 시간에서는 슬럽 오브젝트의 레드 존에 대해서 확인하는 시간을 갖겠습니다.
여러 개발자들이 리눅스 드라이버를 개발하다 보면 슬럽 오브젝트를 깨버리는 코드를 작성할 수 있습니다.
결과 메모리가 오염돼서 랜덤하게 커널 크래시가 발생합니다. 

이런 상황에 메모리 오염을 일으킨 범인을 찾기 위해 슬럽 오브젝트에 포이즌과 레드존을 추가했습니다.

Free 슬럽 오브젝트 데이터 스트럭처 확인하기 
먼저 kmalloc_caches 전역 변수를 통해 "kmalloc-64" 슬럽 캐시 주소를 알아봅시다.
01  (static struct kmem_cache * [14]) kmalloc_caches = (
02    [0x0] = 0x0,
03    [0x1] = 0x0,
04    [0x2] = 0xE4402340,
05    [0x3] = 0x0,
06    [0x4] = 0x0,
07    [0x5] = 0x0,
08    [0x6] = 0xE44021C0 -> (
09      (struct kmem_cache_cpu *) cpu_slab = 0xC1781AA0,
10      (long unsigned int) flags = 0x80010D00,
11      (long unsigned int) min_partial = 0x5,
12      (int) size = 0x0140,
13      (int) object_size = 0x40,
14      (int) offset = 0x44,
15      (int) cpu_partial = 0x0,
...
16      (int) inuse = 0x44,
17      (int) align = 0x40,
18      (int) reserved = 0x0,
19      (char *) name = 0xE4405E40 -> "kmalloc-64",

08 번째와 19 번째 줄 정보로 "kmalloc-64" 슬럽 캐시의 주소는 0xE44021C0임을 알 수 있습니다.

다음 mem_map 시작 주소를 확인합시다.
  [-] &mem_map[0] = 0xE4CF9000

0xE4CF9000 메모리 주소에서 시작해 0xE44021C0 주소를 검색합니다.
________address|________0________4________8________C_0123456789ABCDEF
   NSD:E4CFB490| 00000000 00000000 00000000 00000000 ................
   NSD:E4CFB4A0| 00000000 00000000 00008100 00000000 ................
   NSD:E4CFB4B0| C0067BC0 00190001 00000001 E55FE92C .{..........,._.
   NSD:E4CFB4C0| E527F02C E44021C0 00000000 00000001 ,.'..!@.........
  
검색 결과 0xE4CFB4A8 주소가 0xE44021C0 슬럽 캐시를 관리하는 슬럽 페이지임을 알 수 있습니다.

위 메모리 덤프에서 00008100가 struct page 구조체 flags이고 0xC0067BC0 가 freelist입니다.

0xE4CFB4A8 주소를 struct page 구조체로 캐스팅을 해도 같은 결과를 확인할 수 있습니다.
01  (struct page *) (struct page*)0xE4CFB4A8 = 0xE4CFB4A8 -> (
02    (long unsigned int) flags = 0x8100,
03    (struct address_space *) mapping = 0x0,
04    (void *) s_mem = 0x0,
05    (long unsigned int) index = 0xC0067BC0,
06    (void *) freelist = 0xC0067BC0,

06 번째 줄에서 freelist가 0xC0067BC0 이니 0xC0067BC0 주소 메모리 덤프를 보겠습니다.

d.v %y.l 0xC0067BC0 
________address|_data________|value_______|symbol
   NSD:C0067BC0| 6B 6B 6B 6B  0x6B6B6B6B  //<-- "kmalloc-64" 슬럽 오브젝트 시작 주소
   NSD:C0067BC4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BC8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BCC| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BD0| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BD4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BD8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BDC| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BE0| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BE4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BE8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BEC| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BF0| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BF4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BF8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BFC| 6B 6B 6B A5  0xA56B6B6B //<-- "kmalloc-64" 슬럽 오브젝트 끝 주소 
   NSD:C0067C00| BB BB BB BB  0xBBBBBBBB //<<-- 레드존: #define SLUB_RED_INACTIVE 0xbb
   NSD:C0067C04| C0 67 06 C0  0xC00667C0 //<<-- 다음 "kmalloc-64" Free 슬럽 오브젝트 주소 
   NSD:C0067C08| 14 EE 34 C0  0xC034EE14   \\vmlinux\hooks\selinux_file_alloc_security+0x38  //<<-- 오브젝트 할당 주소
   NSD:C0067C0C| 14 EE 34 C0  0xC034EE14   \\vmlinux\hooks\selinux_file_alloc_security+0x38  //<<-- 오브젝트 할당 콜스택, 시작
   NSD:C0067C10| CC B9 22 C0  0xC022B9CC   \\vmlinux\file_table\get_empty_filp+0xE4
   NSD:C0067C14| B8 74 23 C0  0xC02374B8   \\vmlinux\fs/namei\path_openat+0x28
   NSD:C0067C18| 28 82 23 C0  0xC0238228   \\vmlinux\fs/namei\do_filp_open+0x2C
   NSD:C0067C1C| 84 97 22 C0  0xC0229784   \\vmlinux\open\do_sys_open+0x110
   NSD:C0067C20| 1C 62 10 C0  0xC010621C   \\vmlinux\Global\__sys_trace_return //<<-- 오브젝트 할당 콜스택, 끝
   NSD:C0067C24| 00 00 00 00  0x0           
   NSD:C0067C28| 00 00 00 00  0x0           
   NSD:C0067C2C| 00 00 00 00  0x0          
   NSD:C0067C30| 00 00 00 00  0x0          
   NSD:C0067C34| 00 00 00 00  0x0           
   NSD:C0067C38| 00 00 00 00  0x0          
   NSD:C0067C3C| 00 00 00 00  0x0           
   NSD:C0067C40| 00 00 00 00  0x0           
   NSD:C0067C44| 00 00 00 00  0x0           
   NSD:C0067C48| 00 00 00 00  0x0          
   NSD:C0067C4C| 07 00 00 00  0x7       
   NSD:C0067C50| 14 7C 00 00  0x7C14
   NSD:C0067C54| 8E C2 02 00  0x2C28E
   NSD:C0067C58| B8 B6 22 C0  0xC022B6B8   \\vmlinux\file_table\__fput+0xDC //<<-- 오브젝트 해제한 주소와 콜스택 시작
   NSD:C0067C5C| 44 E9 13 C0  0xC013E944   \\vmlinux\task_work\task_work_run+0xB8
   NSD:C0067C60| 48 A0 10 C0  0xC010A048   \\vmlinux\arch/arm/kernel/signal\do_work_pending+0xA0
   NSD:C0067C64| D4 60 10 C0  0xC01060D4   \\vmlinux\Global\work_pending+0x0C //<<-- 오브젝트 해제 콜스택 끝
   NSD:C0067C68| 00 00 00 00  0x0          
   NSD:C0067C6C| 00 00 00 00  0x0         
   NSD:C0067C70| 00 00 00 00  0x0          
   NSD:C0067C74| 00 00 00 00  0x0          
   NSD:C0067C78| 00 00 00 00  0x0          
   NSD:C0067C7C| 00 00 00 00  0x0           
   NSD:C0067C80| 00 00 00 00  0x0          
   NSD:C0067C84| 00 00 00 00  0x0          
   NSD:C0067C88| 00 00 00 00  0x0          
   NSD:C0067C8C| 00 00 00 00  0x0           
   NSD:C0067C90| 00 00 00 00  0x0         
   NSD:C0067C94| 00 00 00 00  0x0          
   NSD:C0067C98| 00 00 00 00  0x0          
   NSD:C0067C9C| 07 00 00 00  0x7          
   NSD:C0067CA0| 14 7C 00 00  0x7C14
   NSD:C0067CA4| 8E C2 02 00  0x2C28E
   NSD:C0067CA8| 5A 5A 5A 5A  0x5A5A5A5A
   NSD:C0067CAC| 5A 5A 5A 5A  0x5A5A5A5A
   NSD:C0067CB0| 5A 5A 5A 5A  0x5A5A5A5A
   NSD:C0067CB4| 5A 5A 5A 5A  0x5A5A5A5A
   NSD:C0067CB8| 5A 5A 5A 5A  0x5A5A5A5A

위 메모리 덤프 확인 결과 슬럽 디버그 기능이 추가된 시스템에서 슬럽 오브젝트 자료구조 패턴을 다음과 같습니다.
------------------------   
슬럽 오브젝트(페이로드)
------------------------   
레드 존
------------------------   
다음 Free 슬럽 오브젝트 주소 
------------------------   
콜스택 
슬럽 오브젝트 할당 
슬럽 오브젝트 해제 
------------------------   

조금 더 자세히 슬럽 오브젝트 데이터를 살펴보겠습니다. 

포이즌 확인하기 

먼저 슬럽 오브젝트 시작 주소인 0xC0067BC0~0xC0067BFC를 보겠습니다.    
________address|_data________|value_______|symbol
   NSD:C0067BC0| 6B 6B 6B 6B  0x6B6B6B6B  //<-- "kmalloc-64" 슬럽 오브젝트 시작 주소
   NSD:C0067BC4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BC8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BCC| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BD0| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BD4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BD8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BDC| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BE0| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BE4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BE8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BEC| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BF0| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BF4| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BF8| 6B 6B 6B 6B  0x6B6B6B6B
   NSD:C0067BFC| 6B 6B 6B A5  0xA56B6B6B //<-- "kmalloc-64" 슬럽 오브젝트 끝 주소 
   NSD:C0067C00| BB BB BB BB  0xBBBBBBBB //<<-- 레드존: #define SLUB_RED_INACTIVE 0xbb
   NSD:C0067C04| C0 67 06 C0  0xC00667C0 //<<-- 다음 "kmalloc-64" Free 슬럽 오브젝트 주소 

0xC0067BC0~0xC0067BFC 범위는 0x40(십진수: 64)이며 0x6B6B6B6B 값으로 채워져 있습니다.

이 값을 슬럽 오브젝트의 포이즌이라고 부르며 다음 해더 파일에 POISON_FREE 플래그로 정의돼 있습니다.
https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/poison.h#L57   
#define POISON_FREE 0x6b /* for use-after-free poisoning */
#define POISON_END 0xa5 /* end-byte of poisoning */

슬럽 오브젝트를 할당해주면 실제 디바이스 드라이버에서 쓰는 메모리 영역이며 이를 해더와 분류해 패이로드라고도 합니다.
이 공간에 0x6B6B6B6B를 채워 넣어서 이 슬럽 오브젝트는 해재한 상태라고 포이즌을 써주는 것입니다.

만약 이 슬럽 오브젝트를 할당하게 되면 0x6B6B6B6B로 채워져 있는 메모리 덤프는 디바이스 드바이버에서 선언한 구조체 필드로 바뀔 것입니다.

만약 binder_inc_ref_for_node() 함수에서 struct binder_ref 구조체 크기로 kmalloc-64 슬럽 오브젝트를 할당하면,
struct binder_ref 구조체 필드 값으로 채워지게 됩니다. 참고로 struct binder_ref 구조체 크기는 62바이트이니 
kmalloc() 함수를 호출해 메모리 할당을 요청하면 "kmalloc-64" 슬럽 오브젝트를 할당합니다.
[https://elixir.bootlin.com/linux/v5.0.5/source/drivers/android/binder.c]
01 static int binder_inc_ref_for_node(struct binder_proc *proc,
02 struct binder_node *node,
03 bool strong,
04 struct list_head *target_list,
05 struct binder_ref_data *rdata)
06 {
07 struct binder_ref *ref;
08 struct binder_ref *new_ref = NULL;
09 int ret = 0;
10
11 binder_proc_lock(proc);
12 ref = binder_get_ref_for_node_olocked(proc, node, NULL);
13 if (!ref) {
14 binder_proc_unlock(proc);
15 new_ref = kmalloc(sizeof(*ref), GFP_KERNEL);

다음은 슬럽 오브젝트 패이로드 끝 주소를 보겠습니다.
   NSD:C0067BFC| 6B 6B 6B A5  0xA56B6B6B //<-- "kmalloc-64" 슬럽 오브젝트 끝 주소 
   NSD:C0067C00| BB BB BB BB  0xBBBBBBBB //<<-- 레드존: #define SLUB_RED_INACTIVE 0xbb
   NSD:C0067C04| C0 67 06 C0  0xC00667C0 //<<-- 다음 "kmalloc-64" Free 슬럽 오브젝트 주소 

0xC0067BFC 주소 가장 마지막 부분에 0xA5가 보입니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/poison.h] 
#define POISON_FREE 0x6b /* for use-after-free poisoning */
#define POISON_END 0xa5 /* end-byte of poisoning */ 
   
이는 위 해더 파일 POISON_END 플래그 선언부와 같이 0xa5를 저장한 것입니다. 포이즌의 마지막 바이트에 이 값을 써줍니다.

다음은 래드존을 볼 차례입니다.
   NSD:C0067C00| BB BB BB BB  0xBBBBBBBB //<<-- 레드존: #define SLUB_RED_INACTIVE 0xbb
   NSD:C0067C04| C0 67 06 C0  0xC00667C0 //<<-- 다음 "kmalloc-64" Free 슬럽 오브젝트 주소 

0xBB의 정체는 다음 해더 파일과 같이 SLUB_RED_INACTIVE 이며 현재 슬럽 오브젝트를 쓰고 있지 않은 상태란 의미입니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/poison.h]    
#define SLUB_RED_INACTIVE 0xbb
#define SLUB_RED_ACTIVE 0xcc   

슬럽 오브젝트를 쓰고 있지 않다란 말은 Free 슬럽 오브젝트란 뜻입니다.

다음 C0067C04 주소에 있는 0xC00667C0는 다음 Free 슬럽 오브젝트 주소를 의미합니다.

슬럽 오브젝트 콜스택 정보 

이번에는 슬럽 오브젝트를 할당하거나 해재한 정보를 담고 있는 콜스택을 보겠습니다.
   NSD:C0067C08| 14 EE 34 C0  0xC034EE14   \\vmlinux\hooks\selinux_file_alloc_security+0x38  //<<-- 오브젝트 할당 주소
   NSD:C0067C0C| 14 EE 34 C0  0xC034EE14   \\vmlinux\hooks\selinux_file_alloc_security+0x38  //<<-- 오브젝트 할당 콜스택, 시작
   NSD:C0067C10| CC B9 22 C0  0xC022B9CC   \\vmlinux\file_table\get_empty_filp+0xE4
   NSD:C0067C14| B8 74 23 C0  0xC02374B8   \\vmlinux\fs/namei\path_openat+0x28
   NSD:C0067C18| 28 82 23 C0  0xC0238228   \\vmlinux\fs/namei\do_filp_open+0x2C
   NSD:C0067C1C| 84 97 22 C0  0xC0229784   \\vmlinux\open\do_sys_open+0x110
   NSD:C0067C20| 1C 62 10 C0  0xC010621C   \\vmlinux\Global\__sys_trace_return //<<-- 오브젝트 할당 콜스택, 끝
   NSD:C0067C24| 00 00 00 00  0x0           
   NSD:C0067C28| 00 00 00 00  0x0           

selinux_file_alloc_security+0x38 주소(C034EE10) 코드를 가보니 kmem_cache_alloc_trace() 함수를 호출해 메모리 할당을 요청합니다.
______addr/line|code_____|label____|mnemonic________________|comment
   NSR:C034EE08|E59F3020            ldr     r3,0xC034EE30
   NSR:C034EE0C|E5930018            ldr     r0,[r3,#0x18]    ; file,[r3,#24]
   NSR:C034EE10|EBFB41E2            bl      0xC021F5A0       ; kmem_cache_alloc_trace

참고로 C 코드에서 kmalloc() 함수를 호출해도 어셈블리 코드를 보면 kmem_cache_alloc_trace() 심볼이 보입니다.
그 이유는 kmalloc() 함수가 인라인 함수 형태라 심볼이 없기 때문입니다.
01 static __always_inline void *kmalloc(size_t size, gfp_t flags)
02 {
03 if (__builtin_constant_p(size)) {
04 if (size > KMALLOC_MAX_CACHE_SIZE)
05 return kmalloc_large(size, flags);
06 #ifndef CONFIG_SLOB
07 if (!(flags & GFP_DMA)) {
08 int index = kmalloc_index(size);
09
10 if (!index)
11 return ZERO_SIZE_PTR;
12
13 return kmem_cache_alloc_trace(kmalloc_caches[index],
14 flags, size);
15 }
16 #endif
17 }
18 return __kmalloc(size, flags);
19}

01 번째 줄 코드를 보면 kmalloc() 함수 선언부에 __always_inline 플래그가 보입니다. 
13 번째 줄 코드에서 kmem_cache_alloc_trace() 함수를 호출합니다.     

다음 kmalloc-64 슬럽 오브젝트를 해제한 콜스택 덤프를 보겠습니다.
   NSD:C0067C58| B8 B6 22 C0  0xC022B6B8   \\vmlinux\file_table\__fput+0xDC //<<-- 오브젝트 해제한 주소와 콜스택 시작
   NSD:C0067C5C| 44 E9 13 C0  0xC013E944   \\vmlinux\task_work\task_work_run+0xB8
   NSD:C0067C60| 48 A0 10 C0  0xC010A048   \\vmlinux\arch/arm/kernel/signal\do_work_pending+0xA0
   NSD:C0067C64| D4 60 10 C0  0xC01060D4   \\vmlinux\Global\work_pending+0x0C //<<-- 오브젝트 해제 콜스택 끝

__fput+0xDC(0xC022B6B8) 주소에서 해당 kmalloc-64 슬럽 오브젝트를 해제했다는 정보입니다. 

__fput+0xDC(0xC022B6B8) 주소 코드를 보면 security_file_free() 함수 호출로 해당 슬랩 오브젝트를 해제했음을 알 수 있습니다. 
______addr/line|code_____|label____|mnemonic________________|comment
   NSR:C022B6B0|E1A00004            cpy     r0,r4            ; r0,file
   NSR:C022B6B4|EB048030            bl      0xC034B77C       ; security_file_free
 
이제 까지 슬럽 오브젝트를 할당한 콜스택을 메모리 덤프에서 확인했습니다.
그런데 슬럽 자료구조에서는 조금 더 유익한 정보를 출력합니다. 다시 kmalloc-64 슬럽 오브젝트 할당/해제 정보가 담긴 메모리 덤프를 보겠습니다.
   NSD:C0067C08| 14 EE 34 C0  0xC034EE14   \\vmlinux\hooks\selinux_file_alloc_security+0x38  //<<-- 오브젝트 할당 주소
   NSD:C0067C0C| 14 EE 34 C0  0xC034EE14   \\vmlinux\hooks\selinux_file_alloc_security+0x38  //<<-- 오브젝트 할당 콜스택, 시작
   NSD:C0067C10| CC B9 22 C0  0xC022B9CC   \\vmlinux\file_table\get_empty_filp+0xE4
   NSD:C0067C14| B8 74 23 C0  0xC02374B8   \\vmlinux\fs/namei\path_openat+0x28
   NSD:C0067C18| 28 82 23 C0  0xC0238228   \\vmlinux\fs/namei\do_filp_open+0x2C
   NSD:C0067C1C| 84 97 22 C0  0xC0229784   \\vmlinux\open\do_sys_open+0x110
   NSD:C0067C20| 1C 62 10 C0  0xC010621C   \\vmlinux\Global\__sys_trace_return //<<-- 오브젝트 할당 콜스택, 끝
   NSD:C0067C24| 00 00 00 00  0x0           
   NSD:C0067C28| 00 00 00 00  0x0           
   NSD:C0067C2C| 00 00 00 00  0x0          
   NSD:C0067C30| 00 00 00 00  0x0          
   NSD:C0067C34| 00 00 00 00  0x0           
   NSD:C0067C38| 00 00 00 00  0x0          
   NSD:C0067C3C| 00 00 00 00  0x0           
   NSD:C0067C40| 00 00 00 00  0x0           
   NSD:C0067C44| 00 00 00 00  0x0           
   NSD:C0067C48| 00 00 00 00  0x0          
   NSD:C0067C4C| 07 00 00 00  0x7       
   NSD:C0067C50| 14 7C 00 00  0x7C14
   NSD:C0067C54| 8E C2 02 00  0x2C28E
   NSD:C0067C58| B8 B6 22 C0  0xC022B6B8   \\vmlinux\file_table\__fput+0xDC //<<-- 오브젝트 해제한 주소와 콜스택 시작
   NSD:C0067C5C| 44 E9 13 C0  0xC013E944   \\vmlinux\task_work\task_work_run+0xB8
   NSD:C0067C60| 48 A0 10 C0  0xC010A048   \\vmlinux\arch/arm/kernel/signal\do_work_pending+0xA0
   NSD:C0067C64| D4 60 10 C0  0xC01060D4   \\vmlinux\Global\work_pending+0x0C //<<-- 오브젝트 해제 콜스택 끝
   NSD:C0067C68| 00 00 00 00  0x0          
   NSD:C0067C6C| 00 00 00 00  0x0         
   NSD:C0067C70| 00 00 00 00  0x0          
   NSD:C0067C74| 00 00 00 00  0x0          
   NSD:C0067C78| 00 00 00 00  0x0          
   NSD:C0067C7C| 00 00 00 00  0x0           
   NSD:C0067C80| 00 00 00 00  0x0          
   NSD:C0067C84| 00 00 00 00  0x0          
   NSD:C0067C88| 00 00 00 00  0x0          
   NSD:C0067C8C| 00 00 00 00  0x0           
   NSD:C0067C90| 00 00 00 00  0x0         
   NSD:C0067C94| 00 00 00 00  0x0          
   NSD:C0067C98| 00 00 00 00  0x0          
   NSD:C0067C9C| 07 00 00 00  0x7          
   NSD:C0067CA0| 14 7C 00 00  0x7C14

슬럽 오브젝트 할당 콜스택 정보는 C0067C08 주소에서 시작하고 해제 콜스택은 C0067C58 주소에서 시작합니다.
리눅스 커널에서는 struct track 이란 구조체로 프로세스 콜 스택 할당 정보를 관리합니다. 위에서 언급한 주소를 struct track 구조체로
캐스팅하면 더 유익한 정보를 볼 수 있습니다.

먼저 슬럽 오브젝트 할당 정보를 struct track 구조체로 보겠습니다.
v.v %d %i %t %h  (struct track*)0xC0067C08
  (struct track *) (struct track*)0xC0067C08 = 0xC0067C08 -> (
    (long unsigned int) addr = 3224694292 = 0xC034EE14, //<<-- 슬럽 오브젝트 할당할 때 주소 
    (long unsigned int [16]) addrs = ( //<<-- 슬럽 오브젝트 할당 시 콜스택
      [0] = 3224694292 = 0xC034EE14,
      [1] = 3223501260 = 0xC022B9CC,
      [2] = 3223549112 = 0xC02374B8,
      [3] = 3223552552 = 0xC0238228,
      [4] = 3223492484 = 0xC0229784,
      [5] = 3222299164 = 0xC010621C,
      [6] = 0 = 0x0,
      [7] = 0 = 0x0,
      [8] = 0 = 0x0,
      [9] = 0 = 0x0,
      [10] = 0 = 0x0,
      [11] = 0 = 0x0,
      [12] = 0 = 0x0,
      [13] = 0 = 0x0,
      [14] = 0 = 0x0,
      [15] = 0 = 0x0),
    (int) cpu = 7 = 0x7,  //<<-- 슬럽 오브젝트를 할당했을 때 CPU 번호 
    (int) pid = 31764 = 0x7C14, //<<-- 프로세스 PID
    (long unsigned int) when = 180878 = 0x0002C28E) // <<-- jiffies (시각)

슬럽 오브젝트를 할당했을 때 시간과 프로세스 PID를 출력합니다.

이번에는 슬럽 오브젝트를 해제했을 때 정보를 struct track으로 보겠습니다.
v.v %d %i %t %h  (struct track*)0xC0067C58
  (struct track *) (struct track*)0xC0067C58 = 0xC0067C58 -> (
    (long unsigned int) addr = 3223500472 = 0xC022B6B8, //<<-- 슬럽 오브젝트 해제 시 주소 
    (long unsigned int [16]) addrs = ( //<<-- 슬럽 오브젝트 해제 시 콜스택
      [0] = 3222530372 = 0xC013E944,
      [1] = 3222315080 = 0xC010A048,
      [2] = 3222298836 = 0xC01060D4,
      [3] = 0 = 0x0,
      [4] = 0 = 0x0,
      [5] = 0 = 0x0,
      [6] = 0 = 0x0,
      [7] = 0 = 0x0,
      [8] = 0 = 0x0,
      [9] = 0 = 0x0,
      [10] = 0 = 0x0,
      [11] = 0 = 0x0,
      [12] = 0 = 0x0,
      [13] = 0 = 0x0,
      [14] = 0 = 0x0,
      [15] = 0 = 0x0),
    (int) cpu = 7 = 0x7, //<<-- 슬럽 오브젝트를 해제 시 CPU 번호 
    (int) pid = 31764 = 0x7C14, //<<-- 프로세스 PID
    (long unsigned int) when = 180878 = 0x0002C28E) // <<-- jiffies (시각)

정리하면 Free된 슬럽 오브젝트의 데이터 스트럭처는 다음과 같습니다.    
------------------------   
슬럽 오브젝트(페이로드)
POISON_FREE
0x6B6B_6B6B 0x6B6B_6B6B 
0x6B6B_6B6B 0x6B6B_6B6B
------------------------   
레드 존: 0xBBBB_BBBB
------------------------   
다음 Free 슬럽 오브젝트 주소 
------------------------   
콜스택 
슬럽 오브젝트 할당: struct track 
슬럽 오브젝트 해제: struct track  
------------------------   

덧글

댓글 입력 영역