0

我想编写一个执行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 只会产生垃圾字节。
关于如何解决这个问题的任何提示?

4

1 回答 1

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
于 2014-05-12T19:29:30.547 回答