【问题标题】:Smashing the stack: overflow [closed]粉碎堆栈:溢出[关闭]
【发布时间】:2012-06-02 20:47:50
【问题描述】:

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

我很清楚这里所说的原则,我严格按照步骤操作,但出现了一些错误。我开了2个终端。

在第一个终端:(在另一个终端输入“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 秒后重新启动。但在我在这里的执行中它没有。这是为什么呢?

非常感谢!

【问题讨论】:

  • 你检查过服务器实际上没有在后台运行吗?
  • 虽然我找不到你的答案。我只是喜欢你发布的那个链接。谢谢你。 :)
  • 我用ps查了一下,没有……
  • @JoachimPileborg 抱歉...但是您知道分段错误是怎么回事吗?
  • 什么操作系统?想到的是address space randomization,它旨在使溢出的程序崩溃,而不是允许任意代码执行。 Linux 自 2.6.12 以来就默认启用它,并且在此之前很久就有许多 BSD 版本。

标签: c++ c stack overflow


【解决方案1】:

学习粉碎堆栈从关注最小的细节开始。
一个成功的漏洞利用和一个简单的进程崩溃几乎完全相同。您必须找到细微差别并更改漏洞利用。

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

如果你不能回答这些问题,那么即使你把事情做好了,你也不会学到任何东西。

【讨论】:

  • 嗨 ugoren,感谢您的 cmets。我已经通读了代码,我认为程序会崩溃,因为函数 handle 中的行 strncpy(filename, start, len); 总是可以覆盖它的返回地址.我的困惑在于我对信号很陌生,所以一直没有弄清楚信号SIGSEGV是从哪里来的……
  • 信号基本上表示访问了坏内存。您需要使用调试器准确确定访问了哪些坏内存,以何种方式(读/写/执行)以及通过哪条指令访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
相关资源
最近更新 更多