1.83K subscribers
3.3K photos
132 videos
15 files
3.57K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Forwarded from Lenix
Коллеги, добрый день
Решили поделиться опытом фаззинга dhcp сервера с помощью фаззера nyx-net. Перед нами стояла задача пофаззить dnsmasq, причём функционал, отвечающий за dhcp сервер. Мы решили, что данная цель хорошо подходит для того, чтобы потренироваться фаззингу клиент-серверных приложений с сохранением состояния (Crusher, AFLNet, StateAFL, SGFuzz). Мы давно хотели попробовать запустить [SGFuzz](https://github.com/bajinsheng/SGFuzz), но он к сожалению работает только с tcp протоколами, а dhcp протокол работает на udp. Поэтому сначала мы решили попробовать запустить AFLNet.

Fuzzing dnsmasq with AFLNet
AFLNet - это graybox фаззер, который позволяет тестировать имплементацию протоколов в сетевых серверах или клиентах. AFLNet выступает в качестве клиента, отправляя серверу смутированные пакеты. При этом фаззер учитывает не только покрытие кода тестируемого проекта, но и его состояние. Состояние сервера определяется с помощью кода возврата в ответе от сервера (например, код 200 в HTTP протоколе). При этом в качестве начального корпуса фаззер использует записанные с помощью tcpdump (или другой утилиты для захвата сетевого трафика) пакеты.
Таким образом, AFLNet пытается обеспечить максимальную имитацию реальных условий использования целевой программы. Ведь фаззить сетевое приложение с помощью стандартных подходов зачастую оказывается довольно сложно, так как какую-нибудь отдельную функцию сложно выделить из приложения из-за глобального состояния сервера. Поэтому в некоторых случаях настройка фаззинга сетевого приложения с помощью AFLNet является в разы проще чем стандартными фаззерами (AFL++, LibFuzzer).
Но к сожалению, у AFLNet есть большой недостаток - скорость фаззинга:
- AFLNet передаёт пакеты по сети, что довольно медленно в условиях фаззинга.
- AFLNet использует задержку по времени для инициализации сервера. То есть AFLNet ждёт определённое количество времени для инициализации сервера прежде чем отправить пакет.
- AFLNet использует задержку по времени чтобы дождаться ответа от сервера. То есть фаззер будет просто ждать некоторое время ответа от сервера и если ответа не поступило, то только после истечения этого таймаута фаззер завершит сессию.
Всё это приводит к очень низкой скорости фаззинга (в наших условиях было ~10 запусков в секунду).

Fuzzing dnsmasq with nyx-net
Мы решили посмотреть, какие существуют альтернативы AFLNet, которые позволяют нам решить перечисленные проблемы. Нас заинтересовал инструмент nyx-net. Nyx-Net - это snapshot based graybox фаззер, основанный на фаззере nyx. Использование снепшотов для фаззинга позволяет решить озвученные проблемы:
- nyx-net подменяет общение по сети на работу с shared memory. Этот механизм используется не только для увеличения скорости доставки тесткейса до целевой программы, но и для определения состояния сервера (например, сервер готов к считыванию пакета).
- nyx-net отслеживает вызовы чтения и записи в сетевой сокет. Таким образом, фаззер создаст базовый снепшот (root snapshot) перед вызовом функции для чтения из сокета. В дальнейшем при фаззинге фаззер будет откатываться до этого базового снепшота, чтобы начать новую сессию. Такой метод позволяет избежать задержки по времени при инициализации серевера.
- nyx-net создаёт возрастающие (incremental) снепшоты. То есть после отправки нескольких пакетов фаззер может сделать снепшот и потом откатываться уже до этого состояния, а не до базового снепшота. Таким образом, фаззеру не нужно воспроизводить цепочку пакетов, чтобы исследовать, как ведёт себя сервер в открытом состоянии при получении новых пакетов.
Но к сожалению, в nyx-net не было реализовано функции для подмены вызова recvmsg(), которая используется в dnsmasq для чтения сообщения и дополнительной информации из сокета. Поэтому мы написали свой патч, который эмулирует работу этого вызова, и отправили его разработчикам.
Таким образом, у нас получилось увеличить скорость фаззинга dnsmasq с помощью Nyx-Net примерно в 450 раз по сравнению с AFLNet. Поэтому рекомендуем добавить этот фаззер в свой набор инструментов.
👍4🔥1
Блог*
Временами нужная std::iter::repeat_n. В отличие от repeat(x).take(n) может не клонировать на последней итерации.
🔸...Но чуть менее нужная, поскольку Take<Repeat<T>> и Take<RepeatWith<T>> теперь реализуют ExactSizeIterator, а Take<Repeat<T>> ещё и DoubleEndedIterator
BTW я в документации заметил это:

This is very similar to using repeat() with Iterator::take(), but there are two differences:

* repeat_n() can return the original value, rather than always cloning.
* repeat_n() produces an ExactSizeIterator.


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

Как оказалось, я не один такой умный — другой человек менее чем через час прислал PR с абсолютно идентичным диффом. Конечно, он его потом закрыл, как дубликат.
😁10👍3🫡1
Поздравляю с Тыквенным Спасом
🎉94🫡2❤‍🔥1
Forwarded from АЙТИАЧ 💻🌴 (Кирилл В)
Четверть кода! Программист не нужон! Мы кнопочку ткнем "сделать заебись", а нейросеть достроит нам... И вот запрос превращается! И вот запрос превращается... Запрос превращается в...

actually the word 'strawberry' has two 'R's in it
😁10
#prog #rust #rustlib

walkdir — кросс-платформерная библиотека для рекурсивного обхода директорий от Andrew Gallant aka Burntsushi.

use walkdir::WalkDir;

for entry in WalkDir::new("foo").min_depth(1).max_depth(3) {
println!("{}", entry?.path().display());
}


Библиотека умеет обнаруживает циклы символьных ссылок и сообщать в этих случаях об ошибке.

Небольшое неудобство заключается в том, что .filter() на итераторе не будет предотвращать заход в пропущенные директории, для этого нужно на итераторе вызвать .filter_entry(). Пример из документации для пропуска скрытых файлов на *nix-системах:

use walkdir::{DirEntry, WalkDir};

fn is_hidden(entry: &DirEntry) -> bool {
entry.file_name()
.to_str()
.map(|s| s.starts_with("."))
.unwrap_or(false)
}

for entry in WalkDir::new("foo")
.into_iter()
.filter_entry(|e| !is_hidden(e)) {
println!("{}", entry?.path().display());
}
👍9❤‍🔥4
В СМЫСЛЕ УЖЕ НОЯБРЬ
😭10
😁12🤬2
🤣11😁4💯1
😁11🫡3
Forwarded from Сталингулаг
Группа «Алиса» перенесла три концерта тура «Гойда», потому что билеты плохо продаются.

Кажется, у нас досрочный победитель в номинации новостной заголовок года
😁22🌚1
Круглый дурак — это тот, кто записывает кружочки в телеге
👍15👎4😁4💩4🌚21
Forwarded from Install Wizard
🌚15👍41
Решившему зарегистрироваться в реестре Роскомнадзора блогеру прислали повестку в военкомат

Автор телеграм-канала «Духи наизнанку» Кирилл Хайкин подал заявку на включение в реестр блогеров и всего через шесть часов получил повестку в военкомат с требованием пройти призывную комиссию, рассказал сам Хайкин.

«За меня не волнуйтесь, я окончил военную кафедру», — отметил он, обращаясь к своим подписчикам. При этом блогер уточнил, что произошедшее может быть совпадением.
🌚11
Хотите трюк с поиском статей, которые не находятся на sci-hub/nexus? Нигде не встречал упоминания этого способа, а он, бывает, помогает в самых отчаянных случаях.

Если написать в гугле дорк
filetype:pdf


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

filetype:pdf "doi.org/10.1038/s41586-022-05278-9"


пользуйтесь)
16🥰5🤯3👍2🔥1🌚1
😁29🤷4💩1🌚1