环境:windows xp sp2 + vc 6.0
Code
1#include <stdio.h>
2
3int fun2()
4{
5 printf("-------------Get privilege!---------\n");
6 getchar();
7 return 0;
8}
9
10int fun1()
11{
12 int iRet = 0;
13 int *pRet = &iRet;
14 pRet = pRet + 2;
15 *pRet = (int )&fun2;
16 return 0;
17}
18
19int main(void)
20{
21 fun1();
22 return 0;
23}
1#include <stdio.h>
2
3int fun2()
4{
5 printf("-------------Get privilege!---------\n");
6 getchar();
7 return 0;
8}
9
10int fun1()
11{
12 int iRet = 0;
13 int *pRet = &iRet;
14 pRet = pRet + 2;
15 *pRet = (int )&fun2;
16 return 0;
17}
18
19int main(void)
20{
21 fun1();
22 return 0;
23}
执行后会在控制台打印出-------------Get privilege!---------,并在下一行等待输入。
溢出主要发生在13-15行,通过pRet获取iRet在堆栈中的位置,然后相对偏移到存放函数的返回地址处,由第15行代码用fun2的地址覆盖返回地址,当fun1返回时将跳转到fun2执行。