冲破栈:溢出攻击

3

我刚阅读了 Smashing the Stack for Fun and Profit (http://insecure.org/stf/smashstack.html) 并想进一步探索。然后我在这里找到了这段代码: https://github.com/yangsu/Stack-Smashing

我清楚地理解了这里所述的原则,并且我密切地遵循了这些步骤,但是出现了一些错误。我打开了两个终端。

在第一个终端中:(在另一个终端中输入“cat”命令后,“Segmentation fault”行出现了)

$ sudo sysctl -w kernel.randomize_va_space=0
$ gcc -z execstack -fno-stack-protector webserver.c -o server
$ ./server 5000
Segmentation fault.  Shutting down peacefully, then rebooting.
$

在第二个终端中,
$ g++ generate.cpp -o generate
$ ./generate
$ cat data.dat | nc 127.0.0.1 5000
$ 

这个错误是由于“cat”行的格式或参数错误引起的吗?还是其他原因导致的?

另外,在函数sigsegv中写道,服务器应该在2秒后重新启动。但在我的执行中它没有重新启动。为什么会这样?

非常感谢!


你是否检查过服务器实际上没有在后台运行? - Some programmer dude
虽然我找不到你的答案,但我很喜欢你发布的链接。谢谢。 :) - Katti
我使用了ps命令进行检查,但它并不存在... - goldfrapp04
@JoachimPileborg 抱歉... 你知道段错误是怎么回事吗? - goldfrapp04
什么操作系统?我想到的是地址空间随机化,它旨在使具有溢出的程序崩溃而不是允许任意代码执行。自2.6.12以来,Linux已默认启用此功能,而许多BSD版本则早在此之前就已启用。 - smocking
刚刚看到了 sudo sysctl -w kernel.randomize_va_space=0,算了。 - smocking
1个回答

2

学习堆栈溢出攻击的关键在于关注最细微的细节。
一个成功的攻击和一个简单的进程崩溃几乎完全相同。你必须找到微小的差异并改变攻击方式。

从调试崩溃的程序开始。
它为什么崩溃?堆栈上写了什么?
它是否因为修改了返回地址而崩溃(在这种情况下,你已经完成了一半),还是由于其他原因?

如果你无法回答这些问题,即使你让事情正常工作,你也不会学到任何东西。


嗨ugoren,谢谢你的评论。我已经仔细阅读了代码,我认为程序会崩溃,因为函数handle中的行*strncpy(filename, start, len);*总是可以覆盖其返回地址。我的困惑在于我对信号非常陌生,所以我还没有弄清楚信号SIGSEGV来自哪里... - goldfrapp04
信号基本上表示访问了坏内存。您需要使用调试器来确定究竟访问了哪个坏内存,以何种方式(读/写/执行)以及由哪条指令访问。 - ugoren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接