the more u learn, the less u know
玄武实验室安全研究员, 专注于内核与Httpd漏洞挖掘
转载必须注明原链接
发表于看雪论坛
基础ROP篇(linux 5.0.21) 内核提权与用户态攻击的区别
攻击流程
用户态攻击: 执行 system("/bin/sh") 获得shell 内核提权: 内核执行 commit_creds(prepare_kernel_cred(0)) 使进程获得root权限 用户态进程执行system("/bin/sh") 获得root权限 shell 理解难点
内核rop链构造 用户态进程与内核之间的切换 一. 漏洞分析 (建议初学者先了解基础的驱动程序知识) 查看驱动安全机制
checksec rop.ko [*] '/home/povcfe/linux/flod/rop.ko' Arch: amd64-64-little RELRO: No RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x0) 发现开启canary和NX 查看qemu启动脚本boot.sh
boot.sh qemu-system-x86_64 \ -kernel bzImage \ -initrd rootfs.
发表于看雪论坛
linux用户态下的堆溢出利用即是对ptmalloc2安全机制的绕过,只有深入的了解ptmalloc,才能进行精准的堆溢出攻击
malloc __libc_malloc(传入参数:size) 判断 是否定义hook函数 ,如果存在则调用hook函数,否则跳到2 void *(*hook) (size_t, const void *) = atomic_forced_read (__malloc_hook); if (__builtin_expect (hook != NULL, 0)) return (*hook)(bytes, RETURN_ADDRESS (0)); 执行arena_get得到空闲分配区 arena_get (ar_ptr, bytes); 调用_int_malloc()获得内存地址 victim = _int_malloc (ar_ptr, bytes); 如果分配失败,ptmalloc会尝试再去寻找一个可用的arena并进行内存分配 if (!victim && ar_ptr != NULL) { LIBC_PROBE (memory_malloc_retry, 1, bytes); ar_ptr = arena_get_retry (ar_ptr, bytes); victim = _int_malloc (ar_ptr, bytes); } 得到内存地址后解锁分配区 if (ar_ptr !
根据ctf-wiki总结栈溢出, 格式化字符串漏洞, 部分堆溢出利用, 制成如下思维导图
pwn.pdf