套接字程序seg故障:***堆栈粉碎检测***

时间:2014-10-25 22:46:08

标签: c++ sockets telnet

所以我有一个人允许我测试我的Socket程序,然后他们通过消息得到了段错误:

*** stack smashing detected ***: ./myProgram terminated

根据我的理解,它是一个gcc编译器功能,可以检测堆栈何时变得不稳定并杀死程序。问题不是堆栈粉碎,而是它发生的方式。显然我的程序容易受到远程代码执行的影响。他是通过telnet连接的。

我相信他使用telnet导致我的套接字程序出现段错误。我不知道他是怎么做到的,以及如何防止它。我的套接字程序使用1024字节长的char []处理缓冲。即使我尝试使用5字节缓冲区,并且在这种情况下超过5个字节时消息也会被分开。

总而言之,我想知道当连接的套接字是自定义编写时,是否有人知道如何通过telnet或其他方法“注入代码”。以及如何防止它发生。

编辑:

这是我的源代码:https://github.com/theMonster/ModularServer

2 个答案:

答案 0 :(得分:1)

简单的答案是你的程序有错误。

你不能注射代码"进入一个正确编写的程序。

修复错误,攻击将消失。通常情况下,错误的形式是您的程序仅针对某些类型的输入而不是其他类型的输入,可能是因为您要么不检查函数的所有可能返回路径,要么不检查数据大小的条件和数组长度等等。

有静态和动态分析工具可以指向特定问题(例如Valgrind,ASan和UBSan),但大多数情况下你需要以正确的态度进行编程,要有条不紊并充分注意细节。

答案 1 :(得分:1)

Chatroom::recievedCommand中,您多次将堆栈上的缓冲区分配为char tmp[1024];,然后使用sprintf将文本写入其中,但不保证写入的数据小于1024字节。

这几乎是缓冲区溢出的典型示例。 OWASP has a whole page解释了这里的危险,并且在Stack Overflow上也有很多关于此类事情的现有问题。快速搜索understanding the dangers of sprintf(…),这可能也很有用。