realloc

扩展堆数组的大小

我与影子孤独终老i 提交于 2020-03-01 20:54:59
函数: void* realloc(void *ptr, size_t size); 功能: 函数将 ptr 对象的储存空间改变为给定的大小 size 。 参数 size 可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。 扩展内存 1 int main() 2 { 3 const size_t pSize = 15; 4 5 char *p = new char[pSize]{0}; 6 strcpy_s(p, pSize, "I LOVE YOU"); 7 8 cout << "p:" << hex << (int)p << endl; 9 10 p = (char *)realloc(p, pSize * 2); 12 13 if (!p) 14 cerr << "Call realloc function error!" << endl; 15 16 17 cout << "p1:" << hex << (int)p << endl; 18 _snprintf_s(p, pSize * 2, pSize * 2, "Hello,%s C++!", p); 19 cout << p<< endl; 20 21 delete[]p; 22 23 getchar(); 24 return 0; 25 } 如果没有 p = (char *

关于利用realloc函数调整栈使onegadget可执行。

喜夏-厌秋 提交于 2020-03-01 12:20:23
此贴主要讲述: free_hook无法劫持,劫持__malloc_hook填onegadget全部失效的情况。我们利用realloc函数调整栈的位置,使得onegadget可执行。 直接上题了。buuoj上面的一个题。 保护全开。 漏洞点在于edit函数的溢出 常规思路,修改size,利用chunk overlap打free_hook,或者malloc_hook即可。 但是free_hook打不了,而且四次ogg全部失效。 那么利用realloc函数调整栈的位置。 0x1 realloc函数先判断realloc_hook是否为空,非空,就会执行realloc_hook malloc函数先判断malloc_hook是否为null,非空,则去执行malloc_hook指向的位置 如图所示realloc函数的入口处,ida中深蓝色的变量就是全局变量了 0x2 我们只需要将malloc_hook填上realloc函数的基地址+offest 然后将realloc_hook填上ogg。 那么我们的执行流程就是,当我们调用malloc时,因为malloc_hook被劫持,rip就去realloc基地址+offest处执行,之后自然还会跳到realloc_hook去执行ogg。 由于realloc函数的开头和结尾,存在大量的push指令和pop指令,如图: 当我们把offest调整成2 4 6

【C语言】malloc和realloc的区别以及使用

妖精的绣舞 提交于 2020-03-01 02:45:13
ANSI C说明了三个用于存储空间动态分配的函数 (1) malloc分配指定字节数的存储区。此存储区中的初始值不确定 (2) calloc为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0 (3) realloc 更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定 .分配函数时再分配 realloc() 使我们可以增、减以前分配区的长度(最常见的用法是增加该区)。 如果先分配一个可容纳长度为512的数组的空间,并在运行时填充它,但又发现空间不够,则可调用realloc扩充该存储空间。 如果在该存储区后有足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充,并返回传送给它的同样的指针值。 如果在原存储区后没有足够的空间,则realloc分配另一个足够大的存储区,将现存的5 1 2个元素数组的内容复制到新分配的存储区。 因为这种存储区可能会移动位置,所以不应当使用任何指针指在该区中。 注意,realloc的最后一个参数是存储区的newsize(新长度),不是新、旧长度之差。作为一个特例,若ptr是一个空指针,则realloc的功能与malloc相同,用于分配一个指定长度newsize的存储区。 这些分配例程通常通过sbrk(2)系统调用实现。该系统调用扩充(或缩小

roarctf_2019_easy_pwn

♀尐吖头ヾ 提交于 2020-02-26 15:23:32
这篇博客主要记录当直接在malloc_hook中直接写入one_gadget不起作用时的一些处理方法。题目附件:https://buuoj.cn/challenges#roarctf_2019_easy_pwn 题目分析: 题目提供了 Create , Write , Drop , Show 四个函数,其中Write函数存在 off by one 漏洞 利用思路: 利用 off by one 修改 chunk 的 size 达到 overlap 的目的 这道题目的难点在于向 malloc_hook 中写入的 one_gadget 全部失效。在一番苦思后我决定看看大佬的博客,现记录一下其中的处理方法: 解法一: 在 malloc_hook 附近构造 fake_chunk ,通过修改 fastbin 中的 chunk 的 fd 指针把 fake_chunk 放入 fastbin 中,然后在分配出去 修改 main_arean 中 top_chunk 的地址为 free_hook 附近 分配 chunk 控制 free_hook 这一步有两个选择,一是向 free_hook 中写入 one_gadget ,二是向 free_hook 中写入 system exp如下: from pwn import * from LibcSearcher import * context(os =

How does realloc() reallocate the memory?

风流意气都作罢 提交于 2020-02-23 00:37:56
问题 How does realloc() reallocate the memory which was first allocated by malloc() ? I know that you need to use malloc() before you´re able to reallocate the memory, but I don´t understand how that really should work. What if a dynamic-memory object gets decreased in size by realloc() ? Is this respective piece of the object just erased after the call to realloc() ? My Question is: How does the realloc() function reallocate a dynamic-memory object created by malloc() ? Note: I did this Q&A

C和指针 第十一章 动态内存分配

两盒软妹~` 提交于 2020-02-07 04:00:35
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存。 C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配和释放, 这些函数维护一个可用的内存池,当程序需要内存时,它就调用malloc从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针,这块内存没有以任何方式进行初始化。 如果需要初始化,可用使用calloc函数。当一块分配的内存不再使用时,程序应该调用free函数把它归还给内存池。 void *malloc(size_t size); void free(void *pointer); 当malloc申请内存失败时,返回的是NULL指针,所以需要 对malloc返回值进行检查 ,确保非NULL。而free的参数,要么是NULL,要么是malloc,calloc或者realloc返回的值。向free传入NULL,不会产生任何效果。 malloc返回的是void *类型的指针,所以有的编译器可能在使用之前,需要行类型转换。 char *sPtr; //类型转换一下 sPtr = (char *)malloc(12); strcpy(sPtr, "yangxunwu"); calloc,也是分配内存,不过在分配之前会把内存初始化为0,而malloc不会初始化 void

C和指针之动态内存分配

旧街凉风 提交于 2020-02-07 03:06:26
1、为什么使用动态分配内存   当不确定需要的内存空间的大小的时候,使用动态分配内存的方式去分配一块内存,这样不会对内存进行浪费。 2、动态分配内存的函数   C函数库提供了三个动态分配内存的函数:malloc、calloc、realloc,这三个函数都能进行动态的内存分配。当这些内存不再使用时可以用free函数把这些内存归还给内存池,以达到内存释放的目的。 四个函数的函数原型如下: void *malloc(size_t size); void *calloc(size_t num_elements, size_t element_size); void realloc(void *ptr, size_t new_size); void free(void *pointer);   malloc函数的参数就是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,malloc就会返回一个指向被分配的内存块起始位置的指针。malloc所分配的内存是一块连续的地址,并不会分开位于两块或多块不同的内存。如果内存池是空的,或者它的可用内存无法满足申请的需求,此时malloc会向操作系统请求得到更多的内存,并在这块新的内存上执行分配任务。如果操作系统无法向malloc提供更多的内存,就会导致malloc分配内存失败,此时malloc会返回一个NULL指针。因此

Lua源码分析 - 数据结构篇 - Mem内存操作

a 夏天 提交于 2020-02-03 04:06:32
原先以为Lua的内存操作也是高大上的,但是仔细研究了一下,突然发现,这块代码绕来绕去,封装来封装去,有一些low low感。 废话少说,直接上原理吧。这部分的代码,我也不画详细的图了。 Mem内存操作 - 核心分配函数 Lua的全局状态机里面,有两行代码,定义了内存分配的基础函数。底层的内存分配函数主要调用了c语言本身的内存分配函数(malloc、free、realloc等)。想要研究linux系统的内存分配器的,可以看我这边文章 《Linux c 开发 - 内存管理器ptmalloc》 先看一下全局状态机里面的定义: /* ** 'global state', shared by all threads of this state ** lua 全局状态机 ** 作用:管理全局数据,全局字符串表、内存管理函数、 GC 把所有对象串联起来的信息、内存等 */ typedef struct global_State { /* 版本号 */ const lua_Number *version; /* pointer to version number */ /* 内存管理 */ lua_Alloc frealloc; /* Lua的全局内存分配器,用户可以替换成自己的 - function to reallocate memory */ void *ud; /*

关于C中内存操作

二次信任 提交于 2020-02-02 14:32:02
from:http://blog.csdn.net/shuaishuai80/article/details/6140979 malloc、calloc、realloc的区别 C Language (1) C语言 跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量. <2>在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. <3>从堆上分配,亦称动态内存分配. 程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由用户决定,使用非常灵活,但问题也最多. (2)C语言跟内存申请相关的函数主要有 alloca、calloc、malloc、free、realloc等. <1>alloca是向栈申请内存,因此无需释放. <2>malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间. <3>calloc则将初始化这部分的内存,设置为0. <4>realloc则对malloc申请的内存进行大小的调整. <5

C语言动态存储分配

孤街醉人 提交于 2020-01-31 06:09:25
动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串、数组和结构体 本文地址: http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html ,转载请注明源地址。 1、内存分配函数 3种内存分配函数都是声明在<stdlib.h>中: malloc函数--分配内存块,但是不对内存块进行初始化 calloc函数--分配内存块,并且对内存块进行消除 realloc函数--调整先前分配的内存块 malloc函数不需要对分配的内存快进行清除,所以它比calloc函数更高效 当申请内存块而调用内存分配函数的时候,函数会返回void*型的值。内存中对象的空间大小,是以“字节”的数目为单位计算的,许多头文件都定义了size_t类型,专门用来保存这种“内存”空间的相关信息,比如sizeof运算符返回字节的数目,类型是size_t 2、空指针 由于用名NULL的宏来表示空指针,所以常使用下列方式测试malloc函数的返回值: p=malloc(10000); if(p==NULL) { /*分配失败*/ } 在C语言中,指针测试真假的方法和数的测试一样: if(p==NULL) if(