Шеллкод: выполнить 2 вызова execve()

Я пытаюсь написать шеллкод на ассемблере. Мне нужно выполнить команду /usr/bin/killall И команду /usr/bin/wget. У меня обе команды отлично работают в шеллкоде с системным вызовом execve(). Но теперь я хочу объединить эти 2, но это невозможно, потому что программа завершается, когда выполняется первый вызов execve(). (из справочных страниц execve(): execve() не возвращается в случае успеха).

Как я могу выполнить 2 вызова execve()? Или есть другой способ вызвать /usr/bin/killall и /usr/bin/wget из одного и того же шелл-кода?

Приветствую и заранее благодарю!


person John Doe    schedule 05.04.2013    source источник
comment
Почему вы хотите писать шелл-код на ассемблере? Обычно вы пишете на C и компилируете его. Выполнение двух команд подряд - это то, для чего предназначена оболочка, и выполнение ее в сборке даст небольшой выигрыш...   -  person Jens    schedule 06.04.2013
comment
используйте fork, затем if и два execves.   -  person AbiusX    schedule 26.11.2013


Ответы (2)


Когда вы используете семейство функций exec, программа, с которой вы ее вызываете, подставляется в текущий процесс. Поэтому, когда выполняется первый вызов execve, весь образ вашего процесса исчезает, и, следовательно, второй вызов никогда не выполняется. Чтобы обойти это, вы должны разветвить другой процесс перед вызовом execve.

person jbr    schedule 05.04.2013

Во-первых, невозможно выполнить два execve() один за другим. Просто потому, что по определению вызов execve() заменит память исходного процесса новым, и вы больше никогда не сможете вернуться к исходному процессу.

Второй предложенный вами вариант (слияние /usr/bin/killall и /usr/bin/wget в шеллкод) вполне возможен, если команда killall не убивает процесс, выполняющий сам шеллкод. Если это так, мне действительно нужно больше информации о том, почему такое поведение необходимо, потому что оно кажется мне немного абсурдным (но я, конечно, скучаю по контексту, в котором вы запускаете свой шелл-код).

person perror    schedule 05.04.2013