hitcontraining_unlink
ulink
# hitcontraining_unlink
# 程序分析
检查:64 位程序,开了 NX 和 canary
存在 magic 函数(实际上并没什么用)
查看主函数及各菜单功能
show()
add()
change()
在 change_item () 函数中并没有对输入的内容 size 进行检查,存在堆溢出
remove()
# 思路
新版 unlink 要求
// 由于 P 已经在双向链表中,所以有两个地方记录其大小,所以检查一下其大小是否一致 (size 检查)
if (__builtin_expect (chunksize§ != prev_size (next_chunk§), 0))
malloc_printerr (“corrupted size vs. prev_size”); \// 检查 fd 和 bk 指针 (双向链表完整性检查)
if (__builtin_expect (FD->bk != P || BK->fd != P, 0))
malloc_printerr (check_action, “corrupted double-linked list”, P, AV); \//largebin 中 next_size 双向链表完整性检查
if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0)
|| __builtin_expect (P->bk_nextsize->fd_nextsize != P, 0))
malloc_printerr (check_action,
“corrupted double-linked list (not small)”,
P, AV);
利用思路:
- 构造 fake_chunk
- 通过 unlink,把 chunk 移到存储 chunk 指针的内存处
- 覆盖 chunk 0 指针为 atoi@got 表地址并泄露
- 覆盖 atoi 的 got 表为 system 函数地址。
- 给出参数 ‘/bin/sh’,调用 atoi 函数拿 shell。
# EXP
1 | #coding:utf-8 |
# 参考文章
hitcontraining_unlink
1.BUUOJ PWN EXERCISE(二)
2.CTFSHOW卷王杯-pwn
3.gyctf_2020_force
4.BUUCTF Pwn Exercise(一)
5.xdctf2015_pwn200
6.堆题总结
7.cmcc_simplerop
8.0ctf2017-babyheap