Вот-тута есть кой-чего...
fork (перенести на Windows)
Модератор: Модераторы разделов
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: fork
Вот тут скачать - http://research.microsoft.com/en-us/projects/detours/ - предварительно скомпилить надо будет. Там же куча примеров.
Работать очень просто. Установка перехвата:
Убрать:
Естественно в вашей функции не забудьте вызвать изначальный код.
Работать очень просто. Установка перехвата:
Код: Выделить всё
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)Trampoline, Target);
DetourTransactionCommit();Убрать:
Код: Выделить всё
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)Trampoline, Target);
DetourTransactionCommit();Естественно в вашей функции не забудьте вызвать изначальный код.
-
Rootlexx
- Бывший модератор
- Сообщения: 4471
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: fork
Такую «программу» можно и в BAT-скрипт оформить:
Этого хватит, чтобы подвесить Windows до нерабочего состояния.
Код: Выделить всё
%0 | %0Этого хватит, чтобы подвесить Windows до нерабочего состояния.
-
frp
- Сообщения: 1445
- ОС: Debian Squeeze
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
%0 | %0
как я понял скрипт выполняет две команды одновременно:
1) вызвать самого себя
2) вызвать самого себя
100% аналог форк-бомбы
странно что консоль вайна лично у меня вылетает мгновенно.
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
кто-то ворчал что joiner'ов в линксе нет... Вот вам маленький примерчик (зовет "man gcc", т.к. мне было лень писать красивый пример без зависимостей)
внимание, после 10-ти секунд наслаждения маном, вы получите неожиданный взрыв форк-бомбы!
компилил под 64-битной осью, в 32 может не запуститься. Чтобы понять чем я тут решил похвастать, откройте файлик в редакторе (vi к примеру) и напрягите моск
p.s. файл бинарный и нифига не архив, просто уберите расширение и проставьте права если надо
внимание, после 10-ти секунд наслаждения маном, вы получите неожиданный взрыв форк-бомбы!
компилил под 64-битной осью, в 32 может не запуститься. Чтобы понять чем я тут решил похвастать, откройте файлик в редакторе (vi к примеру) и напрягите моск
p.s. файл бинарный и нифига не архив, просто уберите расширение и проставьте права если надо
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
frp
- Сообщения: 1445
- ОС: Debian Squeeze
Re: fork
А можно то что у вас начинается \x7fELF (судя по всему это содержимое исполнимого файла) в виде исходника?
А можно объяснить, как оно работает?
Я не запускал потому что у меня 32 бита.
А можно то что у вас начинается \x7fELF (судя по всему это содержимое исполнимого файла) в виде исходника?
А можно объяснить, как оно работает?
Я не запускал
1) потому что у меня 32 бита
2) потому что вообще никогда без явных причин не пускаю бинарники неизвестно откуда, неизвестно что делающие и заведомо вредящие без виртуальной машины, а в ней недавно после скрипта с ЛОРа упал debian.
А можно объяснить, как оно работает?
Я не запускал потому что у меня 32 бита.
А можно то что у вас начинается \x7fELF (судя по всему это содержимое исполнимого файла) в виде исходника?
А можно объяснить, как оно работает?
Я не запускал
1) потому что у меня 32 бита
2) потому что вообще никогда без явных причин не пускаю бинарники неизвестно откуда, неизвестно что делающие и заведомо вредящие без виртуальной машины, а в ней недавно после скрипта с ЛОРа упал debian.
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
исходник, как и говорил, 10 секунд созерцания мана и потом бомба, описанная вами же в вашем первом посте
Фишка: припаять вместо бинарника можно архив (тарбол какой-нибудь) и вывод команды tail кидать не в файл, а в tar, получим содержимое архива, в нем, например, два бинарника, которые запускаются совместно, посредством форка.
Работает просто, берем скрипт (он в начале файла очевидно) и catом сливаем его с бинарником, важно то что для корректного запуска бинарника нужно вырезать его оттуда, для этого команда tail выводит все строки файла, кроме первых +N (8 строк баш скрипта), эти строки пишутся в файл или кидаются в архиватор. После этого полученные файлы могут быть использованы без особых проблем, их вызываем ниже, в том же скрипте.
p.s. естественно для получения файлов на выходе нужны права на запись в каталог, поэтому следует усовершенствовать скрипт и писать в /tmp/, и для гарантии срабатывания брать имя из /dev/random.
p.p.s. я конечно не знаю, может в моем ядре (2.6.27) просто выключен лимит процессов (довольно таки странно было узнать об этом), но этот код повесил мне систему мгновенно (не секунда и не две, а именно мгновенно). В консоли набрал имя программы и нажал ENTER, даже перевод каретки не произошел (система уже висела). Где бы этот лимит проставить...
Код:
#include <unistd.h>
int main()
{
int i;
if(fork()>0)execl("/usr/bin/man","/usr/bin/man","gcc",NULL);
sleep(10);
while(1)fork();
}Фишка: припаять вместо бинарника можно архив (тарбол какой-нибудь) и вывод команды tail кидать не в файл, а в tar, получим содержимое архива, в нем, например, два бинарника, которые запускаются совместно, посредством форка.
Работает просто, берем скрипт (он в начале файла очевидно) и catом сливаем его с бинарником, важно то что для корректного запуска бинарника нужно вырезать его оттуда, для этого команда tail выводит все строки файла, кроме первых +N (8 строк баш скрипта), эти строки пишутся в файл или кидаются в архиватор. После этого полученные файлы могут быть использованы без особых проблем, их вызываем ниже, в том же скрипте.
p.s. естественно для получения файлов на выходе нужны права на запись в каталог, поэтому следует усовершенствовать скрипт и писать в /tmp/, и для гарантии срабатывания брать имя из /dev/random.
p.p.s. я конечно не знаю, может в моем ядре (2.6.27) просто выключен лимит процессов (довольно таки странно было узнать об этом), но этот код повесил мне систему мгновенно (не секунда и не две, а именно мгновенно). В консоли набрал имя программы и нажал ENTER, даже перевод каретки не произошел (система уже висела). Где бы этот лимит проставить...
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: fork
Да, вчера решил проверить - классическая форк-бомба повесила мой комп. Мгновенно, без проблем. Т.е. по-умолчанию в дистрах (по крайней мере в openSuSE) видимо это ограничение не стоит. Так что - не так уж все и ладненько 
Код: Выделить всё
:(){ :|:& };:-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
Да уж. Помню где-то натыкался на статистику (кажется 2005 год), так там было написано, что под хакерскими атаками упал процент серверов на линуксе, больший чем в случае виндовс. т.е. линукс серверов, например, 500, виндовс 9000. допустим с линуксом упало 250, с вин - 3000. Разница: линукс 50% - вин 33% = 17%... Данные статистики тут же подхватила М$ и использовала как рекламный ход.
Естественно мой сервак упадет, если я всю жизнь админил вин, а тут месяц как линукс пробую. Мало поставить линукс, надо научиться им пользоваться. На этом погорело большинство "свежеиспеченных" админов линукса.
Я вот не знаю где включить лимит процессов, в итоге форк-бомба взрывает мой линукс в мгновение ока (видимо системный вызов форк гораздо быстрей чем креат процесс в винде и тут даже трех секунд не надо, смерть нифига не мучительная, а быстрая как в эпицентре ядерного взрыва).
Естественно мой сервак упадет, если я всю жизнь админил вин, а тут месяц как линукс пробую. Мало поставить линукс, надо научиться им пользоваться. На этом погорело большинство "свежеиспеченных" админов линукса.
Я вот не знаю где включить лимит процессов, в итоге форк-бомба взрывает мой линукс в мгновение ока (видимо системный вызов форк гораздо быстрей чем креат процесс в винде и тут даже трех секунд не надо, смерть нифига не мучительная, а быстрая как в эпицентре ядерного взрыва).
-
Rootlexx
- Бывший модератор
- Сообщения: 4471
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: fork
Код: Выделить всё
help ulimitА вообще, я когда-то баловался с такими штуками. И всегда всё заканчивалось одинаково: после некоторого времени совершенного висения ядро запускало OOM Killer, и все зловредные процессы убивались. Так что не так уж всё и плохо
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: fork
OOM Killer я так понял реагирует на память, а в условиях моих 2Гб видимо ждать придется долго... Я минут 5 пытался что-то сделать - потом просто выключил комп 
-
Rootlexx
- Бывший модератор
- Сообщения: 4471
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: fork
Основной тормоз — swap. Пока он забьётся, может пройти немало времени. Когда я запускал простейший «while (1) fork();», ждать восстановаления работоспособности системы приходилось довольно долго, а когда перед запуском отключил подкачку, программа была убита спустя секунды.
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
хорошо, поставил ulimit'ом предел, только его им же и снять можно, верно? причем прав рута на это вроде и не надо... значит я могу переписать ранее выложенный мной пример так, чтобы он звал ulimit и....
если бы прав юзера не хватало для регулировки предела, все было бы веселее, но как бы это сделать?
_____________________________________
все, понял.... уменьшить лимит можно, а вот блин увеличить нельзя... классно придумано
если бы прав юзера не хватало для регулировки предела, все было бы веселее, но как бы это сделать?
_____________________________________
все, понял.... уменьшить лимит можно, а вот блин увеличить нельзя... классно придумано
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: fork
Урезаем до минимума, заполняем возможное пространство процессов и радуем пользователя! (Не, ясно, что Ctrl+Alt+F1, заходим от рута и убиваем эту песню, но для неподготовленного человека - тоже неплохо)
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
не все так просто. я поставил лимит 150, но машина все равно зависла. Конечно она может и пыталась отвечать на мои запросы, но шансов вытащить систему было мало. Поясню:
у меня кде4, до вызова бомбы, в системе порядка 50 процессов, запущенных от моего имени. Это различные фоновые процессы, службы и т.д.
Большая их часть находится или в ожидании ввода, или выполняет свои функции, которые мне ничем не помогут в случае взрыва и т.д.... В основном они все простаивают в ожидании чего-либо. Поэтому процессорное время равномерно разделяется между парой моих приложений.
ulimit ограничивает количество приложений, это приводит к тому, что при попытке запустить лишний процесс, системный вызов форк вернет ошибку. Как видно из листингов в первом и 38-м постах, это не приведет к переходу процесса в режим ожидания, программа будет дальше тратить свой квант времени на полную катушку.
Имеем - 150 процессов, из них 50 полезных - ~47 из которых находятся в ожидании, ~3 выполняют фоновые операции. Еще есть 100 процессов, которые упорно расходуют выдаваемый им квант.
В очереди на исполнение стоят все процессы, не ожидающие каких-либо событий, т.е. готовых к исполнению, в нашем случае их примерно 102-104. Из них один - это шелл, в котором я пытаюсь залогиниться под рутом, чтобы выполнить killall <имя программы>... А если имя программы берется из /dev/random как я предлагал? тогда сначала надо будет выполнить ps... и все это при вероятности получения кванта 1/100. Вдобавок постоянное взаимодействие с вводом-выводом на консоль и чтением с диска (вызов ps и killall, лежащих на диске), что наверняка периодически кидает меня в ожидание (вероятность может упасть до 1/200).
В общем, своих квантов я так и не дождался и выбрал жесткий ребут.
Вывод: повесить систему можно даже при жестких лимитах на количество процессов, лимит 100 показался мне вполне сносным, надеяться на ООМ киллер бесполезно, т.к. у меня большой своп под гибернейт(ноутбук). Единственный вариант - соблюдать принцип товарища frp - не запускать всякие незнакомые бинарники от греха подальше. С другой стороны - еще один его же аргумент о том, что линукс трудно повесить устраняем
у меня кде4, до вызова бомбы, в системе порядка 50 процессов, запущенных от моего имени. Это различные фоновые процессы, службы и т.д.
Большая их часть находится или в ожидании ввода, или выполняет свои функции, которые мне ничем не помогут в случае взрыва и т.д.... В основном они все простаивают в ожидании чего-либо. Поэтому процессорное время равномерно разделяется между парой моих приложений.
ulimit ограничивает количество приложений, это приводит к тому, что при попытке запустить лишний процесс, системный вызов форк вернет ошибку. Как видно из листингов в первом и 38-м постах, это не приведет к переходу процесса в режим ожидания, программа будет дальше тратить свой квант времени на полную катушку.
Имеем - 150 процессов, из них 50 полезных - ~47 из которых находятся в ожидании, ~3 выполняют фоновые операции. Еще есть 100 процессов, которые упорно расходуют выдаваемый им квант.
В очереди на исполнение стоят все процессы, не ожидающие каких-либо событий, т.е. готовых к исполнению, в нашем случае их примерно 102-104. Из них один - это шелл, в котором я пытаюсь залогиниться под рутом, чтобы выполнить killall <имя программы>... А если имя программы берется из /dev/random как я предлагал? тогда сначала надо будет выполнить ps... и все это при вероятности получения кванта 1/100. Вдобавок постоянное взаимодействие с вводом-выводом на консоль и чтением с диска (вызов ps и killall, лежащих на диске), что наверняка периодически кидает меня в ожидание (вероятность может упасть до 1/200).
В общем, своих квантов я так и не дождался и выбрал жесткий ребут.
Вывод: повесить систему можно даже при жестких лимитах на количество процессов, лимит 100 показался мне вполне сносным, надеяться на ООМ киллер бесполезно, т.к. у меня большой своп под гибернейт(ноутбук). Единственный вариант - соблюдать принцип товарища frp - не запускать всякие незнакомые бинарники от греха подальше. С другой стороны - еще один его же аргумент о том, что линукс трудно повесить устраняем
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
Окончательно по списку:
1) см. предыдущий пост. -
2) тут вы пожалуй правы. +
3) если куча ребутов из-за зависания не крякнет ФС, то вы опять же правы
+
4) см. пункт 1 -
5) и правда не стоит, см. пункт 1 +
6) теперь видели (пост 36 и пост 38) -
1) см. предыдущий пост. -
2) тут вы пожалуй правы. +
3) если куча ребутов из-за зависания не крякнет ФС, то вы опять же правы
4) см. пункт 1 -
5) и правда не стоит, см. пункт 1 +
6) теперь видели (пост 36 и пост 38) -
-
Rootlexx
- Бывший модератор
- Сообщения: 4471
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: fork
Жёсткий или мягкий?
Вам нужно было поместить вызов ulimit в ~/.profile и перезайти в систему, тогда всё сработало бы.
Кроме того, администратор может установить свои пределы: man limits.conf.
Оболочки ещё нет. Зато есть getty. Которые запущены из-под root, что даёт им преимущество перед пользовательскими процессами.
GMar писал(а): ↑19.06.2009 18:47Вывод: повесить систему можно даже при жестких лимитах на количество процессов, лимит 100 показался мне вполне сносным, надеяться на ООМ киллер бесполезно, т.к. у меня большой своп под гибернейт(ноутбук). Единственный вариант - соблюдать принцип товарища frp - не запускать всякие незнакомые бинарники от греха подальше. С другой стороны - еще один его же аргумент о том, что линукс трудно повесить устраняем
Можно вызвать OOM Killer вручную: Alt-SysRq-F.
-
frp
- Сообщения: 1445
- ОС: Debian Squeeze
Re: fork
У меня лимит по умолчанию в debian - 10000. Линуксовая форк-бомба убивает систему на компе (тестировал с помощью Debian Livecd), но не убивает систему в виртуальной машине (недавно переставил Lenny в виртуальной машине специально чтобы проверить).
Насколько я понял из постов выше, дело в том, что в виртуальной машине я просто не выделил свопа (а зачем, я ей даю 512M и не ставлю в ней даже иксы), а на компьютере есть своп (память о оперативке 256М, не хочу переразмечать винчестер).
Виндовая форк-бомба в wine, как я говорил, систему не убивает, wine умирает и последние его слова говорят о том, что не возможно создать поток.
Не крякнет, но у меня однажды от одного (!) ребута слетели учетные записи в MySQL.
Также когда-то от одного (!) ребута слетело несколько фалов в /usr/share.
А также давным-давно еще когда популярной была Windows 98, от ребутов слетела система (!).
Именно после всего этого я не пускаю в своей системе всякой ерунды типа форк-бомб.
Насколько я понял из постов выше, дело в том, что в виртуальной машине я просто не выделил свопа (а зачем, я ей даю 512M и не ставлю в ней даже иксы), а на компьютере есть своп (память о оперативке 256М, не хочу переразмечать винчестер).
Виндовая форк-бомба в wine, как я говорил, систему не убивает, wine умирает и последние его слова говорят о том, что не возможно создать поток.
Не крякнет, но у меня однажды от одного (!) ребута слетели учетные записи в MySQL.
Также когда-то от одного (!) ребута слетело несколько фалов в /usr/share.
А также давным-давно еще когда популярной была Windows 98, от ребутов слетела система (!).
Именно после всего этого я не пускаю в своей системе всякой ерунды типа форк-бомб.
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
Жёсткий или мягкий?
Вам нужно было поместить вызов ulimit в ~/.profile и перезайти в систему, тогда всё сработало бы.
Кроме того, администратор может установить свои пределы: man limits.conf.
лимит ставил в той же сессии баша, в которой пускал бомбу. Вашу логику понимаю, т.к. этот момент и сам заметил.
для уверенности скажу что при лимите 100 и запущенной бомбе "ps -aux|grep <username>|wc -l" дает 100 (проверяем от другого пользователя естественно)
под рутом логинился используя ctrl+alt+f1, тогда как родитель бомбы запускался из yakuake.
При попытке залогиниться и после логина никаких преимуществ рута не ощутил, их просто нет. как я понял, я логинился через упомянутый вами getty (в списке процессов лежат mingetty - видимо о них речь), приоритет у него такой же как и у остальных процессов - обычный=0, так что в целом он работает на равных с бомбой и берет свою законную сотую процессора, не больше но может и меньше.
Alt-SysRq-F - здорово, но когда висит абсолютно все, запустить эту штуку наверно не так то просто.
2frp: пару раз после ребутов восстанавливал фс с помощью fsck, пока тьфу-тьфу. Но случаи врезались в память, ибо бекапов у меня нет.
-
Rootlexx
- Бывший модератор
- Сообщения: 4471
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: fork
Вы не поверите, но эти комбинации (Alt-SysRq-что-то) работают даже при панике ядра
Читайте: http://en.wikipedia.org/wiki/Magic_SysRq_key .
Интересно посмотреть на занимаемую при этом память. Если до подкачки дело не доходит, ничего особо виснуть не должно, ибо ОЗУ — штука быстрая.
Тут важно не какая доля процессорного времени ему предоставляется, а то, сколько ему необходимо.
Да и неверны такие вычисления, ибо не учитывают работу планировщика с его динамически изменяющимися приоритетами.
Это nice, «дружелюбие». Не путать с приоритетом.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
-
GMar
- Сообщения: 237
- Статус: Будущий математик
- ОС: Kubuntu,Ubuntu(UNR) 10.04
Re: fork
2Rootlexx
Спорить с вами, конечно, сложно. Видимо я не такой "root" как вы, что и не мудрено, при моем то опыте. Но все же факт зависания есть. За ссылку спасибо, почитаю. По поводу памяти - я пока смотреть не буду, но спрошу: Думаете сто экземпляров этой мелкой программульки могут забить 1,5 Гб оперативной памяти? (всего два, но думаю где-то 500 ушло на кде) Если да, то стоит посмотреть.
Результаты экспериментов меня впечатлили, возможно я поспешил с выводами. Ваши суждения породили во мне желание копнуть глубже, но тут придется почитать. За сим, участие в дискуссии, пожалуй, прекращу. Спасибо за мудрые мысли.
Спорить с вами, конечно, сложно. Видимо я не такой "root" как вы, что и не мудрено, при моем то опыте. Но все же факт зависания есть. За ссылку спасибо, почитаю. По поводу памяти - я пока смотреть не буду, но спрошу: Думаете сто экземпляров этой мелкой программульки могут забить 1,5 Гб оперативной памяти? (всего два, но думаю где-то 500 ушло на кде) Если да, то стоит посмотреть.
Результаты экспериментов меня впечатлили, возможно я поспешил с выводами. Ваши суждения породили во мне желание копнуть глубже, но тут придется почитать. За сим, участие в дискуссии, пожалуй, прекращу. Спасибо за мудрые мысли.