以[GKCTF 2020]domo为例来看off-by-null

今天开始学习off-by-one系列,这是今天遇到的第一个样题,以此记录一下其中的知识点。

这是题目:

会把指针清零,没有uaf漏洞,并且保护全开,不能edit。

一眼off-by-null

首先肯定要泄露libc基址,在wp中有两种方法:
 

add(0xf0) #index 0
add(0xf0) #index 1
free(0)
add(0xf0, b'a'*8) #index 0
show(0)
libc_base = get_addr() - 0x68 - libc.sym['__malloc_hook']

这是第一种,分配一个0xf0,然后free到unsortedbin中,由于unsortedbin中只有这一个chunk,所以它的fd和bk都是usortedbin地址,可以再分配回来打印内容。

下面分段补充知识:

add(0x80)  #0
add(0x60)  #1
add(0x20)  #2
add(0xf0)  #3
add(0x10, b'/bin/sh\x00')  #4

delete(2)  
add(0x28, b'\x00'*0x20 + p64(0x130)) #2
delete(0)
delete(3)
add(0xf0)  #0
show(2)

首先,由于是off-by-null,所以你被off的chunk的大小必须是0x100,0x200这样,因为一字节会直接覆盖十六进制的低2位,你如果是0x80,会直接变成0x00,会出现错误。

这是未off-by-null之前,可以看到with flag bits是0x101

这是off-by-null之后,变成了0x100,当这个chunk被free的时候就会认为前面有个0x130的空闲chunk,会进行合并。

这是还要注意一点,合并之前一定要先释放掉要合并的最底下的chunk,让它的fd和bk域有相应的地址,因为合并的时候会进行unlink,如果bk和fd区域是乱七八糟的东西肯定会报错。

这是合并之后的:

成功合并了。

继续补充知识:当我们要分配一个chunk时,它会先去unsortedbin里找。直到找到一个比所要内存大的,但不会把这个unsortedbin全都给你,它会切你要的大小给你,剩余部分继续挂unsortedbin上。

由gdb调试可知,是从低地址开始切。

现在我们就知道了off-by-null的大致作用,就是将一大片区域分配给我们,我们可以在这片区域写fd,来实现fastbin attack。,我认为这是他的主要作用。

顺便又用gdb做了一些调试:

这说明top chunk不会与fastbin合并,并且fastbin和fastbin的下一个chunk的pre_inuse位肯定为1。

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值