VS中 MFC通信 调试时候基于堆栈的缓冲区溢出

wyx234k 2017-12-20 12:04:02

请教各位前辈,
0x00007FF7A0F1012C 处有未经处理的异常(在 Client.exe 中): 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出。
在调用堆栈中查到自己代码部分如下图


箭头在最后一个括号前,那这个错误是在哪?
...全文
1147 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33379709 2017-12-26
  • 打赏
  • 举报
回复
我觉得 strcpy(tempName, wsabuf[1].buf); strcpy(tempCorX, wsabuf[2].buf); strcpy(tempCorY, wsabuf[3].buf); strcpy(tempXSpeed, wsabuf[4].buf); strcpy(tempYSpeed, wsabuf[5].buf); 这种很可疑
赵4老师 2017-12-24
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
zgl7903 2017-12-22
  • 打赏
  • 举报
回复
for (int i = 0; i < MESS_KIND; i++) { wsabuf[i].buf = new char[BUF_LEN]; wsabuf[i].len = BUF_LEN; } err = WSARecv(m_socket, wsabuf, MESS_LEN, &dwRead, &dwFlag, NULL, NULL); //上面分配BUF_LEN 读取 MESS_LEN , 如果 MESS_LEN 大于 BUF_LEN 时会存在越界覆盖问题
wyx234k 2017-12-22
  • 打赏
  • 举报
回复
是这样啊,但是定位到我的代码的时候是指在括号位置
赵4老师 2017-12-22
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
wyx234k 2017-12-22
  • 打赏
  • 举报
回复
这个问题有时候一会就出现出现,有时候运行很长时间才出现 我觉得是这部分代码的问题 strcpy(tempName, wsabuf[1].buf); strcpy(tempCorX, wsabuf[2].buf); strcpy(tempCorY, wsabuf[3].buf); strcpy(tempXSpeed, wsabuf[4].buf); strcpy(tempYSpeed, wsabuf[5].buf); strcpy将数组复制给数组的问题,可是调试中断点看数据也没看出什么来 @zgl7903 您看呢?
wyx234k 2017-12-22
  • 打赏
  • 举报
回复
代码改成下面还是同样的错误 for (int i = 0; i < MESS_KIND; i++) { wsabuf[i].buf = new char[BUF_LEN]; wsabuf[i].len = BUF_LEN; } err = WSARecv((SOCKET)wParam, wsabuf, MESS_KIND, &dwRead, &dwFlag, NULL, NULL); WSARecv的第三个参数 MESS_KIND是WSABUF结构个数,BUF_LEN是数组中元素可接收长度
zgl7903 2017-12-20
  • 打赏
  • 举报
回复
wsabuf 是怎么分配的?
wyx234k 2017-12-20
  • 打赏
  • 举报
回复
@zgl7903 wsabuf[0]来存命令 wsabuf[1]来存名字 wsabuf[2]用来存x坐标 wsabuf[3]用来存y坐标 wsabuf[4]、wsabuf[5]分别用来存x,y方向的速度。 MESS_KIND 为10 MESS_LEN 为6
wyx234k 2017-12-20
  • 打赏
  • 举报
回复
LRESULT CTCPClientView::OnSock(WPARAM wParam, LPARAM lParam) { switch (LOWORD(lParam)) { case FD_READ: { WSABUF wsabuf[MESS_KIND]; DWORD dwRead; DWORD dwFlag = 0; int err; for (int i = 0; i < MESS_KIND; i++) { wsabuf[i].buf = new char[BUF_LEN]; wsabuf[i].len = BUF_LEN; } err = WSARecv(m_socket, wsabuf, MESS_LEN, &dwRead, &dwFlag, NULL, NULL); if (err == SOCKET_ERROR) { MessageBox("接收数据失败!", "提示"); return 1; } if (strcmp(wsabuf[0].buf, "error") == 0) //strcmp函数对字符的ASCII码进行比较,相同为0 { MessageBox(wsabuf[1].buf, "错误"); closesocket(m_socket); if (FALSE == InitSocket()) { MessageBox("初始化socket失败!", "提示"); return 1; } pConectDlg->ShowWindow(SW_SHOW); return 1; } if (strcmp(wsabuf[0].buf, "ready") == 0) { char tempName[BUF_LEN]; char tempCorX[BUF_LEN], tempCorY[BUF_LEN]; char tempXSpeed[BUF_LEN], tempYSpeed[BUF_LEN]; strcpy(tempName, wsabuf[1].buf); strcpy(tempCorX, wsabuf[2].buf); strcpy(tempCorY, wsabuf[3].buf); strcpy(tempXSpeed, wsabuf[4].buf); strcpy(tempYSpeed, wsabuf[5].buf); //Sleep(50); map<CString, CClient *>::iterator tempIter; tempIter = clientTable.find((CString)tempName); if (tempIter == clientTable.end()) { CClient *newClient = new CClient; newClient->m_name = (CString)tempName; //MessageBox(tempName); sscanf(tempCorX, "%lf", &(newClient->center.x)); sscanf(tempCorY, "%lf", &(newClient->center.y)); sscanf(tempXSpeed, "%lf", &(newClient->m_speed.xspeed)); sscanf(tempYSpeed, "%lf", &(newClient->m_speed.yspeed)); clientTable[(CString)tempName] = newClient; } else { //MessageBox(tempName); CClient *nowClient = tempIter->second; sscanf(tempCorX, "%lf", &(nowClient->center.x)); sscanf(tempCorY, "%lf", &(nowClient->center.y)); sscanf(tempXSpeed, "%lf", &(nowClient->m_speed.xspeed)); sscanf(tempYSpeed, "%lf", &(nowClient->m_speed.yspeed)); //sscanf指定格式读取 } //MessageBox("ready!"); if (strcmp(wsabuf[1].buf, CTCPClientApp::myName) == 0) { pReadyDia = new CReadyDialog; pReadyDia->DoModal(); } } for (int i = 0; i < MESS_KIND; i++) { if (strcmp(wsabuf[i].buf, "go") == 0) { if (pReadyDia != NULL) { pReadyDia->m_timeText.SetWindowText("倒计时: 3s开始!"); Sleep(1000); pReadyDia->m_timeText.SetWindowText("倒计时: 2s开始!"); Sleep(1000); pReadyDia->m_timeText.SetWindowText("倒计时: 1s开始!"); Sleep(1000); //计时模块 CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd); pFrame-> SetTimer(4, 1000, NULL); pReadyDia->EndDialog(0); pReadyDia = NULL; } } } if (strcmp(wsabuf[0].buf, "coordinate") == 0) { a = 1; char tempName[BUF_LEN]; char tempCorX[BUF_LEN], tempCorY[BUF_LEN]; char tempXSpeed[BUF_LEN], tempYSpeed[BUF_LEN]; strcpy(tempName, wsabuf[1].buf); strcpy(tempCorX, wsabuf[2].buf); strcpy(tempCorY, wsabuf[3].buf); strcpy(tempXSpeed, wsabuf[4].buf); strcpy(tempYSpeed, wsabuf[5].buf); //MessageBox(tempName); map<CString, CClient *>::iterator tempIter; tempIter = clientTable.find((CString)tempName); if (tempIter == clientTable.end()) { CClient *newClient = new CClient; newClient->m_name = (CString)tempName; //MessageBox(tempName); sscanf(tempCorX, "%lf", &(newClient->center.x)); sscanf(tempCorY, "%lf", &(newClient->center.y)); sscanf(tempXSpeed, "%lf", &(newClient->m_speed.xspeed)); sscanf(tempYSpeed, "%lf", &(newClient->m_speed.yspeed)); clientTable[(CString)tempName] = newClient; } else { //MessageBox(tempName); CClient *nowClient = tempIter->second; sscanf(tempCorX, "%lf", &(nowClient->center.x)); sscanf(tempCorY, "%lf", &(nowClient->center.y)); sscanf(tempXSpeed, "%lf", &(nowClient->m_speed.xspeed)); sscanf(tempYSpeed, "%lf", &(nowClient->m_speed.yspeed)); } } if (strcmp(wsabuf[0].buf, "quit") == 0) { //MessageBox("用户退出!"); map<CString, CClient *>::iterator tempIter; tempIter = clientTable.find((CString)wsabuf[1].buf); //调试信息 //CString a = (CString)wsabuf[1].buf; //printf("%s 已退出", a); if (tempIter != clientTable.end()) { delete tempIter->second; clientTable.erase(tempIter); } } for (int i = 0; i < MESS_KIND; i++) delete[] wsabuf[i].buf; break; } } return 0; }
网络安全试题 部门: 姓名: 成绩: 第一部分 选择题(50分) 1、Ipsec协议主要应用属于哪一层?[ ] A、应用层 B、传输层 C、Internet层 D、网络层 2、黑客搭线窃听属于哪一类风险? [ ] A、信息存储安全 B、信息传输安全 C、信息访问安全 D、以上都不正确 3、有关对称密钥加密技术的说法,哪个是确切的? [ ]   A、又称秘密密钥加密技术,收信方和发信方使用相同的密钥。   B、又称公开密钥加密,收信方和发信方使用的密钥互不相同   C、又称秘密密钥加密技术,收信方和发信方使用不同的密钥   D、又称公开密钥加密,收信方和发信方使用的密钥互不相同 4、典型的针对系统漏洞的DoS攻击方式是:[ ] A、Syn flood B、Smurf C、Ping of Death D、TCP flood 5、在下面的VPN技术,属于二层的VPN技术是:[ ] A、PPTP VPN B、GRE VPN C、IPSec VPN 6、下面不属于木马特征的是( ) A. 自动更换文件名,难于被发现 B. 程序执行时不占太多系统资源 C. 不需要服务端用户的允许就能获得系统的使用权 D. 造成缓冲区的溢出,破坏程序的堆栈 7、RIP用什么路由算法?[ ] A、link state B、routed information C、link together D、distance vector 8、给出一个地址,前缀为/24,将这些地址用前缀/28来划分子网,可得多少个子网?[ ] A、64 B、128 C、32 D、16 9、( )就是应用程序的执行实例(或称一个执行程序),是程序动态的描述。 A、线程 B、程序 C、进程 D、堆栈 10、WINDOWS主机推荐使用[ ]格式 A、NTFS B、FAT32 C、FAT D、LINUX 11、UNIX系统的目录结构是一种[ ]结构 A、树状 B、环状 C、星状 D、线状 12、[ ]协议主要用于加密机制 A、HTTP B、FTP C、TELNET D、SSL 13、凡是基于网络应用的程序都离不开( )。 A、Socket B、Winsock C、注册表 D、MFC编程 14、为了防御网络监听,最常用的方法是[ ] A、采用物理传输(非网络) B、信息加密 C、无线网 D、使用专线传输 15、向有限的空间输入超长的字符串是[ ]攻击手段。 A、缓冲区溢出 B、网络监听 C、端口扫描 D、IP欺骗 16、使网络服务器充斥着大量要求回复的信息,消耗带宽,导致网络或系统停止正常 服务,这属于[ ]漏洞 A、拒绝服务 B、文件共享 C、BIND漏洞 D、远程过程调用 17、输入法漏洞通过[ ]端口实现的。 A、21 B、23 C、445 D、3389 18. 一次字典攻击能否成功,很大因素上决定于( )。 A、字典文件 B、计算机性能 C、网络速度 D、黑客经验 19. 信息风险主要指那些?[ ] (A) 信息存储安全 (B) 信息传输安全 (C) 信息访问安全 (D) 以上都正确 20. 下面不属于恶意代码攻击技术的是( )。 A、进程注入技术 B、超级管理技术 C、端口反向连接技术 D、自动生产技术 21. ( )是指有关管理、保护和发布敏感信息的法律、规定和实施细则。 A、安全策略 B、安全模型 C、安全框架 D、安全原则 22. 下面哪个属于对称算法( )。 A、数字签名 B、序列算法 C、RSA算法 D、数字水印 23. ( )用于客户机和服务器建立起安全连接之前交换一系列信息的安全通道。 A、记录协议 B、会话协议 C、握手协议 D、连接协议 24. 通常被认为安防体系的基础的是_____。 [ ] (A) 人 (B) 技术 (C) 制度 (D) 产品 25. WWW的超链接定位信息所在位置使用的是[ ]。 A. 超文本(hypertext)技术 B. 统一资源定位器(URL,Uniform Resource Locators) C. 超媒体(hypermedia)技术 D. 超文本标记语言HTML 第二部分 判断题(10分) ( )1.网络安全应具有以下四个方面的特征:保密性,完整性,可用性,可查性。 ( )2.现代密码体制把算法和密钥分开,只需要保证密钥的保密性就行了,算法是可以公开的 。 ( )3.拒绝服务攻击属于被动攻击的一种。 ( )4.DES 算法对明文的处理过程分 3 个阶段: 首先是一个初始置换 IP, 用于重排明文分组的 64 比特数据. 然后是具有相同功能的 64 轮变换,每轮都有置换和代换运算.最后是一个逆初始置换从而产生 64 比特的密文。 ( )5.公开密钥密码体制比对称密钥密码体制更为安全。 ( )6.Diffie-Hellman 算法的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧