Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
学生缓冲区溢出说明(linux,C)_C_Stack Overflow_Buffer Overflow - Fatal编程技术网

学生缓冲区溢出说明(linux,C)

学生缓冲区溢出说明(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 =======

我的朋友是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
======= 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语言)

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

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

\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