环境:windows xp sp2 + vc 6.0
1
#include <stdio.h>2

3
int fun2()4


{5
printf("-------------Get privilege!---------\n");6
getchar();7
return 0;8
}9

10
int fun1()11


{12
int iRet = 0;13
int *pRet = &iRet;14
pRet = pRet + 2;15
*pRet = (int )&fun2;16
return 0;17
}18

19
int main(void)20


{21
fun1();22
return 0;23
}
执行后会在控制台打印出-------------Get privilege!---------,并在下一行等待输入。
溢出主要发生在13-15行,通过pRet获取iRet在堆栈中的位置,然后相对偏移到存放函数的返回地址处,由第15行代码用fun2的地址覆盖返回地址,当fun1返回时将跳转到fun2执行。