分类 pwn 中的文章

linux堆笔记(二)——堆相关的数据操作

堆溢出 概述 堆溢出指的是程序向某个堆块中写入字节数超过了堆块本身可用字节,因而导致了数据溢出,并覆盖到物理相邻的高地址的下一个堆块。 发生情况 程序向堆上写入数据。 写入的数据大小没有被良好地控制。 一般的利用思路 覆盖与其物理相邻的下一个 chunk 的内容。 prev_size size,主要有三个比特位,以及该堆块真正的大小。 NON_MAIN_ARENA IS_MAPPED PREV_INUSE the True chunk size chunk content,从而改变程序固有的执行流。 利用堆中的机制(如 unlink 等 )来实现任意地址写入( Write-Anything-Anywhere)或控制堆块中的内容等效果,从而来控制程序的执行流。 步骤 寻找堆分配函数 一般是用malloc,在某些情况下会使用 calloc 分配。calloc 与 malloc 的区别是 calloc 在分配后会自动进行清空,这对于某些信息泄露漏洞的利用来说是致命的。……

阅读全文

linux堆笔记(一)——堆相关的数据结构

看了ctfwiki上堆相关的部分内容所写笔记。 堆的基本操作 malloc(size_t n) size_t在32位系统下是4字节,在64位系统上是8字节,size_t是无符号的,所以如果传入一个负数会得到一个很大的数字 当malloc(0)的时候,malloc返回一个最小快,这个块的大小在 32位系统上是16bytes 64位系统上是24或32bytes free(void* p) 当p为空指针时,free不执行任何操作 当p已经被释放后再次被释放则会出现问题(double free)。 内核中各模块的空间分布图 32系统中的空间分布图如下: 32位解释一下:……

阅读全文