Как стать автором
Обновить

Комментарии 8

Чтобы надежно использовать эту уязвимость, нужно между вызовами запрещать прерывания — а это уже выход из песочницы :) Однако, нужно ждать патча рантайма, который будет обнулять регистровые пары перед возвратом из fastcall-метода.
А что, собственно, Вы хотели увидеть? Сделайте объекты разной внутренней структуры, с разным количеством полей и разным количеством виртуальных методов — такой фейерверк начнётся, что огого! А если это скрестить с финализатором — так вообще // удачной отладки!
В статье был реализован аналог union С++, который дважды был инициализирован через разные поля. Поскольку типы нетривиальные, то они неизбежно имеют указатель на таблицу методов — vtable. Для стандарте C++ такая ситуация регламентирована чётко: undefined behavior.
Переписывание с адаптацией под синтаксис C# привёл ровно к такому же результату.
А с какого перепугу у нас загрузился тип со взаимным перекрытием двух полей ссылочных типов?
Благодаря аццкому костылю в виде атрибута StructLayout

Не такой уж он и "аццкий", просто использовать его нужно с умом. Для интеропа и экономии памяти в узких местах он играет важную роль.

5: mov eax, [eax+0x28]

Пятая строка содержит сдвиг регистра eax на 40 байт

Сдвиг регистра на IA32/AMD64 осуществляется инструкциями shl, shr и им подобными, аналог в языках с си-подобным синтаксисом — <<, >>.
В процитированной пятой строке — загрузка значения из памяти по адресу eax + 0x28

Имелось в виду смещение (offset), а не сдвиг (shift). Не стоит придираться к словам настолько.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации