Xin chào tất cả,Sự khác nhau giữa việc khai báo shellcode là mảng char [] và char *?
Tôi đang cố gắng tìm hiểu mã shellcoding cơ bản và tôi đã chạy trên một cái gì đó tò mò mà tôi hy vọng ai đó có thể giải thích cho tôi. Tôi đã biên dịch mã sau đây theo hai cách: khai báo shellcode như một mảng và như một char *. Khi tôi khai báo shellcode như một mảng, linux phát hiện rằng tôi đang cố gắng thực hiện dữ liệu và tôi nhận được một segfault trên lệnh đầu tiên. Tuy nhiên, khi tôi khai báo shellcode như là một char * tất cả các shellcode thực hiện và tôi nhận được một "Hello world!". Trình biên dịch xử lý hai khai báo này khác nhau như thế nào và tại sao một trình kết thúc trong shellcode tồn tại trong bộ nhớ không được bảo vệ? Cảm ơn trước.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* This declaration ends in a segfault */
//char shellcode[] =
/* This declaration ends in successful execution */
char* shellcode =
/* Shellcode prints "Hello world!" and exits */
"\xeb\x1f\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\xb0\x04\xb3\x01\x59\xb2\x0c\xcd\x80\x48\x31\xc0\xb0\x01\x48\x31\xdb\xcd\x80\xe8\xdc\xff\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21";
int main()
{
void (*f)();
f = (void (*)())shellcode;
(void)(*f)();
}