欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【内存越界定位】magic number

程序员文章站 2022-06-09 15:08:49
...
  • 增加魔术,确认是越界还是已经释放的内存被非法重用。
  • 重写malloc函数,在malloc时头部多申请一些内存,存入0x12345678和当前线程号,在尾部也放入一个魔术;在free的时候检验魔数值,如果不是malloc的值就调用mprobe强制glibc对内存块进行完整性检查。
  • 在发生死机时,我们可以向前偏移,根据上一块内存的大小,确认malloc尾部的魔数是否被修改了,如果被修改表示上一块内存发生了越界访问,再根据线程号和大小找到前一块内存申请的位置进行代码分析;如果没被修改则应该是free之后使用内存而引发的踩内存,非越界死机。

定义头结构体:

typedef struct stHeadInfo
{
	int i32MagicNum;
	int i32Pid;
	void* pBufBase;
	int size;  
}stHeadInfo;

malloc实现:

void* memMallocMagic(int size)
{
	int i32AllocSize;
	int i32HeadSize;

	void* pBufBase;
	void* pBufData;

	stHeadInfo* pBufHead;


	i32HeadSize = sizeof(stHeadInfo);

	i32AllocSize = i32HeadSize + size;

	pBufBase = malloc(i32AllocSize);

	pBufData = (void*)((char*)pBufBase + i32HeadSize);

	pBufHead = (stHeadInfo*)pBufBase;

	pBufHead->i32MagicNum = 0x12345678;
	pBufHead->i32Pid = gettid();
	pBufHead->pBufBase = pBufBase;
	pBufHead->size = i32AllocSize;

	return pBufData;
}
相关标签: 问题排查