c - 缓冲区溢出给同学的图解(linux,C)

标签 c stack-overflow buffer-overflow

我的 friend 是一年级 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)演示缓冲区溢出

我们怎样才能

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

最佳答案

要从 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  

关于c - 缓冲区溢出给同学的图解(linux,C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2649089/

相关文章:

typescript - 在 TypeScript 中实现堆栈安全的 Future;为什么延迟链会导致堆栈溢出?

c - 在 C 中使用数组结构函数

c - 快速问题,为什么 scanf_s 在运行时抛出异常?我很困扰

java - 堆栈溢出异常

android parcelable 引用另一个 parcelable 循环依赖

c - 当我为 put() 函数输入断点时,为什么 GDB 不允许我输入输入?

c - 缓冲区溢出的 C 代码问题

c - 缓冲区溢出

c - 将 fgetc 与 stdin 指针结合使用。错误处理输入

c - 需要制作一个非常大的数组 [2^16+1][2^16+1] - 数组的大小太大 :(