p*****y 发帖数: 1049 | 1 面试题:在debug 的时候,发现函数return to a “wild” place
这是什么原因? |
w***g 发帖数: 5958 | 2 缓冲溢出呗,黑客攻击的基本手段。
【在 p*****y 的大作中提到】 : 面试题:在debug 的时候,发现函数return to a “wild” place : 这是什么原因?
|
d****n 发帖数: 1637 | 3 uninitialized value ?
int fun(){
int i;
//no operations on i here.
return i;
}
【在 p*****y 的大作中提到】 : 面试题:在debug 的时候,发现函数return to a “wild” place : 这是什么原因?
|
p*****y 发帖数: 1049 | 4 请教什么叫缓冲溢出 ?
英语是什么?
【在 w***g 的大作中提到】 : 缓冲溢出呗,黑客攻击的基本手段。
|
S******n 发帖数: 489 | 5 buffer overflow?
【在 p*****y 的大作中提到】 : 请教什么叫缓冲溢出 ? : 英语是什么?
|
p*****y 发帖数: 1049 | 6 请问为什么buffer overflow 之后 函数会返回到wild place? |
p*****y 发帖数: 1049 | 7 请问为什么buffer overflow 之后 函数会返回到wild place? |
p*****y 发帖数: 1049 | 8 这样说对吗?
If a function has larger input than the stack size, then the other memory of
other functions might be overwritten. If the overwritten memory contains
the return address of some functions, then the function will return to a
wild place, a place that hacker guides you to.
【在 w***g 的大作中提到】 : 缓冲溢出呗,黑客攻击的基本手段。
|
w***g 发帖数: 5958 | 9 这个问题之所以会发生,本质上是因为编译器设计的时候决定了堆栈地址是往下长的。
函数运行的时候堆栈结构是像下面这样的:
高地址
[返回地址]
[局部变量A]
[局部变量B]
[局部变量C]
....
....
[栈顶]
低地址
调用函数的时候就往栈顶压入返回地址,然后再压入局部变量,等函数结束的时候取出
返回地址,然后把栈顶调整到函数未开始时的地址。
如果局部变量B是一个数组,那么你让数组越界(buffer overflow)后就会把高地址存的
返回地址覆盖掉,然后函数返回的时候就会跳到一个随机的地方了。实际情况往往比这
个复杂的多,比如C/C++很少会把buffer分配在堆栈(stack)上,而是一般都分配在堆(
heap)上。这时候数组越界能越到堆栈上的返回地址的可能性就会减少,所以越界就得
越的相当多才行。对于古老的系统,甚至可以越界到指令内存,用恶意指令把程序本身
都覆盖了。
【在 p*****y 的大作中提到】 : 请问为什么buffer overflow 之后 函数会返回到wild place?
|
p*****y 发帖数: 1049 | 10 非常感谢 牛人
请问这些内容属于什么范畴?C/C++编程里面没有这些东西,是不是属于操作系统范畴?
【在 w***g 的大作中提到】 : 这个问题之所以会发生,本质上是因为编译器设计的时候决定了堆栈地址是往下长的。 : 函数运行的时候堆栈结构是像下面这样的: : 高地址 : [返回地址] : [局部变量A] : [局部变量B] : [局部变量C] : .... : .... : [栈顶]
|
|
|
D*******a 发帖数: 3688 | 11 assembly
畴?
【在 p*****y 的大作中提到】 : 非常感谢 牛人 : 请问这些内容属于什么范畴?C/C++编程里面没有这些东西,是不是属于操作系统范畴?
|
b***i 发帖数: 3043 | 12 stack over flow
【在 p*****y 的大作中提到】 : 面试题:在debug 的时候,发现函数return to a “wild” place : 这是什么原因?
|
w***g 发帖数: 5958 | 13 stack overflow是另外一回事。stack overflow以后函数都不会返回了。
【在 b***i 的大作中提到】 : stack over flow
|
b***i 发帖数: 3043 | 14 假设单片机有16个字节的堆栈,然后函数f, g, h, k,i互相调用,假设调用了17次,那
么返回的时候,
最开始的f地址被最后的函数地址覆盖,返回的时候不就回到错误的地方了?
【在 w***g 的大作中提到】 : stack overflow是另外一回事。stack overflow以后函数都不会返回了。
|
w***g 发帖数: 5958 | 15 有道理。
【在 b***i 的大作中提到】 : 假设单片机有16个字节的堆栈,然后函数f, g, h, k,i互相调用,假设调用了17次,那 : 么返回的时候, : 最开始的f地址被最后的函数地址覆盖,返回的时候不就回到错误的地方了?
|