- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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 04.06.2020 21:14 # +1
bormand 04.06.2020 21:23 # 0
Это с какой версии такой изврат можно делать? Пиздец, почему просто локалку не заполнить над вызовом?
3.14159265 04.06.2020 21:30 # 0
bormand 04.06.2020 21:34 # 0
3.14159265 04.06.2020 21:40 # 0
https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
bormand 04.06.2020 21:44 # 0
3.14159265 04.06.2020 21:46 # 0
А ещё питушение с longjmp.
TEH3OPHblu_nemyx 04.06.2020 21:45 # 0
https://govnokod.ru/24763#comment429753
В «gcc» его можно поймать с помощью __builtin_frame_address(0).
bormand 04.06.2020 21:48 # 0
Т.е. со всякими защитами от нарушения control flow этот код несовместим? Заебись фича. Хуже были только гццшные "лямбды", которые вообще исполняемый стек требовали.
3.14159265 04.06.2020 21:49 # +1
> Хуже были только гццшные "лямбды", которые вообще исполняемый стек требовали.
Лолчто???
bormand 04.06.2020 21:51 # +1
3.14159265 04.06.2020 21:53 # +1
Можно же просто насрать в стек своим юзер-инпут говном, а потом порушить всё нахуй.
TEH3OPHblu_nemyx 04.06.2020 21:59 # +1
https://govnokod.ru/13183
https://govnokod.ru/13162
https://govnokod.ru/23505
Ещё где-то было.
TEH3OPHblu_nemyx 04.06.2020 22:13 # +1
https://govnokod.ru/19017
В 64-битном «MSVC» нет встроенного асма. Что предложил автор примера? Он предложил положить мышиного кота в строковую инициализированную переменную и снять атрибут «no execute» у страниц, в которые попало это значение.
bormand 04.06.2020 22:15 # +1
TEH3OPHblu_nemyx 04.06.2020 22:17 # 0
TEH3OPHblu_nemyx 04.06.2020 22:18 # 0
bormand 04.06.2020 22:25 # +1
TEH3OPHblu_nemyx 04.06.2020 22:26 # 0
bormand 04.06.2020 22:37 # 0
TEH3OPHblu_nemyx 04.06.2020 22:40 # 0
gost 04.06.2020 23:38 # 0
TEH3OPHblu_nemyx 04.06.2020 23:52 # 0
gost 05.06.2020 00:15 # 0
guest8 05.06.2020 03:18 # −999
TEH3OPHblu_nemyx 05.06.2020 03:29 # 0
В «Windows» поддержка «DEP» появилась в «Висте», но по дефолту была отключена для пользовательских программ, потому что с «DEP» старое говно может не работать.
Удобной настройка исключений «DEP» в «Windows» стала, когда появилось средство «EMET»:
https://en.wikipedia.org/wiki/Enhanced_Mitigation_Experience_Toolkit
P.S. А, он про ядро, а не про юзерспейс.
TEH3OPHblu_nemyx 05.06.2020 03:33 # 0
guest8 05.06.2020 03:44 # −999
bormand 05.06.2020 05:37 # +1
А реально прижали всех к стенке на десятке когда HVCI запилили, насколько я помню.
TEH3OPHblu_nemyx 05.06.2020 06:24 # 0
P.S. Нагуглил:
https://docs.microsoft.com/en-us/windows/security/threat-protection/device-guard/enable-virtualization-based-protection-of-code-integrity
Его ещё в старых билдах не было... Как всё сложно...
bormand 05.06.2020 06:27 # 0
TEH3OPHblu_nemyx 05.06.2020 06:29 # 0
bormand 05.06.2020 06:31 # 0
gost 05.06.2020 13:33 # +1
UPD: оказывается, минус второе — это «System Management Mode».
bormand 05.06.2020 13:49 # +1
gost 05.06.2020 14:04 # 0
MAKAKA 05.06.2020 14:48 # 0
gost 05.06.2020 15:08 # 0
guest8 05.06.2020 15:48 # −999
gost 05.06.2020 16:16 # +1
Гипервизор, например, считается минус первым кольцом, «SMM» — минус вторым, «Intel ME» — минус третьим. Однако, повторюсь, это больше эмпирическое разделение по принципу «кольцо N имеет произвольный доступ к кольцам N+i, кольцо N не может влиять на кольца N-i больше дозволенного этими кольцами». Что именно считать отрицательным «кольцом» — вопрос философский. Физический мир, например, можно записать в минус четвёртое: компьютер может влиять на окружающую среду только через строго определённые механизмы, в то время как окружающая среда может воздействовать на компьютер как угодно.
guest8 05.06.2020 16:28 # −999
gost 05.06.2020 16:40 # +1
«Технические» кольца (по крайней мере, в «x86») определены строго: через CPL. «Философские кольца», в свою очередь, чисто эмпирические: все просто договорились считать гипервизор минус первым кольцом, например. С тем же успехом его можно записать в минус десятое (SMM — -11, etc.), от этого смысл не изменится.
guest8 05.06.2020 16:40 # −999
gost 05.06.2020 16:50 # +1
guest8 05.06.2020 16:51 # −999
gost 05.06.2020 16:56 # 0
TEH3OPHblu_nemyx 05.06.2020 15:14 # 0
SMM (минус второе кольцо) точно был на всех 80486, а также на каких-то 80386, только он, кажется, раньше не был документирован, кто-то случайно раскрыл опкод для переключения в SMM.
guest8 05.06.2020 15:51 # −999
guest8 05.06.2020 13:30 # −999
TEH3OPHblu_nemyx 04.06.2020 21:54 # +1
В «gcc» вложенные функции работают как замыкания, захватывая все локальные переменные и аргументы родительской функции.
Зачем-то добавили фичу: на вложенную функцию можно взять указатель. Чтобы по этому указателю вложенную функцию можно было вызвать, придумали «трамплины»: это такой короткий код, который передаёт вызываемому замыканию указатель на контекст. Так вот авторы не придумали ничего лучше, чем создавать этот трамплин в стеке. Поэтому со всех страницы стека приходится снимать атрибут «no execute», иначе трамплин не вызовется.
guest8 05.06.2020 03:10 # −999
TEH3OPHblu_nemyx 05.06.2020 03:25 # 0
https://man.openbsd.org/mprotect.2
Кажется, в юзверьском коде такого ограничения нет.
guest8 05.06.2020 03:42 # −999
TEH3OPHblu_nemyx 05.06.2020 04:22 # 0
MAKAKA 05.06.2020 18:46 # 0
PHP ставится в другой раздел (/usr/local/), не является частью базовой системы, и потому может хоть все страницы пометить как RWX, всем насрать.
Тео и Ко гарантируют безопасность и безбажность только базовой системы. Охуилон портов всякого говна они, разумеется, не могут проверить.
guest8 05.06.2020 03:49 # −999
TEH3OPHblu_nemyx 05.06.2020 04:23 # 0
Noodles 05.06.2020 18:44 # +3
PS. я джва года жду такой шеллкод.
bormand 06.06.2020 12:16 # +1
guest8 05.06.2020 03:19 # −999
Noodles 05.06.2020 17:33 # 0
Вроде обычный C99.
guest8 05.06.2020 18:49 # −999
Noodles 05.06.2020 19:05 # 0
guest8 05.06.2020 19:10 # −999
Noodles 05.06.2020 19:59 # +1
в ТВОЕМ ПРИМЕРИ МОЖЕТ БЫТЬ НА СТЕКЕ, ЛИБО В СЕКЦИИ С КОНСТАНЦИЯМИ, ЛЕНЬ ИСКАТЬ В СТОНДАРТЕ. я, СОБСНО, ИСПОЛЬЗОВАЛ ЭТУ ФИЧУ С ГЛОБАЛЬНЫМИ КОНСТАНТАМИ, КОГДА СВЯЗНЫЕ СПИСКИ СТРОИЛ, ЧТОБЫ НЕ ДЕЛАТЬ ЛИШНИХ ОБЪЯВЛЕНИЙ.
guest8 05.06.2020 20:03 # −999
gost 05.06.2020 20:05 # 0
AMEPuKAHCKuu_xyu 04.06.2020 22:33 # 0
> gc.h
Дальше не читал, но поорал.
Это как с conio
Noodles 05.06.2020 17:36 # 0
guest8 04.06.2020 22:57 # −999
guest8 04.06.2020 23:33 # −999
j123123 06.06.2020 05:43 # 0
https://en.wikipedia.org/wiki/Justine_Tunney
Categories: ... Transgender and transsexual computer programmers
j123123 06.06.2020 05:45 # 0
guest8 06.06.2020 05:48 # −999
bormand 06.06.2020 10:13 # +1
Разрабом безымянным
Которому реквестов
Никто не заведёт
Теперь я трансоняшка
Мне каждая дворняжка
При встрече сразу
Лапу подает!
TEH3OPHblu_nemyx 06.06.2020 07:37 # 0
Noodles 06.06.2020 10:06 # 0
bormand 06.06.2020 10:08 # 0
TEH3OPHblu_nemyx 06.06.2020 10:19 # 0
bormand 06.06.2020 10:35 # 0
TEH3OPHblu_nemyx 06.06.2020 10:48 # 0
А есть ещё процессоры с переключателем набора инструкций типа «ARM» или «NEC V20»?
bormand 06.06.2020 10:52 # 0
gost 06.06.2020 11:16 # 0
TEH3OPHblu_nemyx 06.06.2020 11:44 # 0
TEH3OPHblu_nemyx 06.06.2020 10:23 # 0