1
2 #include<stdio.h>
4 typedef struct _chunk
6 long long pre_size;
7 long long size;
8 long long fd;
9 long long bk;
10 } CHUNK,*PCHUNK;
12 int main(void)
13 {
14 CHUNK stack_chunk;
16 long long *chunk1;
17 long long *chunk_a;
19 stack_chunk.size=0x21;
20 chunk1=malloc(0x10);
22 free(chunk1);
24 *(long long *)chunk1=&stack_chunk;
25 malloc(0x10);
26 chunk_a=malloc(0x10);
27 return 0;
28 }
我们来一起解读一下这个例子,首先自定义了一个结构体,long long型的,所以我们在你使用gcc编译的时候要编译成64位的。定义的结构体为了伪造嘛,所以和正常chunk的结构体一样,成员变量都是prev_size、size、fd、bk。接下来看main函数,首先创建了一个结构体指针stack_chunk。接着创建了两个long long类型的指针chunk1和chunk_a。将结构体 stack_chunk的size成员变量的值设置为0x21,创建一个0x10大小的chunk(实际堆块大小为0x20),并将chunk的malloc指针赋给chunk1指针。接下来释放了chunk1。重新在chunk1指针指向的位置赋予stack_chunk指针,接着 重新申请0x10的chunk,在将chunk的malloc指针赋给chunk_a
接下来使用gdb调试一下这个例子:gdb打开之后,因为我们在编译阶段使用了-g参数,所以首先在第22行下断点,然后执行,使用heap
命令查看一下当前的堆块状态
接下来将断点下在第24行,使程序完成释放,我们去看一下bin中的情况以及被释放chunk的内部状态:
可以看到在释放之后chunk精准的落在了fastbin中,由于chunk1前面并没有任何chunk被释放,所以chunk的fd位置为空,不指向任何chunk。但是这里出现了一个问题,在释放chunk1之后并没有将其malloc指针置空,这就造成了chunk1可以被重新修改的状况。接下来我们将断点下在第25行,完成对chunk1中fd的修改:
由于将chunk1中fd的值修改成了stack_chunk的结构体指针,那么在fastbin中看来,stack_chunk是在chunk1前面被释放的一个块,而stack_chunk其实是部署在栈上的一个伪造chunk:
那么这样一来堆管理器就会认为在fastbin0x20这条单向链表中存在两个0x20被释放的chunk。那么如果连续申请两块0x20大小的chunk,栈上伪造的stack_chunk就会被作为一个chunk来启用。我们将断点定到27行,完成两次申请,再去看一下bin中的状况:
可以看到原来被挂进fastbin中的stack_chunk被启用调走了
通过该技术我们可以把 fastbin chunk 分配到栈中,从而控制返回地址等关键数据。要实现这一点我们需要劫持 fastbin 中 chunk 的 fd 域,把它指到栈上,当然同时需要栈上存在有满足条件的 size 值
C语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 ALLOCC语言头文件 A
puts AllocTrack . alloc # >= 100
puts AllocTrack . delta # <= 100
puts AllocTrack . free # >= 100
AllocTrack . stop
也许更有用的是在分配数量超过某个阈值时提高的能力:
require 'alloc_tr
Tensorflow2.0 之Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED问题
问题描述:
在tensorflow2.0的学习过程中,遇到了Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED,发现这个问题是我在调用kseras模块的卷积类前向传播时触发的,之前的全连接层都没有出现过类似的问题。分析问题应该是gpu没有正确的分配所导致的。
import tensorflow as tf
from tensorflow.keras import layers
堆机制(fastbin等)
想要了解堆的机制利用方法必须要先了解堆的基本机制以及结构
目前主要使用的内存管理库是ptmalloc,而在ptmalloc中,用户请求的空间由名为chunk的数据结构表示
下面就是一个标准的chunk结构
该chunk中,**prev_size参数为前一chunk(如果未被使用)的大小,size参数为该chunk的大小,而P参数(pre_insue)为标志位,标志前一个chunk的使用情况。**而上述
Fastbins attack : Alloc_to_stack
这个利用技巧与前面的house of spirit 和 double free很类似。都是利用fastbins 中单链表成员只用 fd 指针这个特点来将伪造的fake_chunk 挂进 fastbins中再申请出来进行利用
回到我们的主题啊,alloc_to_stack,顾名思义,这个技巧就是修改fd 指针将伪造的fake_chunk分配到栈段上面去。
#所用例子为wiki上的例子#
typedef struct _chunk
using System;class Test{ static unsafe void Main() { int* fib = stackalloc int[100]; int* p = fib; *p++ = *p++ = 1; for (int i = 2; i < 100; ++i, ++p) { ...