0%

UAF-hackNote

UAF

  • free之后没有清空指针(并没有将该指针置为NULL)
  • 通过读chunk的内容可以泄露leak libc地址或堆地址
  • 通过王chunk写内容可以劫持链表(bin)
  • UAF属于一种漏洞点,需要结合具体利用方式进行利用(譬如fastbin attack等)

lab 10 hacknote

功能分析

程序主要有 3 个功能。之后程序会根据用户的输入执行相应的功能。

image-20220506153130995

image-20220506153144645

add_note

我们可以看出程序最多可以添加 5 个 note。每个 note 有两个字段 print_content与 content,其中 put 会被设置为一个函数,其函数会输出 content 具体的内容。

image-20220506153725159

image-20220506154131927

print_note 就是简单的根据给定的 note 的索引来输出对应索引的 note 的内容。

image-20220506154312521

delete_note

delete_note 会根据给定的索引来释放对应的 note。但是值得注意的是,在 删除的时候,只是单纯进行了 free,而没有设置为 NULL,那么显然,这里是存在 Use After Free 的情况的。

image-20220506154428143

利用分析

注意到前面的print_note_content函数,猜想应该是可以将一个note的print_note字段修改为一个magic函数地址。

image-20220506162229383

image-20220506162254874

显然 note 是一个 fastbin chunk(大小为 16 字节)。我们的目的是希望一个 note 的 print_note字段为 magic 的函数地址,那么我们必须想办法让某个 note 的 print_note 指针被覆盖为 magic 地址。由于程序中只有唯一的地方对 print_note进行赋值。所以我们必须利用写 real content 的时候来进行覆盖。具体采用的思路如下:

  • 申请 note0,real content size 为 16(大小与 note 大小所在的 bin 不一样即可)
  • 申请 note1,real content size 为 16(大小与 note 大小所在的 bin 不一样即可)
  • 释放 note0
  • 释放 note1
  • 此时,大小为 16 的 fast bin chunk 中链表为 note1->note0
  • 申请 note2,并且设置 real content 的大小为 8,那么根据堆的分配规则,note2 其实会分配 note1 对应的内存块。real content 对应的 chunk 其实是 note0。
  • 如果我们这时候向 note2 real content 的 chunk 部分写入 magic 的地址,那么由于我们没有 note0 为 NULL。当我们再次尝试输出 note0 的时候,程序就会调用 magic 函数。

image-20220506161607282

漏洞利用