Агитка (Котлин)

1,137
5
3
Всё это, конечно, хорошо. Но плохо то, что очень часто, после компиляции, вставляется байткод 0x00, aka NOP.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Да? Не знал. Но это же вроде никак не влияет на скорость там и прочее?
 
1,137
5
3
Ну в джаве JIT, так что не знаю во что оно превратится. В машинном коде просто так прожирает такт процессора. Только ты не заметишь. В любом случае, байткод этот лишний.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Ну я думаю JIT догадывается их выпиливать, разу уж более сложные вещи выпиливает. Но вот нафиг они нужны хызы, надо поискать штоле.
 
1,137
5
3
В С++, обычно, используется. Я читал на хабре, что можно хук вставить. Ну в Джаве достаточно вставить нужный байткод и передать ему параметры.

NOP хранится в .class. Это не очень хорошо. Байт мало, да, но ведь отсутствие байткода еще меньше. А JIT сам решает, что убирать, а что вставлять. Но ведь храниться будет в классе этот байткод.

Javac, кстати, не вставляет 0х00 никуда.
 
398
4
7
wilah написал(а):
В С++, обычно, используется. Я читал на хабре, что можно хук вставить.

В первый раз о таком слышу (хотя я С++ не знаю и изучать не собираюсь), можешь дать ссылку?
По моему nop используется:
1) Во всяких микроконтроллерах (преимущественно простых) для задержек
2) Для выравнивания команд на некоторых процессорах.
Например, процессор может читать данные из памяти по 32 бита за раз по адресам кратным 4 байтам, а команды имеют переменную длину от 1 бата. Тут иногда целесообразно вставить nop, чтобы следующие команды считались за одну пересылку по шине.
3) Из-за особенностей организации конвейера выполнения команд на некоторых процессорах, команда nop вставленная в нужном месте может немного ускорить выполнение программы.
4) Использование ошибок переполнения буффера для выполнения произвольного кода.

Во втором и третьем случае что-либо сделать вручную весьма трудно, это делают компиляторы. Еще несколько раз я вставлял в код на Си nop, чтобы поставить на него точку останова в отладчике.
Разумеется все эти случаи применительно к джаве не имеют смысла, поэтому зачем нужен nop в джаве для меня загадка.
 
1,137
5
3
Я тоже не знаю, зачем он там нужен. Однако он есть. Ссылка на хабр: https://m.habrahabr.ru/company/infopulse/blog/140456/
 
7,099
324
1,510
Asd73 написал(а):
4) Использование ошибок переполнения буффера для выполнения произвольного кода.

Звучит интересно, можно по-подробнее?
 
398
4
7
Я этими вещами не слишком увлекаюсь, поэтому могу привести лишь один пример.
Код:
int main() {
   char buf[10];
   gets(buf);
   printf("%s\n", buf);
   return 0;
}
В Си для х86 стек возвратов используется не только для хранения адресов возврата из функций, но и для передачи аргументов и хранения локальных переменных.

Функция gets считывает строку и помещает ее в буффер. Но эта функция не учитывает размер буффера, поэтому можно напечатав определенные символы изменить сохраненный в стеке адрес возврата.
Можно еще загрузить в стек какой-нибудь код, который может выполниться. nop тут нужен когда неизвестен адрес по которому загрузился наш код. Конечно, вряд ли кто-то будет использовать эту функцию, но тем не менее похожую ошибку можно сделать с другим кодом.
Но этот способ сейчас вроде бы не работает, т.к. через какие-то механизмы запрещено выполнение кода из стека. Хотя другие похожие способы все равно работают.
 
667
7
2
Во имя сатаны котлина!
OVVAwq2.png
 
Сверху