学生缓冲区溢出说明(linux,C)
我的朋友是CS一年级学生的老师。我们想向他们展示缓冲区溢出漏洞。但现代发行版受到保护,不受simples缓冲区溢出的影响:学生缓冲区溢出说明(linux,C),c,stack-overflow,buffer-overflow,C,Stack Overflow,Buffer Overflow,我的朋友是CS一年级学生的老师。我们想向他们展示缓冲区溢出漏洞。但现代发行版受到保护,不受simples缓冲区溢出的影响: HOME=`perl -e "print 'A'x269"` one_widely_used_utility_is_here --help 关于debian(责怪它) 论现代商业红帽 *** buffer overflow detected ***: /usr/bin/one_widely_used_utility_is_here terminated =======
HOME=`perl -e "print 'A'x269"` one_widely_used_utility_is_here --help
关于debian(责怪它)
论现代商业红帽
*** 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语言)
\include
#include <stdio.h>
int main()
{ int x = 0; char buffer[8]; strcpy(buffer, "test hello world;-)"); return 0; }
int main()
{intx=0;字符缓冲区[8];strcpy(缓冲区,“testhelloworld;-)”);返回0;}
在strcpy()之后,您在x中有一些来自此字符串的ascii,但如果此字符串太长,则无法保护ESP地址和程序免受此溢出和更好的说明缓冲区溢出,您必须在声明x之前声明一些大缓冲区,以保护您从ESP地址溢出。(在x之前,因为变量在堆栈排列的内存中声明)
编辑:您可以从StackOverflow徽标中对其进行演示要禁用glibc的检查字符串功能,您应该更改可利用的示例。将所有调用更改为
strcpy
,并通过检查来自
strcpy(dst, src);
到
这将神奇地禁用检查宏
要关闭gcc保护,请使用选项
-fno-stack-protector
-fnomudflap
-U_FORTIFY_SOURCE or -D_FORTIFY_SOURCE=0
要关闭非执行堆栈,请使用
execstack -s ./programme
或作为gcc链接器选项
-Wl,-z execstack
哪些选项将禁用堆栈中的金丝雀、非执行堆栈以及哪些
-D
定义将禁用字符串函数的检查版本fno stack protector禁用字符串方法的金丝雀fnomudflap无执行堆栈是一个可由CPU支持的操作系统选项。要禁用它,需要在Linux内核中设置该选项。查看本文了解一些细节()在ELF文件头中没有exec堆栈的选项。所以gcc可以禁用它。UPD:“程序失败”==分段错误可能我忘记了#包含strcpy当包含时#包含现代glibc将调用更改为strcpy\u chk(buffer,“test…”,sizeof(buffer))
。所以我们不需要包括它!哦,不,使用gclib,我不知道我们可以重新编译(甚至重写)这个示例和这个实用程序。我们无法在这么短的时间内用旧的linux安装VM(我们有<24小时)
execstack -s ./programme
-Wl,-z execstack