我开始学习缓冲区溢出的基础知识。我遇到了一个代码,其中应该发生一次的函数调用可以通过修改流而不是在函数执行结束时指向返回地址而发生两次,代码指向函数的起始地址。这是代码:
int main()
{
int i=0; char buf[44];
for (i=0;i<=40;i+=4)
*(long *) &buf[i] = 0x80484cb;
puts(buf);
}
*(long *) &buf[i]
是什么意思?我知道它的基础知识,但在这里需要一些帮助。
答案 0 :(得分:2)
由于投射了不相关的类型,代码很乱并且行为未定义。 (虽然您总是强制转换为char*
,但反过来不一定正确,因为buf[0]
可能无法正确对齐long
。)
简而言之,循环的每次迭代都是尝试将指向char
的指针转换为指向long
, pretenting 的指针1}}在该位置long
可以分配0x80484cb
。
还假设sizeof(long)
是4,这至少可以说是不可能。
puts
的行为将未定义,因为buf
并不一定指向包含空终止符char
数组的开头{ {1}}。
一种更安全的方法是直接在\0
数组上执行指针算法,在你去的时候分配char
的部分。