运行结果是:
输出
Hello,never execute
end
然后程序崩溃
#include<stdio.h>
#include<string.h>
void func(char *src){
char buf[4];
//错误,str未定义,是src吧?
strcpy(buf,src);
}
//错误,数组溢出
char gbuf[13]={'1'};
int main(){
void *p;
__asm{
//第一个问题点,高级语言中,在函数里通常是用ebp 来访问栈的,
//栈里保存着参数、返回地址,同时栈用来分配临时变量.所以在函数
//开始,一定要保存ebp,因为ebp在其他函数里也一定会用到。
push ebp;
//第二个问点,将语句标号aa的地址赋给变量p
mov p,offset aa;
}
//将p的值即aa的地址赋给 gbuf[8];
*((void **)(gbuf+8))=p;
//调用函数 func,其实func 里啥也没干
func(gbuf+8);
//输出信息
printf("Hello,never execute\n");
//跳转到 end
goto end ;
//这下面3条语句被跳过
aa:
//第三个问题点,add esp,4 这是用来释放临时变量空间的
__asm add esp,4 ;
__asm pop ebp ;
printf("new Path\n");
//因为之前 push ebp,而后面没有pop ebp,所以栈乱了,程序不能正常返回,必然崩溃。
end :
printf("end\n");
return 0;
}
|