о переполнении буфера - PullRequest
       49

о переполнении буфера

1 голос
/ 24 апреля 2010

Я новичок в мире этического хакерства, и одна из самых важных вещей - это переполнение стека, так или иначе, я закодировал уязвимую программу на C, которая имеет оператор char name [400], и когда я пытаюсь запустить программу с 401A, это не переполняет, но книга, за которой я следую, говорит, что она должна переполниться, и логический смысл так говорит, так что не так ???

Ответы [ 4 ]

5 голосов
/ 24 апреля 2010

Если вы определили буфер:

char buf[400];

И записал в него 401 байт, буфер переполнен . Остальное, однако, зависит от структуры вашего кода:

  • Как распределяется буфер (статически, динамически, в стеке)
  • Что происходит до и после него в памяти
  • Соглашение о вызовах вашей архитектуры и ABI (в случае стекового буфера)
  • еще немного ...

Вещи сложнее, чем кажутся. Цитировать Википедия :

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

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

3 голосов
/ 24 апреля 2010

C не проверяет переполнение буфера (переполнение буфера - неопределенное поведение). Обычно система просто позволяет вам (и хакеру) писать за пределами буфера , и это является причиной того, что переполнение буфера уязвимо .

Например, если код

char name[400];
char secret_password[400];
...

Память может быть размещена как

[John             ][12345                 ]
 name               secret_password

Теперь, если вы напишите 401 A с последующим NULL в name, дополнительный A\0 будет записан в secret_password, что в основном изменило пароль от вашей багажной комбинации на просто "A":

[AAAAAAAAA...AAAAA][A␀345                ]
 name               secret_password
2 голосов
/ 24 апреля 2010

Stackoverflow и bufferoverflow - это разные понятия.
Stackoverflow:
Размер стека программ является статическим, он никогда не изменяется во время выполнения. Поскольку невозможно узнать, сколько памяти понадобится вашему стеку во время выполнения, зарезервирован достаточно большой блок памяти. Однако некоторые программы выходят из этого, вызывая рекурсивную функцию.
Вызов функции резервирует столько места, сколько необходимо для хранения локальных переменных в стеке и освобождает память после ее выхода. Рекурсивная функция резервирует новую память каждый раз, когда она вводится, и освобождает ее при выходе. Если рекурсия никогда не заканчивается из-за ошибки программирования, все больше и больше памяти в стеке резервируется до тех пор, пока стек не будет заполнен.
Попытка зарезервировать память для полного стека приведет к ошибке, стекопотока.
Пример кода:

volatile bool args = false;
int myoverflow(int i){
  int a[500];   
if(args)
   return a[i%500];
else
   return myoverflow(i+1);
}

Это должно переполнить стек. Он будет резервировать 500 * sizeof (int) каждый раз при входе в функцию.

переполнение буфера: У вас есть две переменные, массив a и массив b. a может содержать 4 элемента, а b может содержать 2. Теперь вы записываете 5 элементов в a, 5-й элемент попадает в b.
Пример:

void main(int ,char**)
{
  int a[4];
  int b[2];
  a[5] = 22;
  std::cout<<b[0];
}

Это должно вывести 22. он запишет вне a, в память, используемую b.

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

2 голосов
/ 24 апреля 2010

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

Для очень хорошего объяснения переполнения буфера я бы рекомендовал главу 5 Написание безопасного кода 2-е издание .

Другая полезная информация о переполнении буфера:

...