2017-05-08 107 views
7

我試圖將程序代碼放入並執行到共享內存區域中。初始化和分配共享內存以及將shellcode複製到「新」內存中的工作如預期的那樣,但只要我嘗試執行它,它就不起作用。有沒有人有一個想法可能是什麼問題?使用mmap在共享內存中執行shellcode

我認爲write(1, 0x6000d8, 13) = -1 EFAULT (Bad address)可能是錯誤的?什麼可能導致這種情況?

我包含代碼和stract錯誤輸出。 C碼基於this QuestionAdam Rosenfield的回答。

的C代碼

#include <string.h> 
#include <sys/mman.h> 

// My own shellcode, obtained through objdump 
// works on its own (a hello world-program) 
const char shellcode[] = "\xb8\x01\x00\x00\x00\xbf\x01\x00\x00\x00\x48\xbe\xd8\x00\x60\x00\x00\x00\x00\x00\xba\x0d\x00\x00\x00\x0f\x05\xb8\x3c\x00\x00\x00\xbf\x00\x00\x00\x00\x0f\x05"; 

int main(int argc, char **argv) 
{ 
    void *mem = mmap(0, sizeof(shellcode), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 

    memcpy(mem, shellcode, sizeof(shellcode)); 

    mprotect(mem, sizeof(shellcode), PROT_READ|PROT_WRITE|PROT_EXEC); 

    int (*func)(); 
    func = (int (*)())mem; 
    (int)(*func)(); 

    munmap(mem, sizeof(shellcode)); 

    return 0; 
} 

strace的登錄

execve("./memory", ["./memory"], [/* 17 vars */]) = 0 
brk(NULL) = 0x557b5e17e000 
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8ba434000 
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 
fstat(3, {st_mode=S_IFREG|0644, st_size=92611, ...}) = 0 
mmap(NULL, 92611, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb8ba41d000 
close(3) = 0 
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\5\2\0\0\0\0\0"..., 832) = 832 
fstat(3, {st_mode=S_IFREG|0755, st_size=1856752, ...}) = 0 
mmap(NULL, 3959200, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb8b9e4c000 
mprotect(0x7fb8ba009000, 2097152, PROT_NONE) = 0 
mmap(0x7fb8ba209000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bd000) = 0x7fb8ba209000 
mmap(0x7fb8ba20f000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb8ba20f000 
close(3) = 0 
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb8ba41b000 
arch_prctl(ARCH_SET_FS, 0x7fb8ba41b700) = 0 
mprotect(0x7fb8ba209000, 16384, PROT_READ) = 0 
mprotect(0x557b5dd04000, 4096, PROT_READ) = 0 
mprotect(0x7fb8ba437000, 4096, PROT_READ) = 0 
munmap(0x7fb8ba41d000, 92611)   = 0 
mmap(NULL, 40, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0) = 0x7fb8ba433000 
mprotect(0x7fb8ba433000, 40, PROT_READ|PROT_WRITE|PROT_EXEC) = 0 
write(1, 0x6000d8, 13) = -1 EFAULT (Bad address) 
exit(0) = ? 
+++ exited with 0 +++ 

殼碼的源

section .data 
    msg db  "hello, world!" 

section .text 
    global _start 
_start: 
    mov  rax, 1 
    mov  rdi, 1 
    mov  rsi, msg 
    mov  rdx, 13 
    syscall 
    mov rax, 60 
    mov rdi, 0 
    syscall 
+0

它看起來像你的shellcode有些工作。值'\ xd8 \ x00 \ x60 \ x00'看起來像傳遞給'write()'的無效地址0x6000d8。 –

+0

@AndrewHenle所以問題可能是shell代碼,對吧? shellcode「使用」的地址是錯誤的? – Marvin

+1

你有沒有shell代碼的源代碼?如果是的話發佈。 – LPs

回答

1

所提出的重複應用到你的代碼

當你注入這個shell代碼,你不知道什麼是信息:

mov  rsi, msg 
在注射過程中

,它可以是任何東西,但它不會是"Hello world!\r\n",因爲它是在.data section

section .data 
    msg db  "hello, world!" 

,而你只甩了.text段。

你可以看到你的shell代碼沒有"Hello world!\r\n"\x68\x65\x6c\x6c\x6f....

+0

感謝@LP,事實確實如此。我把'mov rsi,msg'改成了'pop rsi',它的功能就像一個魅力。 – Marvin