- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
#include "gc.h"
static bool PointerNotOwnedByParentStackFrame(struct StackFrame *frame,
struct StackFrame *parent,
void *ptr) {
return !(((intptr_t)ptr > (intptr_t)frame) &&
((intptr_t)ptr < (intptr_t)parent));
}
/**
* Adds destructor to garbage shadow stack.
*
* @param frame is passed automatically by wrapper macro
* @param fn takes one argument
* @param arg is passed to fn(arg)
* @return arg
*/
void __defer(struct StackFrame *frame, void *fn, void *arg) {
struct StackFrame *frame2;
if (!arg) return;
frame2 = __builtin_frame_address(0);
assert(frame2->next == frame);
assert(PointerNotOwnedByParentStackFrame(frame2, frame, arg));
if (append(&__garbage, /* note: append() not included */
(&(const struct Garbage){frame->next, (intptr_t)fn, (intptr_t)arg,
frame->addr})) != -1) {
frame->addr = (intptr_t)&__gc;
} else {
abort();
}
}
3.14159265 # 0
bormand # 0
Это с какой версии такой изврат можно делать? Пиздец, почему просто локалку не заполнить над вызовом?
3.14159265 # 0 ⇈
bormand # 0 ⇈
3.14159265 # 0 ⇈
https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
bormand # 0 ⇈
3.14159265 # 0 ⇈
А ещё питушение с longjmp.
TEH3OPHblu_nemyx # 0 ⇈
https://govnokod.ru/24763#comment429753
В «gcc» его можно поймать с помощью __builtin_frame_address(0).
bormand # 0 ⇈
Т.е. со всякими защитами от нарушения control flow этот код несовместим? Заебись фича. Хуже были только гццшные "лямбды", которые вообще исполняемый стек требовали.
3.14159265 # 0 ⇈
> Хуже были только гццшные "лямбды", которые вообще исполняемый стек требовали.
Лолчто???
bormand # 0 ⇈
3.14159265 # 0 ⇈
Можно же просто насрать в стек своим юзер-инпут говном, а потом порушить всё нахуй.
TEH3OPHblu_nemyx # 0 ⇈
https://govnokod.ru/13183
https://govnokod.ru/13162
https://govnokod.ru/23505
Ещё где-то было.
TEH3OPHblu_nemyx # 0 ⇈
https://govnokod.ru/19017
В 64-битном «MSVC» нет встроенного асма. Что предложил автор примера? Он предложил положить мышиного кота в строковую инициализированную переменную и снять атрибут «no execute» у страниц, в которые попало это значение.
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
gost # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
gost # 0 ⇈
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
В «Windows» поддержка «DEP» появилась в «Висте», но по дефолту была отключена для пользовательских программ, потому что с «DEP» старое говно может не работать.
Удобной настройка исключений «DEP» в «Windows» стала, когда появилось средство «EMET»:
https://en.wikipedia.org/wiki/Enhanced_Mitigation_Experience_Toolkit
P.S. А, он про ядро, а не про юзерспейс.
TEH3OPHblu_nemyx # 0 ⇈
guest # 0 ⇈
Драйверы все таки подписанные, да они и так могут всё сломать
bormand # 0 ⇈
А реально прижали всех к стенке на десятке когда HVCI запилили, насколько я помню.
TEH3OPHblu_nemyx # 0 ⇈
P.S. Нагуглил:
https://docs.microsoft.com/en-us/windows/security/threat-protection/device-guard/enable-virtualization-based-protection-of-code-integrity
Его ещё в старых билдах не было... Как всё сложно...
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
bormand # 0 ⇈
gost # 0 ⇈
UPD: оказывается, минус второе — это «System Management Mode».
bormand # 0 ⇈
gost # 0 ⇈
MAKAKA # 0 ⇈
gost # 0 ⇈
guest # 0 ⇈
>CPL
Расшифруй мне пожалуйста выделенную жирным букву
gost # 0 ⇈
Гипервизор, например, считается минус первым кольцом, «SMM» — минус вторым, «Intel ME» — минус третьим. Однако, повторюсь, это больше эмпирическое разделение по принципу «кольцо N имеет произвольный доступ к кольцам N+i, кольцо N не может влиять на кольца N-i больше дозволенного этими кольцами». Что именно считать отрицательным «кольцом» — вопрос философский. Физический мир, например, можно записать в минус четвёртое: компьютер может влиять на окружающую среду только через строго определённые механизмы, в то время как окружающая среда может воздействовать на компьютер как угодно.
guest # 0 ⇈
Формально SMM, Hypervisor, и кстати v86, не являются "кольцами", хотя суть у них та же.
Привилегии виртуализировать ресурсы, привилегии обрабатывать чужие ошибки, привелегии прерывать чужой код
gost # 0 ⇈
«Технические» кольца (по крайней мере, в «x86») определены строго: через CPL. «Философские кольца», в свою очередь, чисто эмпирические: все просто договорились считать гипервизор минус первым кольцом, например. С тем же успехом его можно записать в минус десятое (SMM — -11, etc.), от этого смысл не изменится.
guest # 0 ⇈
Ты предлагаешь не считать кольцом то, чей номер не может быть записан в CPL?
gost # 0 ⇈
guest # 0 ⇈
gost # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
SMM (минус второе кольцо) точно был на всех 80486, а также на каких-то 80386, только он, кажется, раньше не был документирован, кто-то случайно раскрыл опкод для переключения в SMM.
guest # 0 ⇈
Через SMM комп пыталась поломать Йоанна Рутковская
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
В «gcc» вложенные функции работают как замыкания, захватывая все локальные переменные и аргументы родительской функции.
Зачем-то добавили фичу: на вложенную функцию можно взять указатель. Чтобы по этому указателю вложенную функцию можно было вызвать, придумали «трамплины»: это такой короткий код, который передаёт вызываемому замыканию указатель на контекст. Так вот авторы не придумали ничего лучше, чем создавать этот трамплин в стеке. Поэтому со всех страницы стека приходится снимать атрибут «no execute», иначе трамплин не вызовется.
guest # 0 ⇈
Лямблия просто онанимная функция. Она может зохватывать кого-то, а может и не зохватывать.
Замыкание же всегда зохватывает, но может быть и не онанимной.
> Поэтому со всех страницы стека приходится снимать атрибут «no execute»
М-да, в base-system OpenBSD бы вас не приняли: там W^X
TEH3OPHblu_nemyx # 0 ⇈
https://man.openbsd.org/mprotect.2
Кажется, в юзверьском коде такого ограничения нет.
guest # 0 ⇈
А с этим ключиком тебе не дадут запуситься, если FS не прикручена со спец ключом. А ключ не стоит у раздела с base system.
Таким образом, в base system такого кода быть не может
TEH3OPHblu_nemyx # 0 ⇈
MAKAKA # 0 ⇈
PHP ставится в другой раздел (/usr/local/), не является частью базовой системы, и потому может хоть все страницы пометить как RWX, всем насрать.
Тео и Ко гарантируют безопасность и безбажность только базовой системы. Охуилон портов всякого говна они, разумеется, не могут проверить.
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
Noodles # 0 ⇈
PS. я джва года жду такой шеллкод.
bormand # 0 ⇈
guest # 0 ⇈
Эти люди еще над SEH смеялись.
Noodles # 0 ⇈
Вроде обычный C99.
guest # 0 ⇈
Noodles # 0 ⇈
guest # 0 ⇈
Видимо потому, что vc не умеет c'99.
А где будет создаваться структура, кстати? на стеке мейна, просто неявно?
Noodles # 0 ⇈
в ТВОЕМ ПРИМЕРИ МОЖЕТ БЫТЬ НА СТЕКЕ, ЛИБО В СЕКЦИИ С КОНСТАНЦИЯМИ, ЛЕНЬ ИСКАТЬ В СТОНДАРТЕ. я, СОБСНО, ИСПОЛЬЗОВАЛ ЭТУ ФИЧУ С ГЛОБАЛЬНЫМИ КОНСТАНТАМИ, КОГДА СВЯЗНЫЕ СПИСКИ СТРОИЛ, ЧТОБЫ НЕ ДЕЛАТЬ ЛИШНИХ ОБЪЯВЛЕНИЙ.
guest # 0 ⇈
Помню, что оно не умеет VLA, лол.
Да, если оно const, то наверное можно его в константы, а иначе наверное на стеке.
В общем неождианно, что такое есть в си, но правда удобно
gost # 0 ⇈
AMEPuKAHCKuu_xyu # 0
> gc.h
Дальше не читал, но поорал.
Это как с conio
Noodles # 0 ⇈
guest # 0
Белый, белый, белый си, снится мне ночами.
Белый, белый, белый пи, анскильные птицы.
Белый, белый, белый си, мне ночами снится.
guest # 0
Вореции такие сложные
Только ты не пушишь никому
Ждёшь ты только стека, стека, стека
j123123 # 0
https://en.wikipedia.org/wiki/Justine_Tunney
Categories: ... Transgender and transsexual computer programmers
j123123 # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
Разрабом безымянным
Которому реквестов
Никто не заведёт
Теперь я трансоняшка
Мне каждая дворняжка
При встрече сразу
Лапу подает!
TEH3OPHblu_nemyx # 0 ⇈
Noodles # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
bormand # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
А есть ещё процессоры с переключателем набора инструкций типа «ARM» или «NEC V20»?
bormand # 0 ⇈
gost # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈