XP SP2不安全的 链表卸载操作 空表溢出技术
第一个问题就是如何运用这一通过安全检验的不安全的unlink操作将shellcode地址写到某任意一个内存地址中去
第二个问题是为什么要不停向堆中溢出一对序列
[FreeListHead-4][FreeListHead+4]才能满足exploit要求 一次不够吗?为什么还要寄希望于Flink和Blink这对指针的地址是在我们能够溢出的地址范围内,“我们能够溢出的地址范围”是多少
详细描述问题 先把这段原文贴出来再加上自己的理解
p = HeapAlloc(n);
FillLookaside(n);//以免加入快表
HeapFree(p);
EmptyLookaside(n); //清空快表 以免后面分配时从快表卸空闲块
Overwrite p[0] (somewhere on the heap) with:
p->Flags = Busy (to prevent accidental coalescing)
p ->Flink = (BYTE *)&ListHead[(n/8)+1] - 4
p ->Blink = (BYTE *)&ListHead[(n/8)+1] + 4
就能满足上述条件
//通过构建巧妙的双向指针 骗过了安全校验机制 都指向FreeChunk,unlink操作继续进行
HeapAlloc(n); // defeats safe unlinking (ignore result) 这里分配时返回的上一个空闲堆块地址 忽略它
p = HeapAlloc(n); // defeats safe unlinking
// p now points to &ListHead[(n/8)].Blink
// p现在指向&ListHead[(n/8)]也就是上一个空表项的表头的后向指针
Matthew现在总结道:现在空表指针指向了用户赋予的任意地址 这是为什么
以下是讲解上述骗过安全机制的流程并获取&ListHead[(n/8)].Blink指针的流程
首先安全校验实际就是
if(node->Flink->Blink==node && node->Blink->Flink==node)
FreeChunk->Blink->Flink == *(*(FreeChunk+4)+0)
FreeChunk->Flink->Blink) == *(*(FreeChunk+0)+4)
上述两个等式都成立 因为表达式左右两边都指向FreeChunk
就骗过安了全校验机制 unlink操作继续进行
第一次分配时发生下列操作
FreeChunk->Blink->Flink = FreeChunk->Flink
FreeChunk->Flink->Blink = FreeChunk->Blink
因为这里和DWORD SHOOT相去甚远
因为《0day》一书中讲述的是根据MOV DWORD PTR DS:[ECX],EAX 这一unlink操作的必经之路上,(也即是Flink->[Blink]操作) 已达到向任意地址写入任意数据的目的(也就是书中讲得将shellcode地址写入RtlEnterCriticalSection函数指针地址,以引发ExitProcess来调用shellcode) 而这里仅仅是获得了一个地址 难道是向&ListHead[(n/8)].Blink中写入shellcode地址 并使之执行???不得而知 希望各位指教 这就是第一个问题就是如何运用这一通过安全检验的不安全的unlink操作将shellcode地址写到某任意一个内存地址中去
第二个问题是:
另外后面Matthow还提到要不断地使用这对8字节的序列溢出堆 才能成功实现向任意地址写入任意数据的目的
[FreeListHead-4][FreeListHead+4]这对序列
还要寄希望于Flink和Blink这对指针的地址是在我们能够溢出的地址范围内 这句话有事什么意思
希望各位指教
[课程]FART 脱壳王!加量不加价!FART作者讲授!