2021巅峰极客pwn
GHOST
cve-2015-0235,glibc2.17
这个漏洞的效果就是会在Buffer里面产生溢出,Buffer_size=Name_size+33
也是有意为之了
触发的条件就是NameArr
的内容都为"0"
(注意是字符0,不是0字节)
然后溢出的字节也是n个字符"0"
,同时最后有个0字节。后面没去深究了,不太清楚有没有其他的溢出情况
不太了解2.17,索性先当成2.23来思考。本来想着当成off-by-null
来做的,但是似乎prev_size
不太好控制
所以就想着利用small bin
来用这个off-by-null
,但由于程序在add
的时候一次性会涉及到三个及以上的chunk
的操作,堆的布局不太好构造,便想着找个更好的办法
后来的解决办法就是溢出2个"0"
,即把small bin
的size
覆盖成0x3030
的大小
这样再对small bin
进行切割之后(实际size
已经被修改为0x3030
),就得到了一个覆盖后面的超大large bin
。只要提前准备好,就可以通过切割large bin
,对下面的一大片堆空间进行随意的复用了
exp:
1 | from pwn import * |
msgparser
是个http
类型的题,注意相应的输入能过即可,漏洞点也很明显
在这个进行最终读写操作的函数中,a3
来源于用户的输入且没有任何限制
而a1
是栈上的变量,也就形成了对栈上的任意读写
先泄露canary
,再溢出
不过有个问题,canary
的低位字节是"\x00"
,而在对输入进行处理的时候,会调用strlen
,然后再用alloca
在栈上开辟相应的空间,并进行拷贝
写的时候,payload
中的canary
存在0字节,后面的内容就会被截断
我的解决办法就是先把canary+1
写进payload
,防止截断,同时后面用one_gadget
覆盖返回地址,因为poprdi+binsh_addr+system
的调用链同样存在00截断的问题
接着进行第二次写入,利用栈上的数据,把canary
中的"\x01"
改为"\x00"
即可
exp:
1 | from pwn import * |