The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"В состав OpenBSD-Current добавлен механизм защиты RETGUARD"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от opennews (ok) on 07-Июн-18, 09:15 
В состав компилятора Clang, используемого для сборки базовой системы OpenBSD, интегрирован (http://undeadly.org/cgi?action=article;sid=20180606064444) механизм защиты RETGUARD, нацеленный на усложнение выполнения эксплоитов, построенных с использованием заимствования кусков кода (https://ru.wikipedia.org/wiki/%D0%92%D0%...) и приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming).
Механизм включен только при сборке для архитектуры AMD64.

Суть метода защиты RETGUARD заключается в искажении адреса возврата обработчиков функций. Перед началом обработчика функции добавляется вызов XOR, комбинирующий адрес возврата со случайным значением Cookie, которое затем сохраняется в стек. Перед командой возврата управления из функции (ret) значение Cookie извлекается из стека и при помощи операции XOR повторно применяется к адресу возврата, что восстанавливает его исходное значение и позволяет убедиться в том, что адрес перехода не изменился. Для усложнения атак код проверки дополнительно снабжается добавочным заполнением в виде инструкций int03 перед каждой инструкцией ret.

При штатном ходе выполнения изначальный адрес перехода остаётся неизменен, но при выполнении эксплоита осуществляется   переход на составляющий эксплоит блок заимствованных машинных инструкций (гаджет), точка входа в который как правило не совпадает с началом функции. Так как управление передано не на начало, а в определённую часть тела функции, первый "xor" будет пропущен и "xor" перед выходом исказит переданный эксплоитом адрес возврата. При защите функций ядра RETGUARD оценивается как эффективный для блокирования 50% из всех ROP-гаджетов и 15% уникальных гаджетов, по сравнению с ядром OpenBSD 6.3.


Метод реализован в виде патча к компилятору clang, который на этапе компиляции производит автоматическую подстановку кода проверки адреса возврата во все функции. Для функций системной библиотеки и ядра, написанных на языке ассемблер, требуется применение отдельных патчей. Для активации нового метода защиты в приложениях не требуется отдельных действий, достаточно (https://www.openbsd.org/faq/current.html#r20180606) пересобрать их предлагаемым в базовой системе OpenBSD-Current компилятором Clang, в который уже включены все необходимые патчи. Для отключения сборки с RETGUARD в Clang добавлена опция "-fno-ret-protector".

Напомним, что техника заимствования кусков кода  используется для эксплуатации переполнений буфера в условиях, когда в страницах памяти стека и буфера установлен запрет на исполнение кода. Для организации выполнения кода атакующего в таких условиях логика выполнения shell-кода формируется с использованием методов возвратно-ориентированного программирования (ROP) -  атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися в загруженных библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления (как правило, это окончания библиотечных функций).  Работа эксплоита сводится к построению цепочки вызовов подобных блоков ("гаджетов") для получения нужной функциональности. Для автоматизации выявления гаджетов применяются специальные инструменты (https://github.com/JonathanSalwan/ROPgadget/). Используя готовые блоки  машинных инструкций (гаджеты) можно организовать достаточно сложные операции, в том числе организовать работу условных операторов и циклов.

URL: http://undeadly.org/cgi?action=article;sid=20180606064444
Новость: https://www.opennet.dev/opennews/art.shtml?num=48730

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +4 +/
Сообщение от Crazy Alex (ok) on 07-Июн-18, 09:15 
Что-то ни в этой, ни в предыдущей новости не видать ни оценок падения производительности, ни ссылок на таковые. Вроде там не много совсем, но, во-первых, это только одна из "фишек для безопасности" (а сколько в сумме - ещё вопрос), во-вторых - "вроде" - это какая-то не слишком точная оценка.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Нанобот (ok) on 07-Июн-18, 11:04 
ну, это же openbsd... между безопасностью и производительностью они выбирают безопасность (в разумных пределах,я надеюсь)
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

7. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  –3 +/
Сообщение от A.Stahl (ok) on 07-Июн-18, 11:19 
А кому это важно? Это как потребление топлива болидами Формулы 1: вроде бы и важно, но по факту всех интресует лишь сколько прёт. Так и БСД: просто полигон для экспериментов.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

12. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +7 +/
Сообщение от Аноним (??) on 07-Июн-18, 15:38 
>по факту всех интресует лишь сколько прёт

Ты эту Формулу-1 хоть раз смотрел? Там трассы не настолько прямые, как твои извилины, чтобы всех "интересовало лишь сколько прёт".

Так и тут. OpenBSD - инструмент, и важно знать его сильные и слабые стороны.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

28. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  –1 +/
Сообщение от тигарэтоя on 08-Июн-18, 10:09 
про извилину было мощно, нажал плюсик:-)
Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

21. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +1 +/
Сообщение от бедный буратино (ok) on 08-Июн-18, 07:00 
> Это как потребление топлива болидами Формулы 1

вааще-то это самый важный параметр - не больше 100 кг, а дальше крутись, как хошь - делай, какой хошь (в рамках регламента) двигатель, лишь бы в 100 кг укладывался

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

11. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +2 +/
Сообщение от Аноним (??) on 07-Июн-18, 15:23 
Вы, должно быть, троллите: о каком падении производительности может идти речь, когда после входа и перед выходом из функции добавляется по паре машинных инструкций? Это сложность возрастает на константу.
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

15. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +1 +/
Сообщение от имя on 07-Июн-18, 19:45 
>  Вы, должно быть, троллите: о каком падении производительности может идти речь, когда после входа и перед выходом из функции добавляется по паре машинных инструкций? Это сложность возрастает на константу.

Вы, должно быть, троллите: о каком возрастании на константу может идти речь в, например, цикле с read()?

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

39. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Анонимный Аноним on 10-Июн-18, 17:55 
в каждую функцию добавляются следующие инструкции:

    mov r11, [cookie]
    xor r11, [rsp]
    ...
    xor r11, [rsp]
    cmp r11, [cookie]
    jeq 2
    int 3
    int 3
    ret

В случае с циклическим чтением, это добавит около 5 "лишних", но быстрых машинных инструкций. Грубо говоря 5 тактов, если считать, как считали для 80486. Сейчас это намного быстрее

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

25. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от PereresusNeVlezaetBuggy (ok) on 08-Июн-18, 09:28 
> Что-то ни в этой, ни в предыдущей новости не видать ни оценок
> падения производительности, ни ссылок на таковые. Вроде там не много совсем,
> но, во-первых, это только одна из "фишек для безопасности" (а сколько
> в сумме - ещё вопрос), во-вторых - "вроде" - это какая-то
> не слишком точная оценка.

В ближайшее время, думаю, тов. Мортимер выступит где-нибудь с докладом на эту тему. Предыдущая версия того, что было закоммичено, имела потери в рантайме примерно 2%, плюс ещё примерно 4% на запуск. Компиляция тормозилась примерно на 5%.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

26. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от bOOster (ok) on 08-Июн-18, 09:33 
Видимо на 1С или Perl или и иже с ними программер?

знаешь что такое в ассемблере ТАКТОВ на инструкцию? Так вот сложи, в худшем случае тактов на пихание SALT в стек, в лучшем передача SALT в функци. через регистры, ну и тактов на инструкцию XOR при выходе.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

35. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от КО on 09-Июн-18, 07:54 
> Так вот сложи, в худшем случае тактов на пихание SALT в стек, в лучшем передача SALT в функци. через регистры

Самое забавное, что описываемые Вами действия нужны только для атаки на алгоритм защиты. Ибо по условиям атаки, атакующий может писать в стек (и регистры), но не может создавать страницы с кодом. Таким образом он может подделать и адрес возврата и число по которому надо ксорить (например 0).
А просто два ксора адреса возврата по константе (которую бы неплохо инициализировать при загрузки библиотеки в память) это сущие копейки. Ибо на современном этапе главные тормоза - это лишние обращения в память (промахи в кеше).

Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

38. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Анонимный Аноним on 10-Июн-18, 17:54 
Он может изменить код только в новых страницах. Загруженные из файла страницы кода не модифицируемы. Эта защита была еще лет 15-20 назад
Ответить | Правка | ^ к родителю #35 | Наверх | Cообщить модератору

3. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним (??) on 07-Июн-18, 09:41 
В новости не разъяснено, генерируется ли cookie на этапе компиляции или во время исполнения. И если во время исполнения, то используется ли безопасный ГПСЧ. И если используется, то насколько падает производительность.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним (??) on 07-Июн-18, 09:48 
На этапе компиляции конечно. Генерация на лету была бы излишним усложнением и замедлением. Представляйте сколько нужно выполнить кода для генерации псевдослучайного числа?
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним (??) on 07-Июн-18, 10:12 
Там в каком то примере просто использовалось значение esp/rsp (оно для эксплоита не известно, вычисляется в процессе выполнения)
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

9. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним (??) on 07-Июн-18, 13:36 
Ну в таком случае что мёртвому припарка, только вредная: оверхед то даёт. Атакующий просто вытащит из метода захардкоденный cookie и положит на стэк.
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

10. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним84701 (ok) on 07-Июн-18, 14:40 
> Атакующий просто вытащит из метода захардкоденный cookie и положит на стэк.

Однако, чтобы "просто" вытащить и "просто" положить на стек для успешного RЕТа, нужно таки выполнить свой код. А для этого (по крайней мере, в сценариях, для которых и задумывался RETGUARD) придется успешно "РЕТнуть".

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

16. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Sw00p aka Jerom on 08-Июн-18, 01:47 
Во-первых, должно быть наличие баги (да, да - вот вам и успешный РЕТ), во-вторых, РОП для того и придуман, чтобы обходить ограничения не исполняемых (ридонли) сегментов памяти (стек, в случае его переполнения), строится цепочка стек фреймов (РОП геджетов) и происходит эксплуатация.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

20. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним84701 (ok) on 08-Июн-18, 03:12 
> Во-первых, должно быть наличие баги (да, да - вот вам и успешный РЕТ),
> во-вторых, РОП для того и придуман, чтобы обходить ограничения не исполняемых (ридонли) сегментов памяти (стек, в случае его переполнения), строится цепочка стек фреймов (РОП геджетов) и происходит эксплуатация.

Это те же кексы,  вид сбоку (+ индивидуальные для каждой функции). Т.е. и защита как раз от таких багов, при которых перезаписывается адрес возврата. Для того, чтобы (в первый раз) успешно RETнуть, нужно не просто перезаписать RET адрес своим, но и угадать, с каким значением его нужно  поXORить, причем конкретно для этого вот блока кода.
Ну и снижение общего количества возможных гаджетов тоже, как пишут, есть.

Если бага из другой разновидности, типа "call/jmp [foo_replaced_addr]", то и обходить сабж, как бы, не нужно.
Ваш Кэп.

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

32. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Sw00p aka Jerom on 08-Июн-18, 16:04 
Так суть механизма RETGUARD, не от закрытия каких-то багов, а от предотвращения дальнейшей эксплуатации бага (того же переполнения стека). А так если даже предотвращается эксплуатация, но никак не защитит от DOS и приведёт в любом случае к падению приложения. Если имеется возможность как-то получить результат ксора, то легко можно вычислить ту самую куку, которая непонятно когда вычисляется (формируется) на этапе компиляции или в рантайме, одна ли она для всех ретурнов или разная, и внизу в коментах задали наводящий вопрос - а как валидируется потом реальный адресс возврата (хотя его валидация не важна, приложение будет падать при "хер пойми ретурн адресе", а что когда он неожиданно укажет на валидное место?). Доказано - РОП идеальный механизм, которому нужно противодействовать только, как я думаю, попыткой переосмысления всей Фоннеймановской архитектуры, как минимум вынести хранения адресов возврата из стека куда нить в другое место :)
Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

17. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним (??) on 08-Июн-18, 01:49 
Если значение захардкодено, то вытащить из скачанного пакета не проблема.

>положить на стек для успешного RЕТа, нужно таки выполнить свой код.

чтобы работало rop, нужно положить на стек. а это типа митигация от ропа.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

19. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +1 +/
Сообщение от Sw00p aka Jerom on 08-Июн-18, 01:58 
> чтобы работало rop, нужно положить на стек. а это типа митигация от
> ропа.

так уже всё в стеке при наличие баги о чём речь? роп - техника обхода так называемого не исполняемого стека.


Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

13. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от КО on 07-Июн-18, 17:06 
>На этапе компиляции конечно. Генерация на лету была бы излишним усложнением и замедлением.

Да ладно - вон адреса при загрузки в память меняют, так что еще одну константу рандомизировать ...

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

22. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +1 +/
Сообщение от PereresusNeVlezaetBuggy (ok) on 08-Июн-18, 09:19 
> В новости не разъяснено, генерируется ли cookie на этапе компиляции или во
> время исполнения. И если во время исполнения, то используется ли безопасный
> ГПСЧ.

Во время исполнения. При загрузке программы для каждой функции генерируется персональная кука. С ГПСЧ у OpenBSD всё давно хорошо: https://www.openbsd.org/papers/hackfest2014-arc4random/index...

> И если используется, то насколько падает производительность.

Сборка базовой системы на предпоследней версии патча замедлялась примерно на 11% (результаты авторские, не мои), из них:

2% рантайм (то, что всем интересно)
4% запуск (из-за нагрузки на ГПСЧ)
5% компиляция + всё остальное

Тод Мортимер (основной автор) обещал попробовать ещё что-то подкрутить, подробностей пока нет.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

29. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Crazy Alex (ok) on 08-Июн-18, 11:37 
Ну вот. Существенно хуже, чем я ожидал, кстати.
Ответить | Правка | ^ к родителю #22 | Наверх | Cообщить модератору

30. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от PereresusNeVlezaetBuggy (ok) on 08-Июн-18, 11:40 
> Ну вот. Существенно хуже, чем я ожидал, кстати.

SSP обычная на момент внедрения отъедала около 5% в рантайме (правда, SSP, в отличие от retguard, используется не для всех функций), так что могло быть и хуже. :)

Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

8. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от ляликс on 07-Июн-18, 12:33 
в апстрим добавят этот патч? надеюсь...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Аноним (??) on 07-Июн-18, 17:32 
Я первый раз слышу про RETGUARD. Читая вот это:

> Суть метода защиты RETGUARD заключается в искажении адреса возврата обработчиков функций. Перед началом обработчика функции добавляется вызов XOR, комбинирующий адрес возврата с генерируемым для каждой функции случайным значением Cookie, которое затем сохраняется в стек. Перед командой возврата управления из функции (ret) значение Cookie извлекается из стека и при помощи операции XOR повторно применяется к адресу возврата, что восстанавливает его исходное значение и позволяет убедиться в том, что адрес перехода не изменился. Для усложнения атак код проверки дополнительно снабжается добавочным заполнением в виде инструкций int03 перед каждой инструкцией ret

возникло несколько вопросов:

вопрос №1: насколько сложно изменить значение cookie?
вопрос №2: как после второго XOR для восстановления происходит валидация неизменности адреса возврата?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

18. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Sw00p aka Jerom on 08-Июн-18, 01:52 
> вопрос №2: как после второго XOR для восстановления происходит валидация неизменности
> адреса возврата?

а вот это никого не волнует)) если пихать в роп гаджетах разные адреса возвратов, то при ксоре получется адрес возврата "хер пойми куда" и произойдёт, что? сегфолт? а если по вероятности адрес после ксора укажет куда нужно, что тогда?

добавлю ещё один вопрос - кука одна на один процесс?


Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

24. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от PereresusNeVlezaetBuggy (ok) on 08-Июн-18, 09:24 
>> вопрос №2: как после второго XOR для восстановления происходит валидация неизменности
>> адреса возврата?
> а вот это никого не волнует)) если пихать в роп гаджетах разные
> адреса возвратов, то при ксоре получется адрес возврата "хер пойми куда"
> и произойдёт, что? сегфолт? а если по вероятности адрес после ксора
> укажет куда нужно, что тогда?

Значит, не повезло. Retguard — не серебряная пуля; как и классическая SSP эта мера эффективна только вместе с другими, суммарно увеличивая сложность эскалации атаки на многие порядки.

> добавлю ещё один вопрос - кука одна на один процесс?

Одна на каждую функцию, генерится при запуске программы.

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

23. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +1 +/
Сообщение от PereresusNeVlezaetBuggy (ok) on 08-Июн-18, 09:22 
> Я первый раз слышу про RETGUARD. Читая вот это:
>> Суть метода защиты RETGUARD заключается в искажении адреса возврата обработчиков функций. Перед началом обработчика функции добавляется вызов XOR, комбинирующий адрес возврата с генерируемым для каждой функции случайным значением Cookie, которое затем сохраняется в стек. Перед командой возврата управления из функции (ret) значение Cookie извлекается из стека и при помощи операции XOR повторно применяется к адресу возврата, что восстанавливает его исходное значение и позволяет убедиться в том, что адрес перехода не изменился. Для усложнения атак код проверки дополнительно снабжается добавочным заполнением в виде инструкций int03 перед каждой инструкцией ret
> возникло несколько вопросов:
> вопрос №1: насколько сложно изменить значение cookie?

Она живёт в read-only памяти.

> вопрос №2: как после второго XOR для восстановления происходит валидация неизменности
> адреса возврата?

Естественным путём: если в результате XOR получилась фигня, то мы и улетим в результате ret фиг знает куда. При широком (64-битном) адресном пространстве это практически наверняка будет не туда, куда хотел атакующий.

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

36. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от КО on 09-Июн-18, 16:39 
>значением Cookie, которое затем сохраняется в стек.
>>Она живёт в read-only памяти.

ну, пожалуй, read-only stack _действительно_ защитит от возвратного программирования, но при таком подходе печенки излишни. :)

Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

37. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от PereresusNeVlezaetBuggy (ok) on 10-Июн-18, 15:14 
>>значением Cookie, которое затем сохраняется в стек.
>>>Она живёт в read-only памяти.
> ну, пожалуй, read-only stack _действительно_ защитит от возвратного программирования,
> но при таком подходе печенки излишни. :)

А кто сказал, что эта кука лежит на стеке? Она лежит в памяти по некоему ASLR-нотому адресу. Чтобы утащить куку, да ещё от нужной функции, нужно сделать то, для чего и нужно утащить куку, причём не обрушив программу — при следующем запуске процесса куки будут уже другие. Это не обычный SSP, где куку можно утащить со стека простым чтением за границами буфера.

Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

40. "В состав OpenBSD-Current добавлен механизм защиты RETGUARD"  +/
Сообщение от Анонимный Аноним on 10-Июн-18, 17:57 
Патчу уже около года: https://marc.info/?l=openbsd-tech&m=150317547021396&w=2
Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру