Я хотел бы скомпилировать небольшие double(...)
функции как шеллкод x64. У меня уже есть работающая программа для создания закодированной сборки для простых математических операций, таких как a + b / a
, где a
и b
— это double
параметры функции.
Сгенерированный код загружается в исполняемый mmap
буфер и может быть вызван позже.
У меня следующая проблема: я хотел бы вызвать math.h
функции, такие как sin
, exp
и т. д. внутри моего сгенерированного шеллкода. Поскольку все коды операций call
так или иначе используют 32-битные адреса или относительные переходы, я не могу легко использовать эти инструкции. Поэтому я попытался реализовать свою собственную call
-инструкцию следующим образом:
lea rax, [rip+0x0] ;load instruction pointer into rax
add rax, <offset-to-return-to>
push rax
moveabs rax, <adress-of-function> ;load the function pointer to rax
jmp rax
Это мой код для создания этих инструкций:
//lea rax, [rip+0x0]
insertAll(code,std::list<uint8_t>{ 0x48, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00 });
//add rax, <offset-to-return-to>
insertAll(code,std::list<uint8_t>{ 0x48, 0x83, 0xC0, <offset-to-return-to>});
//push rax
code.push_back(0x50);
//moveabs rax, address-of-function
uint8_t reg = 0; //rax
uint8_t rexWPrefix = 0x48 + (reg > 8);
uint8_t opCode = 0xB8 + (reg % 8);
insertAll(code,std::list<uint8_t>{ rexWPrefix, opCode });
code.insert(code.end(),reinterpret_cast<uint8_t*>(&fabs),reinterpret_cast<uint8_t*>(&fabs) + 8);
//jmp rax
insertAll(code,std::list<uint8_t>{ 0xFF, 0xE0 });
К сожалению, вызов функций таким способом не работает, программа вылетает с ошибкой SIGSEGV
. Что-то не так с моим ассемблерным кодом или кодировкой инструкции? Какое значение должно иметь <offset-to-return-to>
, чтобы функция вернулась в правильное положение?
Отказ от ответственности: я знаю, что это не лучший способ динамической генерации кода... Я мог бы просто скомпилировать динамическую библиотеку и загрузить ее с помощью dlsym
. Это просто забавный способ узнать об ассемблере/шеллкодах, и его не следует воспринимать слишком серьезно :)
add rax
вlea
. Убедитесь, что вы используете правильное смещение. - person Jester   schedule 01.01.2017