Off-By-One
Off-By-One漏洞如何产生
循环多一次
1
2
3
4
5x = malloc(10);
for(int i=0;i<=10;i++)
{
x[i] = getchar();
}x的下一个chunk第一个字节被溢出了
strlen
和strcpy
行为不一致1
2
3
4if(strlen(buffer)==100)
{
strcpy(chunk,buffer);
}strlen
返回值不算结束符’\0
,而strcpy
复制时会把结束符在内的101个字符复制过去
hitcon_creator
题目来源
https://buuoj.cn/challenges#hitcontraining_heapcreator
1. create
从上述结构可以推断出heaparray是如下结构
1 |
|
2. edit
1 |
|
read_input
读取size+1字节,出现了off_by_one漏洞
可以覆盖下一个chunk的size字段
漏洞利用
申请三个堆块,大小为0x18,0x10,0x10,加上三次size申请的0x10,一共6个chunk
修改0号块,写入
/bin/sh
,然后再溢出0x81
到下一个chunk的size这时delete chunk 1,会合并到前一个chunk(也就是1的size所在chunk)中
观察bins,发现这个chunk被free到fastbin的0x80节点上(0x20上也有一个chunk是因为delete也会将size释放掉)
申请一个新的chunk,将0x80这个块申请出来,因此malloc的大小需要为0x70
同时,在2号的content位置写入
free@got
这时调用show(2)会泄露free的地址
泄露libc基址找到system地址
edit(2,p64(system_addr))
时,会修改content指针指向的内容,而content指针被free@got
替换掉了,所以free的got表被修改成了system@got
上的地址然后
delete(0)
时,首先要free掉heaparray[0].content
上的内容,但是由于free被替换成了system,结果就变成了以content指针为参数调用system函数的情况,而heaparray[0].content
恰好是之前写过的/bin/sh
,因此执行了`system(‘/bin/sh’)
完整exp
libcsearcher挑版本为2.23的
1 |
|