मान लें कि मेरे पास दो प्रोग्राम हैं - input.c & output.c मैं बस इतना करना चाहता हूं कि "आधा पिरामिड" प्रारूप में कुछ पेलोड/वर्णों को execl() फ़ंक्शन का उपयोग करके किसी अन्य में भेज दें ।सी - आउटपुट पर जंक वर्ण
input.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define SIZE 1024
int length;
int main(int argc, char *argv[])
{
pid_t pid;
char *target;
//char payload[length+1];
char payload[SIZE + 1];
int status;
int i = 0;
if(argc < 2)
{
printf("Usage %s <length> <target>\n", argv[0]);
exit(EXIT_FAILURE);
}
length = atoi(argv[1]);
target = argv[2];
while(i < length)
{
pid = fork();
if(pid != 0)
{
waitpid(-1, &status, 0);
//exit(0);
}
if(pid == 0)
{
payload[i] = 'A';
payload[i + 1] = '\0';
execl(target, target, payload, NULL);
//printf("%s\n", payload);
}
++i;
}
return 0;
}
टिप्पणी मार्ग सिर्फ डीबगिंग उद्देश्यों के लिए कर रहे हैं। क्योंकि जैसा कि आप देख सकते हैं (कोशिश करते समय), जब आप इसे प्रिंट करना चाहते हैं, तो सब ठीक से काम करता है।
output.c (या अगर आप चाहते हैं 'target.c')
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buffer[30];
strncpy(buffer, argv[1], sizeof(buffer));
printf("Output: %s\n", buffer);
return 0;
}
जब मैं की तरह input.c संकलन:
gcc input.c -o input
& output.c :
gcc output.c -o output
ठीक है। अब, सब कुछ तैयार है। मान लीजिए, मैं एक पेलोड भेजने के लिए चाहते हैं - लंबाई 6
./input 6 ./output
लेकिन सभी मैं उत्पादन पर मिलता है (एक और junks पात्रों के साथ या बस) बस यह है:
Output: A
Output: 0A
Output: 0,A
Output: 0,�A
Output: 0,�8A
Output: 0,�8�A
मैंने कई की कोशिश की चीजें, लेकिन उनमें से सभी विफल हो गए और आउटपुट अभी भी वही था, जैसा कि आप ऊपर देख सकते हैं।
यदि कोई मेरी मदद कर सकता है और संभवतः मुझे दिखा सकता है कि समस्या कहां है तो मैं बहुत आभारी हूं। कांटा() और execl() कार्यों का एक साथ उपयोग करने में समस्या हो सकती है?
आप एक आदमी कर रहे हैं! हाँ, यह एक आकर्षण की तरह काम करता आपकी मदद के लिए बहुत बहुत धन्यवाद। और हाँ, अगर यह आपके लिए कोई समस्या नहीं है, तो मैं कुछ और विस्तृत स्पष्टीकरण के लिए आभारी हूं, क्योंकि मुझे नहीं लगता कि मैं इसे 100% पर समझता हूं और मैं कुछ नहीं करना चाहता भविष्य में इसी तरह की त्रुटि। – Yeez
ठीक है, मैं कुछ स्पष्टीकरण जोड़ता हूं। यह एक अच्छा "ताज़ा था एच "मेरे लिए कसरत। – Amessihel
हे, मुझे खुशी है कि ऐसा था। वैसे भी, अब मैं इसे एक और बार देख रहा हूं और मेरे पास एक अतिरिक्त प्रश्न है - यदि आप उत्तर दे सकते हैं। यदि मैं strcpy के साथ strncpy को प्रतिस्थापित करता हूं और "./input 80 ./output" करता हूं, तो मैं आउटपुट "सेगमेंटेशन गलती" पर कहीं और क्यों नहीं देख सकता? मैं सिर्फ उत्सुक हूँ। – Yeez