Разница между объявлением шеллкода как массива char[] и char*?

Привет всем,

Я пытаюсь изучить основы shellcoding и я столкнулся с чем-то любопытным, что я надеюсь, что кто-то может объяснить мне. Я скомпилировал следующий код двумя способами: объявив шеллкод как массив и как char*. Когда я объявляю шеллкод как массив, linux определяет, что я пытаюсь выполнить данные, и я получаю segfault на первой инструкции. Однако, когда я объявляю шеллкод как char*, весь шеллкод выполняется, и я получаю "Hello world!". Как компилятор обрабатывает эти два объявления по-разному и почему одно заканчивается шеллкодом, который живет в незащищенной памяти? Заранее спасибо.

#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)();
}
9
задан Ethan Heilman 20 March 2012 в 09:18
поделиться