OberonCore
https://forum.oberoncore.ru/

Си: строка как машинный код
https://forum.oberoncore.ru/viewtopic.php?f=27&t=3182
Страница 1 из 1

Автор:  Geniepro [ Четверг, 20 Январь, 2011 09:27 ]
Заголовок сообщения:  Си: строка как машинный код

В Реддите наткнулся на упоминание такого забавного кода:
Код:
#include <stdio.h>
void(*swap)() = (void(*)()) "\x8b\x44\x24\x04\x8b\x5c\x24\x08\x8b\x00\x8b\x1b\x31\xc3\x31\xd8\x31\xc3\x8b\x4c\x24\x04\x89\x01\x8b\x4c\x24\x08\x89\x19\xc3"
"Oh, there you are Mr. Insanity...";

int main(){ // works on GCC 3+4
   int a = 37, b = 13;
   swap(&a, &b);

   printf("%d%d",a,b);
}

// TIL: If you do this at work, you'll probably be fired

Самое смешное -- работает! По крайней мере, компилятор TinyC выполняет этот код -- значения переменных a и b меняются местами.
Вот уж простор для багов... :lol:

Автор:  Galkov [ Четверг, 20 Январь, 2011 10:37 ]
Заголовок сообщения:  Re: Си: строка как машинный код

Дык не особо и новость...
У нас FastMathParse так работает. Просто MathParse - тот по честному парсит текст формулы, и считает. А Fast - тот при загрузке новой формулы, делает именно такую "строку".

И тоже ведь работает :)
Не сами придумали - где-то в инете примерчики были про "супербыстрый калькулятор".
И тоже на C, естественно.

Автор:  Geniepro [ Четверг, 20 Январь, 2011 20:32 ]
Заголовок сообщения:  Re: Си: строка как машинный код

Проверил с включенной опцией DEP (Data Execution Prevention) -- система стала блокировать эту программку.
Так что Ваш FastMathParse у меня уже не запустится. :lol:
Вы бы доработали его так, что бы он сохранял скомпилированный код в файл и запускал из файла -- надёжнее и безопаснее...

Автор:  Илья Ермаков [ Четверг, 20 Январь, 2011 20:34 ]
Заголовок сообщения:  Re: Си: строка как машинный код

Надо на страницу памяти проставлять разрешение на выполнение...
Винда раньше относилась либерально - если чтение проставлено, то можно и выполнить.

В Линуксе в ядре 2.4 - тоже. А в 2.6 уже требоваться стало. Ввиду этого определённые нюансы в ядре ББ тогда пришлось править.

Автор:  Galkov [ Четверг, 20 Январь, 2011 20:45 ]
Заголовок сообщения:  Re: Си: строка как машинный код

Geniepro писал(а):
Проверил с включенной опцией DEP (Data Execution Prevention)
Хм..
А при чем здесь Вы ???
Разве флаги, аллоцированных "мною" блоков памяти для хипа - "Вы" определяете, а не "я"

Типа: я Вас не понял...

Автор:  Илья Ермаков [ Четверг, 20 Январь, 2011 21:15 ]
Заголовок сообщения:  Re: Си: строка как машинный код

Диспетчер кучи запрашивает для себя у ОС страницы (VirtualAlloc) с флагом на чтение-запись.
Винда всегда разрешала и выполнение данных как кода на таких страницах (т.е. просто плевала на отсутствие флага "исполнение").
Но с какой-то версии Винды (с ХР?) появилась галочка, которой пользователь указывает операционной системе не разрешать такое выполнение. Что, разумеется, приводит к неработоспособности тех программ, которые не используют флаг "разрешить выполнение".

Автор:  Galkov [ Четверг, 20 Январь, 2011 21:42 ]
Заголовок сообщения:  Re: Си: строка как машинный код

Ну да. И вроде как, действительно - с XP...
Но это же следствие действий разработчика, а не манипуляций пользователя на целевой платформе.
Мне казалось

Автор:  Geniepro [ Четверг, 20 Январь, 2011 21:48 ]
Заголовок сообщения:  Re: Си: строка как машинный код

Так что, этот DEP элементарно отключается? Тогда какой вообще смысл в этой защите? Думаешь, что защита есть, а её на самом деле и нет вовсе... Вапще всё ужасно...

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/