OShomework1

  • 什么是 do_brk() ?
    do_brk() 是 mmap() 的简化版本,可以控制进程的 heap 增长或缩短。
    do_brk() 只用于处理未初始化数据的匿名 mapping 调用,故起初开发者们在这个函数中几乎没有做任何的边界检查。
    缺乏边界检查是一个隐藏的 bug 。

  • 如何利用 do_brk() 的 bug ?

    1. 改变进程栈的 layout,使我们后来能通过 do_brk() 的 bug 来向上扩展堆并覆盖 kernel 空间。
    2. 通过 LDT_mod,verr 和一些 signal 的技术加入新的 kpage,找到特定的 kpage,借此找到并访问到 LDT entry。
    3. 通过 do_brk() 溢出,改写 kernel page。关闭 s-bit 并改写 LDT entry 从而可以以 ring0 的身份调用任何函数.
    4. 扫描 task_struct 改写自己的 uid 或 gid,获取 root 权限。

你可能感兴趣的:(OShomework1)