Демонстрация переполнения буфера в C в Ubuntu 13.04

В рамках моего задания я должен продемонстрировать stackoverflow в своей Linux-системе.

Конфигурация моего ящика: ОС: Ubuntu 13.04

Версия GCC: 4.6.3

Я попытался скомпилировать программу с флагом -fno-stack-protector, программа успешно соблюдается, но ошибка сегментации появляется, когда я запускаю переполнение стека. Как я могу показать фактическое o/p. Буфер перерасхода Pgm:

int main(int argc, char**argv)
 {
   int authentication=0;
   char cUsername[10], cPassword[10];
   strcpy(cUsername, argv[1]);
   strcpy(cPassword, argv[2]);
   if(strcmp(cUsername, "admin") == 0 && strcmp(cPassword, "adminpass") == 0)
{
       authentication = 1;}
if(authentication)
{
       printf("Access granted");} 
else
{
       printf("Wrong username and password");
    }return 0;}

Если я даю IP-адрес типа AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAаааааааааааааааааааааааааа будет


person 3lokh    schedule 03.02.2014    source источник
comment
Вы хотите переполнить стек и выполнить шелл-код?   -  person nhahtdh    schedule 03.02.2014
comment
Да, я хочу скопировать длинную строку в небольшой массив символов.   -  person 3lokh    schedule 03.02.2014
comment
Это больше похоже на повреждение стека, чем на переполнение стека.   -  person Martin James    schedule 03.02.2014
comment
Окей..... Итак, как я могу успешно продемонстрировать это..?   -  person 3lokh    schedule 03.02.2014
comment
Если у вас есть SIGSEGV, то вы уже это продемонстрировали: вы записали слишком много данных в маленький буфер, ОС выдала вам нарушение сегмента. Что именно вы хотите продемонстрировать?   -  person m0skit0    schedule 03.02.2014
comment
Попробуйте бесконечную рекурсию, такую ​​как void foo() {foo();}. Это даст вам переполнение стека.   -  person Jabberwocky    schedule 03.02.2014
comment
Я добавил код моего pgm...   -  person 3lokh    schedule 03.02.2014


Ответы (1)


Вот что происходит с моим компилятором c, если вы запускаете программу с такими аргументами:

int main(int argc, char**argv)
{
  int authentication=0;
  char cUsername[10], cPassword[10];

  strcpy(cUsername, argv[1]);
  // now cUsername contains "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
  // and authentication contains "0x41414141" because it has been overwritten because of the
  // buffer overflow of cUsername

  strcpy(cPassword, argv[2]);
  //now cPassword contains "B"

  if(strcmp(cUsername, "admin") == 0 && strcmp(cPassword, "adminpass") == 0)
  {
    // strings are different so we don't get here
    authentication = 1;
  }

  if (authentication)
  {
    // authentication still contains 0x41414141 therefore we get here
    printf("Access granted");
  } 
  else
  {
    printf("Wrong username and password");
  }

  // here we will get a segmentation fault, because the return adress which is on the
  // stack will have been overwritten with 0x41414141 which is most probably an
  // invalid address
  return 0;
}

Кстати, если вы правильно отформатируете свой код, его будет намного легче читать.

Важно

В зависимости от вашей системы «Доступ разрешен» может не распечатываться, потому что, если вывод буферизован, выходной буфер обычно очищается после возврата из основной функции, и поскольку перед этим произошел сбой сегмента программы, выходной буфер никогда не очищается, и сообщение никогда не отображается. Попробуйте добавить \n в конце строки «Доступ предоставлен\n».

person Jabberwocky    schedule 03.02.2014
comment
Всегда можно сбросить буфер вывода с помощью fflush(stdout); - person recursion.ninja; 03.02.2014
comment
Итак, я хочу получить сообщение «Доступ предоставлен», когда приходит этот o/p, но он сразу переходит к ошибке сегментации. - person 3lokh; 04.02.2014
comment
Запустите свою программу с помощью отладчика, и вы увидите, где именно возникает ошибка seg. - person Jabberwocky; 04.02.2014