Допустим, есть массив:
static char libc[0xf8000] {0,};
в который я загружаю код, и потом запускаю. Мне нужно, что адрес начала массива libc был кратен некоторому числу например, 0x10000. Сам бинарник можно загрузить в IDA Pro с нулевого адреса, и чтобы найти нужное смещение, где упала программа, нужно вычитать из адреса крэша адрес массива libc, что очень неудобно, если начало невыравнено.
Память можно выровнять, если выделять ее динамически, через _aligned_malloc() например, но IDA не запоминает точки останова в динамически выделенной памяти. Точнее точка останова вроде как есть, но IDA на ней не останавливается
Здравствуйте, wl., Вы писали:
alignas(0x10000) static char libc[0xf8000] {0,};
Здравствуйте, koenjihyakkei, Вы писали:
K>Здравствуйте, wl., Вы писали:
K>K>alignas(0x10000) static char libc[0xf8000] {0,};
K>
Спасибо! Компилятор заругался, что максимальное значение может быть не больше 4096, но я просто забил мусором перед буфером до нужного значения.
Изначальный баг забавный оказался — внутри секции данных был блок данных размером 0x18 байт с флагом R/O, а VirtualProtect() действует на всю страницу в 4кб, ну и крашился на попытке записи по адресу только для чтения