Bootstrap

Linux KASLR 地址偏移

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。

    vi /etc/default/grub

    GRUB_CMDLINE_LINUX_DEFAULT="quiet nokaslr"

    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 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。

;