3

我的朋友是一年级 CS 学生的老师。我们想向他们展示缓冲区溢出利用。但是现代发行版受到简单缓冲区溢出的保护:

HOME=`perl -e "print 'A'x269"`  one_widely_used_utility_is_here --help

在 debian 上(责备它)

Caught signal 11,

关于现代商业红帽

*** buffer overflow detected ***: /usr/bin/one_widely_used_utility_is_here terminated
======= Backtrace: =========
/lib/libc.so.6(__chk_fail+0x41)[0xc321c1]
/lib/libc.so.6(__strcpy_chk+0x43)[0xc315e3]
/usr/bin/one_widely_used_utility_is_here[0x805xxxc]
/usr/bin/one_widely_used_utility_is_here[0x804xxxc]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb61e9c]
/usr/bin/one_widely_used_utility_is_here[0x804xxx1]
======= Memory map: ========
00336000-00341000 r-xp 00000000 08:02
2751047    /lib/libgcc_s-4.1.2-20080825.so.1
00341000-00342000 rwxp 0000a000 08:02
2751047    /lib/libgcc_s-4.1.2-20080825.so.1
008f3000-008f4000 r-xp 008f3000 00:00 0          [vdso]

对于来自互联网的更多合成示例,相同的检测器失败了。

我们如何使用现代非 GPL 发行版演示缓冲区溢出(类中没有 debian)

我们怎么能

  • 禁用堆栈中的金丝雀字检查?
  • 禁用检查 strcpy/strcat 的变体?
  • 写一个工作缓冲区溢出的例子(用纯 C 语言)?
4

3 回答 3

4

要从 glibc 禁用检查字符串函数,您应该更改您的可利用示例。通过检查变体来更改所有调用strcpy和其他函数

strcpy(dst, src);

(strcpy)(dst, src);

这将神奇地禁用检查宏。

要关闭 gcc 保护,请使用选项

-fno-stack-protector
-fnomudflap
-U_FORTIFY_SOURCE or -D_FORTIFY_SOURCE=0

要关闭非执行堆栈,请使用

execstack -s ./programme 

或作为 gcc 链接器选项

-Wl,-z execstack  
于 2010-04-15T21:50:05.553 回答
2

在我的安全和隐私课程中,他们使用了虚拟机,这些虚拟机具有使用没有金丝雀的旧版 GCC 编译的易受攻击的程序。您还可以使用较新版本的 GCC 并使用命令行开关来禁用堆栈粉碎检测等安全功能。

无论哪种方式,如果您使用的是现代 Linux 发行版,您都需要重新编译程序。

于 2010-04-15T21:33:09.710 回答
0
#include <stdio.h>

int main()
{ int x = 0; char buffer[8]; strcpy(buffer, "test hello world;-)"); return 0; }

在 strcpy() 之后,你在 x 中有来自这个字符串的一些 ascii,但是如果这个字符串太长,覆盖 ESP 地址并且程序失败以防止这个和更好的 ilustration 缓冲区溢出,你必须在声明 x 之前,声明一些大缓冲区以保护您从 esp 地址溢出。(在 x 之前,因为变量在堆栈排列中声明内存)。

编辑:您可以从 StackOverflow 徽标中说明它!

于 2010-04-15T21:38:29.923 回答