-
-
[原创]Tinypad Seccon CTF 2016(House Of Einherjar)
-
发表于: 2018-4-18 17:19 6591
-
随着对how2heap
的学习, 难度也是越来越大, 改革进入了深水区.
1.菜单
2. Add memo
3. Delete memo
4. Edit memo
5. Exit
1. checksec
结论: Full RELRO
代表我们不能复写got
表.NX
代表我们不能使用shellcode
, Canary found
代表我们不能使用栈溢出.说实话, 现在的CTF
全国性质大赛使用栈溢出的题已经比较少了, 大部分都是PWN
技能的高级应用.
2. 内存泄露
通过观察发现, 程序定了一个tinypad
的数组, 数组存放在0x6020140
.Delete memo
时程序只是将size
置为0
,将s
对应的堆地址释放, 并没有将s
本身置为NULL
, 而程序就是通过判断s
是否为空来进行显示对应的数组内容, 于是存在内存泄露.
3.缓冲区
通过上图分析, 程序会将0x602040
作为一个编辑的缓冲去, 输入Y
之后才会将输入内容复制到s
对应的堆块中去.
4.一个假设
假如我们能够分配一个地址在0x602040
附近, 那么我们就能通过分配足够的内存, 编辑tinypad
数组的内容, 修改s
指向的堆块, 实现任意地址读写.
1. Off By One
Off By One
经常和Hous Of Attack
之类的技巧组合在一起.
2. House Of Einherjar
该堆利用技术可以强制使得malloc
返回一个几乎任意地址的chunk
.其主要在于滥用free
中的后巷合并操作.
结论: 二者配合使用, 可以发挥无穷威力.
栗子
对应的利用程序
前
后
结论: 通过修改对应的size
, 我们几乎可以实现任意地址读写. 这个利用脚本将unsorted bin
中的fd
, bk
指向我们fake chunk
所在地址.
1.Off By One
2. 逻辑漏洞
结论: 可以显示释放后的地址的内容, 泄露堆地址.
1. 泄露
原理: 利用unsorted bin
中的空闲块是双链表的特性.
2.House Of Einherjar
3.攻击
将main
函数的返回值地址修改为one_gadget
地址. 由于程序是现将size
和s
先存放入数组,后读取内容, 我们可以控制index
1指向的地址.
其他思路也是可以修改top chunk
,来做到这一点的, 无奈水平有限, 以后再分析
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]C++ static关键字引发的思考 10848
- [原创]Windows 之 CRT的检测内存泄露 16560
- [讨论] <<程序员的自我修养 -- 链接、装载与库>> 书籍相关问题 32311
- [原创] Kamnira Adware分析 4463