Иллюстрация переполнения буфера для студентов (linux, C) - PullRequest
3 голосов
/ 16 апреля 2010

Мой друг - учитель первокурсников 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) с переполнением рабочего буфера?

Ответы [ 3 ]

4 голосов
/ 16 апреля 2010

Чтобы отключить проверку функций строк из 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  
2 голосов
/ 16 апреля 2010

В моем классе безопасности и конфиденциальности они использовали виртуальные машины с уязвимыми программами, скомпилированными с более старой версией GCC, в которой не было канареек. Вы также можете использовать более новые версии GCC и использовать параметры командной строки, чтобы отключить такие функции безопасности, как обнаружение разрушения стека.

В любом случае вам придется перекомпилировать программы, если вы используете современный дистрибутив Linux.

0 голосов
/ 16 апреля 2010
#include <stdio.h>

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

После strcpy () у вас есть x некоторый ascii из этой строки, но если эта строка слишком длинная, переопределите адреса ESP и программа не сможет защититься от этого и улучшится переполнение буфера ilustration, вы должны до объявлениях, объявите большой буфер для защиты от переполнения адреса esp.(до x, потому что переменные объявляются в памяти в стеке).

Редактировать: Вы можете проиллюстрировать это из логотипа StackOverflow !!

...