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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вектор чисел http://www.cyberforum.ru/cpp-beginners/thread172048.html
Здравствуйте, возникла проблема с перебором в с++. Такая задача: есть вектор чисел (их вводит пользователь парами, то есть пользователь вводит всегда четное количество чисел). Реализована функция...
C++ Цикл y=1+x+x^2+x^3+...+x^n; Вводятся 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; http://www.cyberforum.ru/cpp-beginners/thread172042.html
C++ Проверить, что каждое из чисел х и у больше 100
Записать лог-е выражение, к-е имеет значение "истина", только при выполнении след. усл-я: каждое из чисел х и у больше 100 Мой корявый код: #include <cmath> #include <conio.h> #include...
Конструктор C++
Скажите, как правлиьно оформить конструктор в этом коде? struct Student { public: Student(Student *s) { cout << "Enter the number of Z: \n"; cin >> s->nZ; cout << "Enter name...
C++ Какими методами для работы с файлами и каталогами следует пользоваться? http://www.cyberforum.ru/cpp-beginners/thread172002.html
Недавно изучаю, C++. И в отличие от PHP, он наполнен большим количеством функций, для решения одной и той же задачи. Когда я ищу в поисковиках, как сделать то или это, то вижу большое количество...
C++ Сортировка массива. Прошу найти ошибку Дано 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++) подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921

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

04.10.2010, 00:41. Просмотров 849. Ответов 4
Метки (Все метки)

Я тут немного баловался со своей программой,я работаю в 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?
Но про посылку параметров всё же интересно,как это делается.
0
Вложения
Тип файла: zip checksec.sh.zip (4.4 Кб, 11 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru