2017-05-08 16 views
7

Tôi đang cố gắng đặt và thực thi mã chương trình vào vùng bộ nhớ dùng chung. Khởi tạo và phân bổ bộ nhớ chia sẻ cũng như sao chép shellcode vào bộ nhớ "mới" hoạt động như dự định, nhưng ngay sau khi tôi cố gắng thực thi nó, nó không hoạt động. Có ai có ý tưởng vấn đề có thể là gì không?Thực thi shellcode trong bộ nhớ dùng chung với mmap

Tôi nghĩ rằng write(1, 0x6000d8, 13) = -1 EFAULT (Bad address) có thể là lỗi? Điều gì có thể gây ra điều này?

Tôi đã bao gồm mã và đầu ra lỗi stract. Mã C dựa trên câu trả lời từ Adam Rosenfield trong this Question.

C-Code

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

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

Nguồn shellcode

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

Dường như shellcode của bạn phần nào làm việc. Giá trị '\ xd8 \ x00 \ x60 \ x00' trông giống như địa chỉ không hợp lệ' 0x6000d8' đã được chuyển tới 'write()'. –

+0

@AndrewHenle Vì vậy, vấn đề có thể là mã shell, phải không? Địa chỉ mà shellcode "sử dụng" là sai? – Marvin

+1

Bạn đã nhận được mã nguồn của mã shell chưa? Nếu có, hãy đăng nó. – LPs

Trả lời

1

Để áp dụng trùng lặp đề nghị mã của bạn

Khi bạn tiêm mã shell này, bạn không biết những gì đang có thông điệp:

mov  rsi, msg 

trong quá trình tiêm, nó có thể là bất cứ điều gì nhưng nó sẽ không "Hello world!\r\n" vì nó là trong .data section

section .data 
    msg db  "hello, world!" 

khi bạn đổ chỉ phần .text.

Bạn có thể thấy rằng mã shell của bạn không có "Hello world!\r\n" (\x68\x65\x6c\x6c\x6f....)

+0

Cảm ơn @ LPs, đây thực sự là trường hợp. Tôi đã thay đổi 'mov rsi, msg' thành' pop rsi' và nó hoạt động như một sự quyến rũ. – Marvin

Các vấn đề liên quan