通过cat /proc/kallsyms得到的内核符号表中地址都为0:
00000000 T stext
00000000 T _sinittext
00000000 T _stext
00000000 T __init_begin
00000000 t __create_page_tables
00000000 t __enable_mmu_loc
00000000 t __fixup_pv_table
00000000 t __vet_atags
00000000 t __mmap_switched
00000000 t __mmap_switched_data
00000000 T lookup_processor_type
00000000 t set_reset_devices
00000000 t debug_kernel
00000000 t quiet_kernel
00000000 t init_setup
00000000 t rdinit_setup
00000000 t loglevel
00000000 t unknown_bootoption
00000000 t do_early_param
00000000 T parse_early_options
00000000 T parse_early_param
...
为什么/proc/kallsyms的内容中符号地址都是0呢???
answer:http://stackoverflow.com/questions/10447491/reading-kallsyms-in-user-mode
http://onebitbug.me/2011/03/04/introducing-linux-kernel-symbols/
因为系统为了保护这些符号地址泄露,而用的一种保护手段,从而使除root用户外的普通用户不能直接查看符号地址;
原因在于内核文件kallsyms.c中的显示符号地址命令中做了如下限制:
seq_printf(m,"%pK %c %s\n",(void*)iter->value,
iter->type,iter->name);
只需要把其中的%pK换成%p就可以让普通用户查看符号地址了;很多提权漏洞一般会用到此处的修改来获取符号地址。
源代码:https://android.googlesource.com/kernel/exynos/+/android-exynos-3.4/kernel/kallsyms.c