Assembly 程序集x86:execve具有多个参数

Assembly 程序集x86:execve具有多个参数,assembly,x86,execve,Assembly,X86,Execve,我想编写一个外壳代码来执行sys_execve/usr/bin/scp,usr/bin/scp,args,NULL 这是完整的命令: scp-i/tmp/file-p8989/path/fileuser@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 m

我想编写一个外壳代码来执行sys_execve/usr/bin/scp,usr/bin/scp,args,NULL

这是完整的命令: scp-i/tmp/file-p8989/path/fileuser@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,我看到它们只产生垃圾字节。 有没有关于如何解决这个问题的提示

推送/路径/文件

这个指令应该做什么

推送字符串的地址

将字符串本身写入堆栈

我试着像这样推动寄存器:

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
您需要做的是:

将值推送到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

可能重复的THX!但我的问题是我没有足够的注册表。我必须写6个令牌,每个令牌取一个寄存器。我有一个空间问题,我不知道如何解决它: