学生缓冲区溢出的插图(linux,C)

时间:2010-04-15 21:25:50

标签: c stack-overflow buffer-overflow

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

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

关于debian(责备它)

Caught signal 11,

关于现代商业redhat

*** 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)

我们怎么样

  • 在堆栈中禁用金丝雀字检查?
  • DISABLE检查strcpy / strcat的变种?
  • 用工作缓冲区溢出写一个例子(在普通的C中)?

3 个答案:

答案 0 :(得分: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-linker选项

-Wl,-z execstack  

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

#include <stdio.h>

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

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

编辑:您可以从StackOverflow徽标中清除它!