Eugene
Это, возможно, лучше в чате по винапи спросить
Это что за чат? @pro_windows ? Там разве апи обсуждают?
Eugene
https://t.me/pro_winapi/47199
Eugene
Салют! При включённом ASLR какой максимальный базовый адрес основного PE-образа для 32-битного процесса генерируется? Посмотрел через Process Explorer, все адреса ниже 0x01000000 (и кратны 64К). Но, может, просто совпадение или для разных версий ОС будут разные пределы?
disba1ancer
Ну как же? На образ тоже распространяется.
нет, если в нём нет релокаций
s54820
Салют! При включённом ASLR какой максимальный базовый адрес основного PE-образа для 32-битного процесса генерируется? Посмотрел через Process Explorer, все адреса ниже 0x01000000 (и кратны 64К). Но, может, просто совпадение или для разных версий ОС будут разные пределы?
Да, всё так. 64к — этo allocation granularity (одновременно нижний лимит, потому что по 0 грузиться нельзя), и у тебя есть 8 рандомизируемых бит для 32-битного .exe (биты 16-23). Получаем как раз 0x10000 * 256 = 0x01000000.
Eugene
нет, если в нём нет релокаций
Так, кто ж делает ASLR без релокаций?
Vadim Yegorov
у меня собес в одну фирму по производству микрочипов на позицию секьюрити ресерчера
Vadim Yegorov
подскажите пожалуйста материалы по Hardware Security
Vadim Yegorov
я так понимаю уязвимости мне надо находить не в коде для чипов, а в архитектуре самих чипов (ARM), наподобие Meltdown/Spectre
s54820
Т.е. рандомизируются только 8 бит? А что со стеком и хипом?
Давай лучше так (раздел 2, самое начало): https://www.blackhat.com/presentations/bh-dc-07/Whitehouse/Paper/bh-dc-07-Whitehouse-WP.pdf Что там в новых версиях винды, я не знаю. Помню, что в 64 битах сделали /HIGHENTROPYVA.
Vadim Yegorov
что учат инженеры SoC работающие в AMD, Qualcomm, и тд?
Vadim Yegorov
Verilog? 😁
Vadim Yegorov
понял, а по безопасности чипов есть литература?
Vadim Yegorov
или её ещё не написали
s54820
Да, всё так. 64к — этo allocation granularity (одновременно нижний лимит, потому что по 0 грузиться нельзя), и у тебя есть 8 рандомизируемых бит для 32-битного .exe (биты 16-23). Получаем как раз 0x10000 * 256 = 0x01000000.
А я не прав. Попробовал в W7. Там, конечно, 8 бит, но вот только диапазон 0x400000-0x800000 пропускается, и из-за этого оно вылезает за пределы 0x1000000. Точнее, всё зависит от родной базы. Если она будет выше 0x01000000, то и рандомизировать оно будет выше, но по-прежнему будет пропускать родную базу и ещё некоторый кусок.
Aiwan \ (•◡•) / _bot
Как понимать текст с зачёркиванием?
изменил мнение, исправил неправоту, ликвидировал неточности, но для истории оставил оригинал ошибки
Eugene
изменил мнение, исправил неправоту, ликвидировал неточности, но для истории оставил оригинал ошибки
Я не спрашиваю зачем зачеркнул же. Спрашиваю, как такой текст понимать теперь.
disba1ancer
Так, кто ж делает ASLR без релокаций?
А кто сказал, что для aslr обязательно двигать сам бинарник?
Eugene
А кто сказал, что для aslr обязательно двигать сам бинарник?
Наворотить, конечно, много чего можно. Но обычно так и делается.
bilka00
Есть CreateFileMapping
Он не может память/в память, только файл в память.
disba1ancer
Наворотить, конечно, много чего можно. Но обычно так и делается.
Я редко видел бинарники с pic (кроме либ), собственно релоки будут только с pic, поскольку релоки это некоторые тормоза, как можно в таком случае aslr для бинарники включить я даже не знаю
disba1ancer
Он не может память/в память, только файл в память.
Для памяти в память это просто аллокация
Eugene
Я редко видел бинарники с pic (кроме либ), собственно релоки будут только с pic, поскольку релоки это некоторые тормоза, как можно в таком случае aslr для бинарники включить я даже не знаю
В x64 проблем с PIC вообще нет, ибо доступна адресация RIP. В x86 тоже можно релоками всё сделать. Скомпиль простой код чем хочешь (VC++, G++, Clang) #include <iostream> int main() { std::cout << main << std::endl; } Увидишь разные адреса (не при каждом запуске, но после каждой компиляции точно). Хотя в PE везде ImageBase = 0x400000.
Eugene
У MS link, к примеру, есть опции /DYNAMICBASE /FIXED:NO, которые по умолчанию именно в этом состоянии находятся.
disba1ancer
Что не считается?
Рандомизация при компиляции это такой себе aslr
Eugene
Рандомизация при компиляции это такой себе aslr
Я тебя не понимаю. Как она может быть ДО компиляции?
disba1ancer
Я тебя не понимаю. Как она может быть ДО компиляции?
Я про ДО ничего не говорил. Где я сказал до?
Eugene
Я про ДО ничего не говорил. Где я сказал до?
:))) Ок. Что такое рандомизация при компиляции? Я же говорю, ImageBase везде 0x400000. Рандомизацию делает система.
Eugene
Нет никакой рандомизации при компиляции. Она при запуске. Просто при нескольких запусках подряд адрес не меняются.
bilka00
Для памяти в память это просто аллокация
Тем же вопрос стоял по "отражению"
s54820
Как понимать текст с зачёркиванием?
Понимать как «я потом попробовал пособирать .exe не с 0x400000, а с другим базовым адресом, и пропускается уже регион по этому базовому адресу, но не всегда 4МБ — с меньшим выравниванием базового адреса может пропускать только 64К, но если база достаточно высокая, то оно и ниже базы начинает рандомизировать, и мало ли что там ещё может вылезти неучтённого».
disba1ancer
Нет никакой рандомизации при компиляции. Она при запуске. Просто при нескольких запусках подряд адрес не меняются.
Скажи одну вещь, бинарники на Винде всегда собираются как релокабельные? (Т.е. с использованием релоков и команд с относительной адресацией где это возможно)
s54820
Рандомизация при компиляции это такой себе aslr
При компиляции (в post-build) есть rebase, это другое. Это старый механизм, чтобы экономить, не применяя релоки. Берутся все DLL, которые предположительно будут загружаться в процесс, им раздаются базовые адреса таким образом, чтобы при загрузке никого не приходилось перемещать. При этом системные библиотеки трогать не нужно, потому что об этом позаботилась сама MS. Это ещё до ASLR было. И мало кто заморачивался, у многих приложений в длл была тупо дефолтная 0x10000000 база. А потом и вовсе решили, что безопасность важнее.
Eugene
Скажи одну вещь, бинарники на Винде всегда собираются как релокабельные? (Т.е. с использованием релоков и команд с относительной адресацией где это возможно)
Зависит от компилятора. VC++, Clang, ICX (intel), G++/MSYS2 — да (есть и релоки, и ASLR). G++/MinGW — нет (всё отключено). Delphi 11 — да. Delphi 7 — только релоки делает, но без DYNAMIC_BASE (х/з зачем). C++Builder 11 — тоже только релоки делает, но без DYNAMIC_BASE. fasm — нет. masm32 — нет. ... Но это всё "по умолчанию", но можно менять. Здесь флаг 0x40 — это DYNAMIC_BASE как раз. Он хоть и является DLL-флагом, но на обычный EXE тоже влияет.
Vadim Yegorov
мой вопрос проигнорили
Vadim Yegorov
Vadim Yegorov
компания производитель SoC
Vadim Yegorov
что учить для позиции, подскажите
Vadim Yegorov
я Software Security Analyst а тут позиция Hardware, Embedded
Paul'
я Software Security Analyst а тут позиция Hardware, Embedded
Это для меня звучит как студент 1 курса, пытается попасть на senior позицию.
­
я Software Security Analyst а тут позиция Hardware, Embedded
А не много ли ты на себя наваливаешь?
s54820
А как dynamic base будет с не релокабельными бинарниками работать (релокабельность это не только релоки)
Никак не будет работать, будет грузить по базовому адресу. Но если хочется ASLR без релоков (вся адресация относительная), то можно убрать одновременно и релоки, и флаг relocs stripped.
disba1ancer
Никак не будет работать, будет грузить по базовому адресу. Но если хочется ASLR без релоков (вся адресация относительная), то можно убрать одновременно и релоки, и флаг relocs stripped.
Ну так и без релоков надо иметь компилятор который будет код с относительными адресами генерировать, а это уже какие-то телодвижения, собственно моё сомнение и заключается в том что компиляторы работают в таком режиме по умолчанию
Eugene
Кто знает, как правильно получить сообщение об исключении (по SEH) ? Делаю через FormatMessage, но там есть глюки типа такого.
Eugene
Это не глюки, это %-аргументы. Но как правильно – не знаю.
Я понял, что это %-аргументы, только почему-то без % 🤷‍♂️
s54820
Потому что ты не передал va_list?
FORMAT_MESSAGE_IGNORE_INSERTS вон есть.
Eugene
FORMAT_MESSAGE_IGNORE_INSERTS вон есть.
Ну вот теперь % появились :))
Eugene
Я бы с удовольствием передал va_list, если б понимал, откуда их брать... Я SEH сделал через _set_se_translator.
Eugene
Правда, он на int3 не срабатывает...
s54820
Я бы с удовольствием передал va_list, если б понимал, откуда их брать... Я SEH сделал через _set_se_translator.
Вот откуда брать, я как раз и не знаю. Это не только исключений касается, но и других ошибок. Ни разу не встречал описания того, что и в каком порядке передавать. Возможно подразумевается, что ты для известных исключений сделаешь свитч и вручную подготовишь аргументы, а для неизвестных будешь выводить только номер. Не знаю.
Дмитрий
Подскажите пожалуйста откуда растут ноги: https://github.com/oscam-emu/oscam-patched/blob/master/module-camd35.c#L1006
Master Mentor
Друзья, всем MC&HNY! Тут зашё спор есть ли вообще такая вакансия как "разработчик на ASM"? Т.е. написание алгоритмов на asm хотя бы в течение70% рабочего времени? Кто реально так работает или знает?
Eugene
Салют! Как в этом грёбаном встроенном асме VC++ сделать call на фиксированный адрес, например call 0x10000000 ? Он ругается, что так нельзя: недопустимый тип операнда. Я даже не могу написать: db 0xE8 dd 0x10000000 - ($ + 4) потому что на первую строку он ругается, мол синтаксическая ошибка во встроенном коде на языке ассемблера в "код операции"; обнаружено "constant". Вариант завести переменную сделать call dword [func_addr] не годится.
Eugene
может call offset ...?
К сожалению, нет.
Eugene
у тебя не получится скорее всего так, боюсь это ограничение в формате объектных файлов, могу предложить только что-то вроде ret
Видимо, да, ему нужна поддержка относительной адресации. Хотя у меня релоки и ASLR отключены. В общем, сделал через промежуточную переменную...
disba1ancer
Видимо, да, ему нужна поддержка относительной адресации. Хотя у меня релоки и ASLR отключены. В общем, сделал через промежуточную переменную...
ты их отключил только в результирующем бинаре, в объектниках эти вещи не отключаются, поскольку при линковке нужно много чего релоцировать
disba1ancer
Да я уж понял...
так-то это можно было бы на этапе линковки разрешить указав в коде метку, а в линкере задать метке требуемый адрес
disba1ancer
но линкер msvc вроде так не умеет