这道题有中奖成份在里头,针对不同的libc版本,RIP与0x7fffffffdc88 --> 0x7ffff7deab03 (<_dl_init+275>: add r15,0x8) distance不一样,测试本机libc版本2.17,distance是 16,而题目所用libc版本是2.3,distance是18。
题目所用的exp为return to csu_init的最后5个pop,3个ret + 5*3 刚好=18,算好了的。
本机libc版本2.17 distance 16,只能是3个ret,每个ret只能4个pop,这样的话3 + 4*3=15,还差一个地址到达<_dl_init+275>,只能用vsyscall slide所差地址。
libc 2.17所要尝试的65536次数,在新版本中使用这个技能很难行得通。
one gadget地址我选择的是 0x4309c(注:选地址时眼花了,最好选择0x43048,限制条件rax =0比较容易满足,第一个vsyscall就使rax=0)
但是,通过coredump发现,溢出后实际RIP地址是7fd8e700309c
而libc one gadget地址是0x7fd8e6d5e09c
要爆破16^4=65536次