kaslr开启时地址
cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-5.4.0-193-generic root=UUID=0e46dee3-4557-434a-a2d2-a35c6ad3d327 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet
cat /boot/config-$(uname -r) | grep CONFIG_RANDOMIZE_BASE
CONFIG_RANDOMIZE_BASE=y
sudo cat /proc/kallsyms | grep map_vdso
ffffffffb5005680 t map_vdso
sudo cat /boot/System.map-$(uname -r) | grep map_vdso
ffffffff81005680 t map_vdso
因开启了 kaslr , 从 /proc/kallsyms 和 System.map-$(uname -r) 看到的 map_vdso 地址不一样。
如果关闭 kaslr , 从 /proc/kallsyms 和 System.map-$(uname -r) 看到的 map_vdso 地址一样。
关闭 kaslr
在 cmdline 中添加 nokaslr , 可以关闭 kaslr。
BOOT_IMAGE=/boot/vmlinuz-5.4.0-193-generic root=UUID=0e46dee3-4557-434a-a2d2-a35c6ad3d327 ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US quiet nokaslr
计算内核符号表和堆栈空间地址的偏移方法
1.利用 /proc/kallsyms 获取符号实际的加载地址
sudo cat /proc/kallsyms | grep map_vdso
ffffffffb5005680 t map_vdso
2.利用 /boot/System.map-$(uname -r) 获取链接后的地址
sudo cat /boot/System.map-$(uname -r) | grep map_vdso
ffffffff81005680 t map_vdso
3.计算偏移地址
offset = ffffffffb5005680 - ffffffff81005680
offset = 0x34000000
开启了 kaslr 后, vmlinux中的各个段地址都需加上这个offset。