【内存越界定位】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;
}
推荐阅读