аргументы execve не копируются за пределы нулевого байта

Рассмотрим код ниже:

char *args[3];
char *arg = "\x90\x90\x00\x90\x90";
args[0] = "/path/to/exe";
args[1] = arg;
args[2] = NULL;
execve(args[0], args, NULL);

Поскольку arg завершается нулем в середине, когда execve создает новый образ процесса, все, что находится за пределами \x00, не копируется для нового процесса. Есть ли способ «обмануть» execve, чтобы скопировать все, что находится за пределами \x00?


person hesson    schedule 18.01.2015    source источник


Ответы (3)


Короткий ответ: нет. Параметры execve (на самом деле, все семейство exec) представляют собой строки C и, следовательно, заканчиваются нулевым байтом. Если бы он не остановился на нулевом байте, у него не было бы возможности узнать длину строки. По той же причине ни один исполняемый файл не должен ожидать нулевой байт в своем argv.

person DoxyLover    schedule 18.01.2015

Соглашение C для строк - нулевое завершение, которое включает API-интерфейсы системного вызова, такие как execve.

Даже если было бы возможно обойти execve shim для интерфейса системных вызовов ядра, для ядра было бы недопустимо поддерживать аргументы с реальными встроенными нулевыми байтами в таблицу процессов в качестве системных вызовов, библиотек, инструментов и интерфейсов (например, procfs) вокруг управления процессами. также показал бы усеченные аргументы процесса, даже если бы это было возможно.

Если вы заинтересованы в вызове системного вызова execve ядра Linux, может быть полезна следующая статья: http://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html?m=1

Как только вы прочитаете эту статью, вы увидите, что execve api по сути является массивом строк с нулевым завершением, которые передаются ядру, которое оно обрабатывает.

TL; DR от этого никуда не деться.

person Andrew Hacking    schedule 18.01.2015

один из методов заключается в замене нуля другим символом, скажем, 4 FF, при условии, что 4 последовательных FF никогда не будут частью ваших данных. а затем замените их обратно на ноль. Предполагая, что вы можете изменить вызываемый exe.

person Sameer Naik    schedule 18.01.2015
comment
exe не может быть изменен - person hesson; 18.01.2015