сборка x86: execve с несколькими аргументами

Я хочу написать шелл-код, который выполняет sys_execve("/usr/bin/scp","usr/bin/scp",args,NULL).

Это полная команда:
scp -i /tmp/file -P 8989 /path/file user@ip:/home/user

Проблема в том, что мне нужно много регистра (после scp 6 токенов):

cdq

push edx
push user@ip:/home/user
mov edi,esp

push edx
push /path/file
mov esi,esp

push edx
push 8989
mov ecx,esp

push edx
push -P
mov eax,esp

push edx
push /tmp/file
???

push edx
push -i
???

push edx
push /usr/bin/scp
mov ebx,esp

Я попытался нажать регистры следующим образом:

cdq

push edx
push user@ip:/home/user
mov edi,esp

push edx
push /path/file
mov esi,esp

push edx
push 8989
mov ecx,esp

push edx
push -P
mov eax,esp

push edx
push edi
push esi
push ecx
push eax
mov ecx,esp

push edx
push /tmp/file
mov edi,esp

push edx
push -i
mov esi,esp

push edx
push /usr/bin/scp
mov ebx,esp

push edx
push ecx
push edi
push esi
push ebx
mov ecx,esp

int 0x80

Но с помощью gdb и libemu я увидел, что они производят только мусорные байты.
Любые подсказки о том, как решить эту проблему?


person polslinux    schedule 12.05.2014    source источник
comment
возможный дубликат системного вызова sys_execve из сборки   -  person Joachim Isaksson    schedule 12.05.2014


Ответы (1)


нажать /путь/файл

Что должна делать эта инструкция?

Нажать адрес строки?

Записать саму строку в стек?

Я попытался нажать регистры следующим образом:

Вам нужно сделать следующее:

  • Нажмите значение 0 (32-битное)
  • Нажимайте указатели (каждый по 32 бита) на каждую используемую строку окружения.
  • Скопируйте регистр ESP в EDX (mov edx,esp)
  • Вставьте значение 0 и указатели на каждый аргумент командной строки (включая имя исполняемого файла argv[0]); вставьте последний аргумент первым
  • Скопировать ESP в ECX
  • Записать указатель на имя исполняемого файла в EBX
  • Записать 0x0B в EAX
  • Выполните «int 0x80»

(Предполагая, что вы используете Linux)

--- РЕДАКТИРОВАТЬ ---

Не храните все в регистрах!

Я бы сохранил фиксированные строки в коде программы:

  call xx
xx:
  pop edx
  lea ecx,[edx+p1-xx]
  push ecx  # ecx is now a pointer to "/some/file"
  lea ecx,[edx+p2-xx]
  push ecx  # ecx is now a pointer to "/other/file"
  ...
  int 0x80
p1:
  db "/some/file",0
p2:
  db "/other/file",0
person Martin Rosenau    schedule 12.05.2014
comment
СПАСИБО! Но моя проблема в том, что у меня недостаточно регистраций. Мне нужно написать 6 токенов (и каждый токен занимает регистр). У меня проблема с местом, и я не знаю, как ее решить :( - person polslinux; 13.05.2014