off-by-one
严格来说 off-by-one 漏洞是一种特殊的溢出漏洞,off-by-one 指程序向缓冲区写入时,写入的字节数超过了这个缓冲区本身申请的字节数并且只越界了一个字节
char buf[size];
for (int i = 0; i <= size; i++) {
buf[i] = getchar();
}
通常是在buf[size]位置在非法写入一个字节,堆上(heap based) 的 off-by-one 是 CTF 中比较常见的
Asis-2016-b00ks | off-by-one
IDA分析,已下是逆向过的代码,方便理解
Change先在author处输入32个字节,此处有off-by-one漏洞,触发需要注意代码执行顺序
之后是菜单选择,Create主要是创建book结构体以及book_list
为方便理解用调试看一下
绿框是我们输入的author name,红框是book1,蓝框是booklist,可以容纳最多20本书(20的原因是下面的check full函数)
绿色,红色,橙色分别对应name,description,book,红色框是可以变化的,取决于size,下图的后三行中的0x30大小的chunk是截止到目前调用一次Create(3次malloc)
可以看出Print是按地址解析的。