[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Вопросы по созданию пакета.



30.09.2012 18:27, Andrey Rahmatullin пишет:
> On Sun, Sep 30, 2012 at 06:04:15PM +0400, "Артём Н." wrote:
>>>>>>>>>> Кстати, а hardening (например, проверка стека) сильно влияет на производительность?
>>>>>>>>> stackprotector - вряд ли заметно, pie - да на i386, остальное скорее вообще никак.
>>>>>>>> Да, а на не 64-битных не влияет? Почему? Разве есть какие-то кардинальные отличия?
>>>>>>> PIC/PIE занимает один регистр, который на i386 очень мало.
>>>>>> Если не хватает регистров, он использует стэк?
>>>>> Зависит.
>>>>> Обычно наоборот, если есть свободные регистры, туда можно сунуть локальные
>>>>> переменные вместо стека.
>>>> В смысле, для вычисления адресов, при использовании PIE используется много
>>>> регистров, а если они заняты, компилятору приходится гонять данные между стеком
>>>> и регистрами. Потому на x86 и тормозит, а в x64 добавили регистры, так что их
>>>> там хватает. Так?
>>> Хм, я сейчас нашёл, что на amd64 и каких-нибудь других архитектурах вообще
>>> не занимается регистр, т.к. достаточно уметь адресацию через %rip. На i386
>>> да, всегда занят один регистр, там лежит адрес GOT.
>> Хм... Так таблица смещений всё-равно должна быть, независимо от архитектуры?
> Да, без дополнительного indirection (как это по-русски) не обойтись никак,
> но на это какие-то совсем незначительные расходы.
> 
>> И, кстати, по-идее, PE базонезависимы, поскольку есть таблица релокаций, а ELF -
>> нет (насколько я понял, PIE - это независимость от адреса загрузки образа)?
> Я не в курсе, что происходит с DLL, если RVA недоступен, и так ли же это
> затратно
Корректировка абсолютных адресов при загрузке. Просто загрузчик патчит адреса,
указанные в таблице перемещаемых элементов (если таблица имеется). Патчит
немного по-хитрому, но не сложно(перемещаемый элемент, вроде, состоит из двух
частей). А конкретно я не помню. Но сводится всё к тому, чтобы добавить или
отнять дельту вшитого в PE базового адреса и реального адреса загрузки.

> как в non-PIC ELF (Дреппер намекает, что это дизайн ELF
> виноват). Пишут, впрочем, что на x86_64 в PE тоже PIC.  PIC/PIE это
> независимость от адреса загрузки образа, да.
Я только что начал читать что есть PIE (но пока ещё статья в очереди):
http://www.securitylab.ru/analytics/278480.php
Он отличается от базонезависимости. Для PE это называется PIC. И отличие в том,
что при использовании релокаций, корректировка производится на этапе загрузки -
загрузчиком, а при использовании PIE, компилятор строит файл без обращений по
абсолютным адресам (вроде бы, но меня всё-таки это смущает, так что почитаю статью).
Пока мне не очень понятно зачем это нужно, если возможно полагаться на загрузчик.


Reply to: