mmap

2017-05-08 14 views
7

के साथ साझा मेमोरी में शेलकोड निष्पादित करना मैं प्रोग्राम-कोड को साझा-मेमोरी क्षेत्र में स्थानांतरित करने और निष्पादित करने का प्रयास कर रहा हूं। साझा स्मृति को आरंभ करना और आवंटित करना और "नई" मेमोरी कार्यों में शेलकोड को प्रतिलिपि बनाना, जैसा कि मैं इसे निष्पादित करने का प्रयास करता हूं, यह काम नहीं करता है। क्या किसी को पता है कि समस्या क्या हो सकती है?mmap

मुझे लगता है कि write(1, 0x6000d8, 13) = -1 EFAULT (Bad address) त्रुटि हो सकती है? इसका क्या कारण हो सकता है?

मैंने कोड और स्ट्रैक्ट त्रुटि आउटपुट शामिल किया। सी-कोड Adam Rosenfield से this Question में उत्तर पर आधारित है।

सी-कोड

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

shellcode का स्रोत

जब आप इस खोल कोड इंजेक्षन
+0

यह अपने shellcode कुछ हद तक काम किया की तरह लग रहा जरूरत नहीं है। मान '\ xd8 \ x00 \ x60 \ x00' अमान्य पता '0x6000d8' जैसा दिखता है जो' लिखना()' को पारित किया गया था। –

+0

@AndrewHenle तो समस्या शेल कोड हो सकती है, है ना? पता है कि शेलकोड "उपयोग करता है" गलत है? – Marvin

+1

क्या आपके पास शेल कोड का स्रोत कोड है? यदि हां इसे पोस्ट करें। – LPs

उत्तर

1

अपने कोड

करने का प्रस्ताव डुप्लिकेट लागू करने के लिए आप क्या संदेश में है पता नहीं है:

mov  rsi, msg 
इंजेक्शन प्रक्रिया में

, यह लेकिन कुछ भी हो सकता यह "Hello world!\r\n" नहीं होगा, क्योंकि यह .data section

section .data 
    msg db  "hello, world!" 

में है, जबकि आप केवल .text अनुभाग फेंक दिया।

आप देख सकते हैं कि आपके खोल कोड "Hello world!\r\n" (\x68\x65\x6c\x6c\x6f....)

+0

धन्यवाद @ एलपी, यह वास्तव में मामला था। मैंने 'mov rsi' msgstr 'पॉप आरएसआई' में बदल दिया और यह एक आकर्षण की तरह काम किया। – Marvin

संबंधित मुद्दे