Fastbin Attack 要了解fastbin attack,首先得了解fastbin机制。由于libc2.26后加入了tcache机制,我们这里就分析glibc 2.23.下面代码选自glibc2.23 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596 2021-06-19
Linux动态内存管理机制 进程与内存1、进程如何使用内存毫无疑问,所有进程(执行的程序)都必须占有一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存取自用户输入的数据等等。不过进程对这些内存的管理方式因为内存用途不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是需要动态分配和回收的。 对于任何一个普通进程来讲,它都会涉及到5种不同的数据段。稍有些编程知识的朋友都能想到这几个数据段中包含有“程序代码段”、 2021-06-19
堆溢出利用之Fastbin 前半部分 :基于libc2.23(无tcache)堆机制(fastbin等)想要了解堆机制利用方法必须要先了解堆的基本机制以及结构 目前主要使用的内存管理库是ptmalloc,而在ptmalloc中,用户请求的空间由名为chunk的数据结构表示 下面就是一个标准的chunk结构该chunk中,prev_size参数为前一chunk的大小,size参数为该chunk的大小,而p参数(pre_insu 2021-06-17
Bin Fastbin大多数程序经常会申请以及释放比较小的内存块。如果将一些较小的chunk释放之后发现存在与之相邻的空闲chunk并将它们进行合并,那么当下一次再次申请相应大小的chunk时,就需要对chunk进行分割,这样就大大降低了堆的利用效率。因为我们把大部分时间花在了合并、分割以及中间检查的过程中。因此,ptmalloc中专门设计了fastbin,对应的变量就是malloc state中的fas 2021-06-14
堆概述 什么是堆在程序运行的过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存。堆其实就是程序虚拟空间的一块连续的线性区域,它由低地址向高地址增长。我们一般称管理堆的那部分程序为堆管理器。 对管理器处于用户程序与内核中间,主要做以下工作 1.响应用户的申请内存请求,向操作系统申请内存,然后将其返回给用户程序。同时,为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理器 2021-06-14
攻防世界堆溢出UAF_time_formatter 知识点1在linux shell中,假如有如下语句,这就是shell注入方面echo “;ls;cat 1.txt;/bin/sh;”则 ls 、cat 1.txt 、/bin/sh 这三个命令就会一次执行,这也是本题突破的关键 知识点2C语言或C++申请内存后,用free 或 delete 释放堆后,指针的值还在,如果不手动设置为NULL,就可以被我们利用。 堆内存的分配有规律,看如下代码: 1 2021-06-13
Unlink Unlink我们在利用unlink所造成的漏洞是,其实就是对chunk进行内存布局,然后借助unlink操作来达成修改指针的效果。 我们先来简单回顾一下unlink的目的与过程,其目的是把一个双向链表中的空闲块拿出来(例如free时和目前物理相邻的free chunk进行合并)。其基本的过程如下:下面我们首先介绍一下unlink最初没有防护时的利用方法,然后介绍目前利用Unlink的方式。 古老的 2021-06-12
Off-by-One 堆溢出之off by one介绍严格来说off-by-one漏洞是一种特殊的溢出漏洞,off by one 指向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。 off by one 漏洞原理off by one是指单字节缓冲区溢出,这种漏洞的产生往往与边界验证不严和字符串操作有关,当然也不排除写入的size就只多了一个字节的情况。其中边界验证不严通常包括: ① 2021-06-11
2021CISCN_PWN题 大佬博客:https://nuoye-blog.github.io/2021/05/16/466a7375/ pwnywrite的时候可以越界,第一次读入到0x202860处使fd非法,从而在第二次读入时会写入0,这样就可以做到写入操作。通过read越界读取出libc,然后越界写入system地址到exit退出时调用的地址,并将参数修改为/bin/sh,退出程序即可getshell。 123456 2021-06-06
UAF漏洞初探 UAF原理上代码!!! 12345678910111213#include<stdio.h>int main(){ char *p1; p1=(char *)malloc(sizeof(char)*10); memcpy(p1,"hello",10); printf("p1 addr:%x,%s\n",p1,p1); free(p1); 2021-05-03