हाय सब,char [] सरणी और चार * के रूप में शेलकोड घोषित करने के बीच अंतर?
मैं मूल शेलकोडिंग सीखने की कोशिश कर रहा हूं और मैंने कुछ उत्सुकता से भाग लिया है कि मुझे उम्मीद है कि कोई मुझे समझा सकता है। मैंने निम्नलिखित कोड को दो तरीकों से संकलित किया है: शेलकोड को सरणी के रूप में घोषित करना और char * के रूप में। जब मैं एक सरणी के रूप में शेलकोड घोषित करता हूं, लिनक्स पता लगाता है कि मैं डेटा निष्पादित करने की कोशिश कर रहा हूं और मुझे पहले निर्देश पर एक सेगफॉल्ट मिलता है। हालांकि, जब मैं एक शेलकोड के रूप में शेलकोड घोषित करता हूं * सभी शेलकोड निष्पादित करता है और मुझे "हैलो वर्ल्ड!" मिलता है। कंपाइलर इन दो घोषणाओं का अलग-अलग व्यवहार कैसे करता है और क्यों एक शेलकोड में समाप्त होता है जो स्मृति में रहता है जो असुरक्षित है? अग्रिम में धन्यवाद।
#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)();
}