Freway
那么为什么在realloc转一圈就可以了。。我gdb跟了一下好像跳到realloc也没干啥。。
首先,realloc_hook和malloc_hook在libc上紧挨在一起,方便覆盖;其次,用gdb看一下realloc代码,
gef➤ x/32gi 0x00007f8a83cf7000 + 0x846c0
0x7f8a83d7b6c0 <__GI___libc_realloc>: push r15
0x7f8a83d7b6c2 <__GI___libc_realloc+2>: push r14
0x7f8a83d7b6c4 <__GI___libc_realloc+4>: push r13
0x7f8a83d7b6c6 <__GI___libc_realloc+6>: push r12
0x7f8a83d7b6c8 <__GI___libc_realloc+8>: mov r13,rsi
0x7f8a83d7b6cb <__GI___libc_realloc+11>: push rbp
0x7f8a83d7b6cc <__GI___libc_realloc+12>: push rbx
0x7f8a83d7b6cd <__GI___libc_realloc+13>: mov rbx,rdi
0x7f8a83d7b6d0 <__GI___libc_realloc+16>: sub rsp,0x38
0x7f8a83d7b6d4 <__GI___libc_realloc+20>: mov rax,QWORD PTR [rip+0x33f8f5] # 0x7f8a840bafd0
realloc函数开始有一系列的堆栈操作,包括push和+20处的sub rsp, 0x38, 所以劫持到realloc或者realloc+2/4/6/8/12/20等等开始执行可以控制堆栈的抬高与降低,使得最终执行one_shot时符合栈上[rsp+xxx]=NULL的约束。