off-by-one 漏洞
前置学习
off-by-one是一种特殊的溢出漏洞,指只溢出一个字节的情况。
造成原因
造成off-by-one的原因常常是因为边界验证不充分。
-
循环写入时,循环次数设置错误导致多写入了一个字节;
-
字符串操作有误;
strlen 是我们很熟悉的计算 ascii 字符串长度的函数,这个函数在计算字符串长度时是不把结束符
'\x00'
计算在内的,但是 strcpy 在复制字符串时会拷贝结束符'\x00'
。
利用
-
泄露的字节为可控制任意字节:通过修改大小造成块大小的重叠。
-
泄露的字节为null字节:可以清楚标志位。下面的检查在2.28版本后添加来针对这种情况。
if (__glibc_unlikely (chunksize(p) != prevsize)) malloc_printerr ("corrupted size vs. prev_size while consolidating"); unlink_chunk (av, p);
示例
栅栏错误
栅栏错误通常是由于循环的边界没有控制好导致写入多执行了一次。
// example_2.c
int my_gets(char *ptr,int size)
{
int i;
for