Форум программистов, компьютерный форум CyberForum.ru

Как можно защитить программу от переполнений буфера? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Цикл y=1+x+x^2+x^3+...+x^n; http://www.cyberforum.ru/cpp-beginners/thread172042.html
Вводятся x и n. y=1+x+x^2+x^3+...+x^n; y-? #include <cmath> #include <conio.h> #include <iostream> using namespace std; int main() { double x;
C++ Проверить, что каждое из чисел х и у больше 100 Записать лог-е выражение, к-е имеет значение "истина", только при выполнении след. усл-я: каждое из чисел х и у больше 100 Мой корявый код: #include <cmath> #include <conio.h> #include <iostream> using namespace std; int main() { http://www.cyberforum.ru/cpp-beginners/thread172028.html
Конструктор C++
Скажите, как правлиьно оформить конструктор в этом коде? struct Student { public: Student(Student *s) { cout << "Enter the number of Z: \n"; cin >> s->nZ; cout << "Enter name of student: \n";
C++ Какими методами для работы с файлами и каталогами следует пользоваться?
Недавно изучаю, C++. И в отличие от PHP, он наполнен большим количеством функций, для решения одной и той же задачи. Когда я ищу в поисковиках, как сделать то или это, то вижу большое количество способов достичь этой цели. Обычно способы такие: - Использовать функции C - Использовать новые функции в классах C++ - Использовать winapi - Использовать функции в сторонних библиотеках -...
C++ Сортировка массива. Прошу найти ошибку http://www.cyberforum.ru/cpp-beginners/thread171996.html
Дано N цисло (1<=N<=100). Нужно отсортировать. Прошу найти ошибку #include <iostream> #include <iomanip> using namespace std; int main() { int a,n,m; cin>>n; for (int i=0; i<n; i++)
C++ Проблема с битовыми операциями Где-то баг...Вроде все правильно, но выводятся одни нули. Перепроверил уже раз 5. В чем ошибка? Вот задание: Составить прогу, которая выводит части структуры данных(00разряд-x,01-04разряд-нули, 05разряд-e,06-w,r-07,09-15-u) и формирует из них заданную упакованную структуру. #include<stdio.h> #include<stdlib.h> #include<iostream.h> #include<conio.h> void main() { подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
04.10.2010, 00:41     Как можно защитить программу от переполнений буфера?
Я тут немного баловался со своей программой,я работаю в Code::Blocks,там свой эмулятор терминала.
Программа принимает параметры
C++
1
int main(int argc, char* argv[])
В качестве последнего параметра ожидается имя файла. Для него резервируется особая переменная filename:
C++
1
2
3
4
5
6
7
8
9
   int main(int argc, char* argv[])
   {
       filename = new char [255];
       ...
       if (cmd_ParamsCheck(filename,argc,argv))
       {
          delete [] filename;
          exit(EXIT_FAILURE);
       }
Функция проверки параметров выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* -------------------------------------------------------------------------- */
  int cmd_ParamsCheck(char *const filename,const int argc, const char *const argv[])
  {
      if (argc > static_cast<int>(cmd_options.size() + 2))
      {
         cerr << "\nError: Too much parameters.      \n";
         cmd_PrintMenu();
         return 1;
      }
      if (argc > 2)
      {
         map<string, bool>::const_iterator it;
         map<string, int>temp;
         map<string, int>::const_iterator temp_it;
         for (int i = argc-2; i >= 1; --i)
         {
            it = cmd_options.find(argv[i]);
            temp_it = temp.find(argv[i]);
            if (it == cmd_options.end())
            {
               cerr << "\nError: Unknown parameter.         \n";
               cmd_PrintMenu();
               return 1;
            }
            if (temp_it != temp.end())
            {
               cerr << "\nError: Duplicate parameter.       \n";
               cmd_PrintMenu();
               return 1;
            }
            cmd_options[argv[i]] = true;
            temp[argv[i]];
         }
         strcpy(filename,argv[argc-1]);
         return 0;
      }
      else
      if (argc > 1) {
         strcpy(filename,argv[1]);
         return 0;
      }
      else {
         cmd_PrintMenu();
         return 1;
      }
  }
/* -------------------------------------------------------------------------- */
Я посылаю строку
Код
fdgjs;/media/other/checksec.sh;dfjkgh;lkjghlsdkfjghsldfkghsldkfjjjjjjjjjhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdfkjghldkfjghslkdf@jghsdkfjghsld@fkjghsldkfjgha@@sldfkghsldkfghsldfkghsldfkghsldkfjghlsdkfjgh
своей программе и шелл (или просто эмулятор C::B?) выполняет скрипт,имя которого вписано в строку (не вредоносный ,см. прикрепление) ).
Вопрос: Кто-нибудь может пояснить,как именно это работает(я так понял,разделителем служит точка с запятой,но почему вообще строка разделяется?)? Как узнать,где именно происходит переполнение,если оно имеет место,и главное,как от него защититься?
Я физически просто не могу резервировать память под строку неизвестного размера,и как проверить,что ввёл пользователь,а вдруг там строка 2 Гб?
Вывод в эмуляторе терминала C::B:
log
Код
xterm -T Interpreter -e /usr/bin/cb_console_runner /media/src/C++/Projects/CodeBlocks/Interpreter/bin/Debug/Interpreter --noinit-errors fdgjs;/media/other/checksec.sh;dfjkgh;lkjghlsdkfjghsldfkghsldkfjjjjjjjjjhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdfkjghldkfjghslkdf@jghsdkfjghsld@fkjghsldkfjgha@@sldfkghsldkfghsldfkghsldfkghsldkfjghlsdkfjgh
usage: checksec OPTIONS
    --file <binary name>
    --dir <directory name>
    --proc <process name>
    --proc-all
    --proc-libs <process ID>
    --kernel
    --version
sh: dfjkgh: not found
sh: lkjghlsdkfjghsldfkghsldkfjjjjjjjjjhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhgdfkjghldkfjghslkdf@jghsdkfjghsld@fkjghsldkfjgha@@sldfkghsldkfghsldfkghsldfkghsldkfjghlsdkfjgh: Filename too long

Или я неправильно понял смысл происходящего и это просто так работает эмулятор в Code::Blocks?
Но про посылку параметров всё же интересно,как это делается.
Вложения
Тип файла: zip checksec.sh.zip (4.4 Кб, 11 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 20:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru