*** stack smashing detected ***: terminated 已放弃 (核心已转储) 栈溢出

对文件 gdb  test core 出现如下问题

Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51    ../sysdeps/unix/sysv/linux/raise.c: 没有那个文件或目录.


输入  bt   展示详细信息,从上到下顺序为从底层到高层

(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007f08657c8801 in __GI_abort () at abort.c:79
#2  0x00007f0865811897 in __libc_message (action=action@entry=do_abort, 
    fmt=fmt@entry=0x7f086593e988 "*** %s ***: %s terminated\n")
    at ../sysdeps/posix/libc_fatal.c:181
#3  0x00007f08658bccd1 in __GI___fortify_fail_abort (
    need_backtrace=need_backtrace@entry=false, 
    msg=msg@entry=0x7f086593e966 "stack smashing detected")
    at fortify_fail.c:33
#4  0x00007f08658bcc92 in __stack_chk_fail () at stack_chk_fail.c:29
#5  0x0000560a26821d5a in updateIp ()
#6  0x0000560a26821efc in verifyPassword ()
Backtrace stopped: Cannot access memory at address 0x27313131273d77

最后确定为栈溢出    开始时这个字符串如下定义:

select_userinfo_query[] ="select * from userinfo where user_no='";

可能是在strcat 附加时 溢出 

改为  select_userinfo_query[200]  可解决问题.

还有个原因不清楚:

源程序在运行这个函数时只在结束时发生错误,  函数体部分可正常运行,   函数体运行完后主函数便崩掉了.

原因:

通过查看gcc的使用手册,该报机制为gcc的-fstack-protector 一系列选项所提供的缓冲区溢出检测机制。

当-fstack-protector启用时,当其检测到缓冲区溢出时,会立即终止正在执行的程序,并提示其检测到缓冲区存在的溢出的问题。这种机制是通过在函数中的易被受到攻击的目标上下文添加保护变量来完成的。这些函数包括使用了allcoa函数以及缓冲区大小超过8bytes的函数。这些保护变量在进入函数的时候进行初始化,当函数退出时进行检测,如果某些变量检测失败,那么会打印出错误提示信息并且终止当前的进程。

void selectUserinfo(char* user_no,Userinfo *userinfo){
    
    char select_userinfo_query[200] 
    ="select * from userinfo where user_no='";
    
	strcat(select_userinfo_query,user_no);
	strcat(select_userinfo_query,"'");
	printf("SQL语句: %s\n", select_userinfo_query);

    if(mysql_query(&conn,select_userinfo_query)!=0){
	    fprintf(stderr,"用户信息查询失败");
    }else{
		if((result=mysql_store_result(&conn))==NULL){
			fprintf(stderr,"用户信息 mysql_store_result 失败!\n");
		}else{
			while((row=mysql_fetch_row(result))!=NULL)
		        {		
				    transferUserinfo(row,userinfo);
					showUserinfo(userinfo);//显示用户信息
				}							
        }
	}									
}

 

 

 


 

你可能感兴趣的:(程序设计基础)