堆漏洞uaf
uaf
# 知识点
UAF 漏洞全称为 use after free,即释放后重用。漏洞产生的原因,在于内存在被释放后,但是指向指针并没有被删除,又被程序调用。比较常见的类型是 C 对象,利用 UAF 修改 C 的虚函数表导致的任意代码执行。
# 例题
# [BUUCTF]PWN——hitcontraining_uaf
- checksec 检查,开了 NX 保护,32 位
(1) add note
add 会申请两次内存,第一次申请 8 个字节,前四个字节指向 print_note_content 这个函数,后四个字节指向我们写入的字符串 (count 会加 1)
(2) delete note
只释放了堆块里的内容但没有将指针置 0,存在 uaf 漏洞,并未指向 NULL
(3) print note
调用 add 申请的第一个 8 个字节中的前四个字节指向的函数,打印 add 创建的第二个 chunk 里的值
(4) shell
fastbin 是单向链表遵循先进后出原则,申请 A,B 两个堆块后,先释放 A ,后释放 B,会在 fastbin 里形成链,此时,再次申请一个大小为 0x8 的内存 C,并写入 shellcode 地址,那么第一个 8 个字节 C 就指向 B,第二个 8 个字节 C 指向 A,这时候我们写入的内容就会覆盖原有的,但原来的指针仍指向它,因而可以更改 print_note_content 函数为我们想要执行的函数。
在 add 中,我们只能对 content 部分进行操作,无法对 print_note_content 对应的部分即 put 段进行操作,所以我们要想办法,操作 put 段
1 | 根据put段和content段中大小的不同,如果要申请到put段,payload大小应该为0x8,由于先进后出原则,先释放A,后释放B,此时第三次申请的put段指向B的put,content段指向A的put,content写入magic,调用print_note(0)时就调用了magic |
申请过程堆块变化:
add:
free 后:
再次申请,写入 shell
先进后出原则
wp:
1 | from pwn import * |
# 参考文章
https://blog.csdn.net/mcmuyanga/article/details/108454183?ops_request_misc=%7B%22request%5Fid%22%3A%22163714805316780261940769%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=163714805316780261940769&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-108454183.first_rank_v2_pc_rank_v29&utm_term=hitcontraining_uaf&spm=1018.2226.3001.4187
1.BUUOJ PWN EXERCISE(二)
2.CTFSHOW卷王杯-pwn
3.gyctf_2020_force
4.BUUCTF Pwn Exercise(一)
5.xdctf2015_pwn200
6.堆题总结
7.cmcc_simplerop
8.hitcontraining_unlink