fst.c源程序和snd.c源程序
很有意思的两个程序哦,值得一试,两个程序都是先获得数据在堆栈中的位置,然后计算出堆栈中函数的返回地址,并修改为想跳转到的地址,虽然看起来形式不同,其实实质相同。值得注意的是,在堆栈中分配空间,保存函数返回地址等操作是依赖于特定的编译器的,即每种编译器实现的方式都不同,因此上述程序只在VC6下编译能成功运行,换做 Borland C 或其他编译器,程序就不能正确运行了。
一、fst.c源程序,在VC6下编译通过。
#include \"stdio.h\"
void overflow(int a,int b)
{
char buffer1[8];
int *ret;
ret = (int *)(buffer1 + 12);
(*ret)+=8;
}
void main()
{
int num;
num = 11111;
overflow(1,2);
num = 22222;
__asm
{
add esp,0x8
}
printf(\"%d\\n\",num);
}
二、snd.c源程序,在VC6下编译通过。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
void say()
{
puts(\"Hello world!\");
exit(0);
}
int main()
{
volatile int a = 0;
volatile int * p = &a;
*(p + 2) = (int)say;
*(p + 3) = (int)say;
return 0;
}