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 меняются местами. Вот уж простор для багов... ![]() |
Автор: | Galkov [ Четверг, 20 Январь, 2011 10:37 ] |
Заголовок сообщения: | Re: Си: строка как машинный код |
Дык не особо и новость... У нас FastMathParse так работает. Просто MathParse - тот по честному парсит текст формулы, и считает. А Fast - тот при загрузке новой формулы, делает именно такую "строку". И тоже ведь работает ![]() Не сами придумали - где-то в инете примерчики были про "супербыстрый калькулятор". И тоже на C, естественно. |
Автор: | Geniepro [ Четверг, 20 Январь, 2011 20:32 ] |
Заголовок сообщения: | Re: Си: строка как машинный код |
Проверил с включенной опцией DEP (Data Execution Prevention) -- система стала блокировать эту программку. Так что Ваш FastMathParse у меня уже не запустится. ![]() Вы бы доработали его так, что бы он сохранял скомпилированный код в файл и запускал из файла -- надёжнее и безопаснее... |
Автор: | Илья Ермаков [ Четверг, 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/ |