Кошачьи бредни
СтатистикаЧто-то на хардкорном и не очень. Связь: @daniil159x Чат: https://t.me/+DwW49h-jfZM2NzZi
- Последний пост
- 4 апр.
- Последнее чтение
- ещё не заходили
- Постов за неделю
- 0
- Всего постов
- 20
- Тип
- открытый
- Язык
- русский
- В каталоге с
- 13 авг.
- 1/24сутки в ленте
- —
- 1/48двое суток
- —
- 1/72трое суток
- —
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
Тип struct{} в GoLang Структура — это набор полей. Размер структуры определяется размерами полей и выравниванием между ними. Но если никаких полей нет, то какой будет размер у структуры? Вот в C++ размер такой структуры будет равен одному байту (в стандарте прописано nonzero), а вот в #golang он равен нулю. И это удобно: 🔴пустая структура не требует аллокаций 🔴godoc.org/github.com/bradfitz/iter =) 🔴канал пустых структур — это просто сигнальный канал 🔴мапа map[T]struct{} оказывается сетом В общем, dave.cheney.net/2014/03/25/the-empty-struct Если размер пустой структуры равен нулю, то будет ли у переменной такого типа адрес? Да, будет, причём один для всех: go.dev/play/p/e-zHP1SVrCA. var a, b struct{} fmt.Printf("%p\n", &a) // 0x5a4c40 fmt.Printf("%p\n", &b) // 0x5a4c40 И это адрес глобальной переменной runtime.zerobase. Чем грозит одинаковая адресация? А тем, что в коде выше нельзя различить переменные a и b, даже если упаковать их в интерфейс: var a, b struct{} m := make(map[any]int) m[any(&a)] = 1 m[any(&b)] = 2 fmt.Printf("%v\n", m) // map[0x5a5c40:2] Спека нам говорит:Two interface values are equal if they have identical dynamic types and equal dynamic values or if both have value nil. То есть, вот так переменные будут различимы: type Pupupu struct{} var a, b struct{} var c Pupupu m := make(map[any]int) m[any(&a)] = 1 m[any(&b)] = 2 m[any(&c)] = 3 fmt.Printf("%v\n", a == c) // true // fmt.Printf("%v\n", &a == &c) // mismatched types *struct{} and *Pupupu fmt.Printf("%v\n", m) // map[0x5a5c80:3 0x5a5c80:2] Поэтому при использовании интерфейсов для идентификации объектов пустые структуры могут сломать логику. Вычислить засланца можно так: func IsZeroSized(val any) bool { t := reflect.TypeOf(val) if t == nil { return false } if t.Kind() == reflect.Pointer || t.Kind() == reflect.Slice { t = t.Elem() } return t.Comparable() && t.Size() == 0 } Ещё у пустой структуры есть вот такие инкарнации: 🤨 make([]struct{}) — такой слайс пустых структур любого размера будет ссылаться на тот же runtime.zerobase. При этом ничего не аллоцируется, и именно на таком слайсе основана библиотека bradfitz/iter 🤔 [0]int — массив нулевой длины любого типа. Его свойства можно наблюдать в тесте go/test/zerosize.go 🫥 любые аллокации нулевого размера 🗣 ещё парочка кейсов, которые можно найти через поиск по репе гошки
без подписи
без подписи
без подписи
без подписи
Компьютерных угроз пост Недавно посмотрел запись доклада "Бесконечная война в памяти: ретроспектива методов защиты от бинарных угроз" с последнего хайлоада. Рассказывают, какие существуют проблемы с памятью, какие придумали митигации и какие у этих митигаций проблемы. Рекомендую посмотреть, когда он выйдет, а пока можно чекнуть презентацию. Также существует сайт хактрикс про пентест и безопасность, где собрано гигантское количество полезной информации с тулами: методологии, линукс, винда, мак, мобилки, нетворкинг, веб и пывн. И на соседнем поддомене есть хактрикс клауд про кубер и ci/cd. (Надо бы почаще заглядывать туда и скроллить содержимое) Ну и конечно генштаб — MITRE матрицы: для линукса, винды, контейнеров и всё в одном. Ещё есть перевод от позитивов. Кидайте в коммах ваши интересные источники 😈 #pentest #pwn #collection #linux
Авторские врайтапы на T-CTF 25 В этом году мне выпала честь делать таски на этот CTF. Всего сделал 3 таска: капитолий, капибассейн и капибудильник. Капитолий был демо таском и для него делали онлайн разбор, пост выше. Капибассейн был из категории easy и был в обеих лигах. В нём давался исходник, бот его компилировал и запускал. Игрокам надо было починить компиляцию и достать флаг. Оригинальный врайтап живёт в гитхабе: tctf-25/basin/README.md. Помимо описанного решения игроки нашли опцию -wrapper, которая оборачивает вызов компилятора, получали RCE на момент компиляции и не находили new_secret.txt. Не находили резонно, ибо как часто вы компилируете и запускаете на проде?) Флаг с секретом лежал рядом с бинарём во время запуска. Поэтому игроки, шедшие через -wrapper, всячески патчили или подменяли main бинарь. Капибудильник давали только в лиге "безопасников" и он представлял из себя таск на повышение привилегий и побег из chroot'а. Таск вдохновлен этим постом, где схожая уязвимость была в ftp демоне в 1998 году. Врайтап лежит тут: tctf-25/buzzer/README.md #ctf #linux #writeups
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи
без подписи