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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

04.10.2010, 00:41. Просмотров 862. Ответов 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 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2010, 00:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как можно защитить программу от переполнений буфера? (C++):

Каким способом можно защитить программу от копирования - C++
Добрый день. Пожалуйста подскажите каким способом можно защитить программу от копирования. Программа простая. Все данные берутся локально. ...

Как защитить программу? - C++
Пароль можно зашифровать. Только это не спасет от тех кто действительно захочет узнать настоящий пароль. Какие есть хорошие способы защиты?

Как защитить программу от taskkill? - C++
Как защитить программу от taskkill? :p

Как защитить программу от воровства? - C++
Есть программа, как сделать так что б другой человек её не скачал и не сказал что вот вот моя программа? Для этого достаточно написать в...

Настройка компилятора VS 2008 на исключение переполнений - C++
Например, программа для вычисления факториала последовательности натуральных чисел n. #include &lt;iostream&gt; #include &lt;iomanip&gt; ...

Code::Blocks Когда нажимаешь среднюю среднюю кнопку мыши, то вставляется содержимое буфера обмена. Как это можно изменить? - C++
И еще где найти русифицированную Code::Blocks?

4
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.10.2010, 00:52 #2
Мб

fdgjs;/media/other/checksec.sh;dfjkgh;

; - токен?

П.С. от переполнения как мне кажется лучше всего спасает std::string...

А так же. strncpy - впринципе должен... Вообщем что-то, что ограничивает кол-во вводимых символов. А дальше пиши сколько хочешь, больше чем нужно прочитано не будет.
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
04.10.2010, 00:54  [ТС] #3
К сожалению,второй параметр программы,который она принимает от операционной системы,должен быть char**
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.10.2010, 00:59 #4
#pragma, Ну да.. Но что мешает привести в std::string?

C++
1
std::string S=argv[1];
ЗЫ, если нельзя тогда strncpy или написать свою функцию, которая копирует не более n символов и завершает строку нулевым символом...
1
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.10.2010, 01:02 #5
#pragma, действенный способ избежать переполнения буфера - это использование функций, одним из параметров которых передается размер буфера, как, например, указанный Lavroff'ым strncpy. Тем более такие вещи, как максимальная длина пути файла, известны, по крайней мере в Windows (MAX_PATH). В Линуксе, думаю, тоже должно быть какое-то ограничение.
1
04.10.2010, 01:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2010, 01:02
Привет! Вот еще темы с ответами:

Можно ли таким образом защитить программу - C#
Допустим, известны основные утилиты и программы для взлома c#. Во время работы нашей программы просто проверяем, не запущен ли какие-нибудь...

Как можно защитить пароль? - C#
Добрый вечер, как можно защитить пароль который находится в коде для авторизации на сайтах и для отправки писем через SMTp server???...

Как можно защитить приложение от взлома? - C++ Builder
Как можно ещё защитить код (усложнить работу при декомпиляции)? Тема была выделена отсюда -...

Как можно защитить свое приложение он декодирования - Visual Basic .NET
Здравствуйте подскажите пожалуйста 1) как можно защитить свое приложение он декодирования 2) как защитить свой исходный код который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.