我想编写一个执行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我看到它只产生垃圾字节 有关如何解决这个问题的任何提示?
答案 0 :(得分:0)
推送/路径/文件
这条指令应该做什么?
推送字符串的地址?
将字符串本身写入堆栈?
我试图像这样推送寄存器:
您需要做的是:
(假设您使用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