जवाबों:
स्टैक प्रोटेक्शन कम्पाइलर द्वारा किया जाता है (स्टैक पर कुछ अतिरिक्त डेटा जोड़ें और कॉल पर कुछ दूर स्टैश करें, वापसी पर पवित्रता की जांच करें)। बिना पुन: स्थापित किए उसे अक्षम नहीं किया जा सकता। यह वास्तव में बिंदु का हिस्सा है ...
वॉनब्रांड के विस्तार के लिए (सही तरीके से, +1) ने कहा, लिनक्स के स्टैक प्रोटेक्शन के दो हिस्से हैं।
स्टैक कैनरी कंपाइलर-एनफोर्समेंट फीचर हैं वॉनब्रांड संदर्भित करता है। ये एक recompile के बिना अक्षम नहीं किए जा सकते।
अपने आप को यह साबित करने और यह देखने के लिए कि वे कैसे काम करते हैं, निम्नलिखित कोड लेते हैं:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
int mybadfunction(char* a_bad_idea)
{
char what[100];
strcpy(what, a_bad_idea);
printf("You passed %s\n", what);
}
int main(int argc, char** argv)
{
printf("Tralalalaala\n");
mybadfunction(argv[1]);
}
अब संकलन करें कि ( gcc -fstack-protector -masm=intel -S test.c
) कुछ गन्नू में इकट्ठा होने और आउटपुट को पढ़ने में खुशी होगी। महत्वपूर्ण बात यह है कि mybadfunction
फ़ंक्शन से बाहर निकलने पर , इस कोड का एक छोटा टुकड़ा है:
mov edx, DWORD PTR [ebp-12]
xor edx, DWORD PTR gs:20
je .L2
call __stack_chk_fail
जैसा कि आप अनुमान लगा सकते हैं, कि एक स्टैक कुकी से ले रहा है [ebp-12]
और इसकी तुलना मूल्य पर कर रहा है gs:20
। मेल नहीं खाता? यह तब __stack_chk_fail
glibc में एक फ़ंक्शन को कॉल करता है जो आपके प्रोग्राम को वहीं मारता है।
लेखन कारनामों के संदर्भ में इसके चारों ओर काम करने के तरीके हैं, लेकिन शेलकोड परीक्षण मामले के निर्माण के मामले में आसान तरीका आपके कार्यक्रम को संकलित करना है -fno-stack-protector
।
आधुनिक लिनक्स सिस्टम पर कुछ अन्य विचार हैं। यदि आप सामान्य शेलकोड परीक्षण स्टब लेते हैं:
char buffer[] = {...};
typedef void (* func)(void);
int main(int argc, char** argv)
{
func f = (func) buffer;
f();
return 0;
}
आधुनिक जीसीसी / लिनक्स .rodata
पीई फाइल के सेक्शन को मैप करेगा जो बिना किसी एक्जीक्यूट परमिशन के साथ पढ़ा जाता है। आपको वह बंद करना होगा, जो इस ब्लॉग पोस्ट से कोड नमूने का उपयोग करके किया जा सकता है । मूल विचार: आप mprotect
उन अनुमतियों को जोड़ने के लिए उपयोग करते हैं जिन्हें आप उन पृष्ठों में चाहते हैं जिनमें शेलकोड डेटा रहता है।
यदि आप एक पारंपरिक शोषण परिदृश्य का परीक्षण करने जा रहे हैं, उदाहरण के लिए मेरा बुरा कोड, आपके शेलकोड के साथ तो आपको यह भी सुनिश्चित करना होगा कि स्टैक सरल मामलों के लिए निष्पादन योग्य हो। पीई फ़ाइल स्वरूप निर्धारित करता है कि ढेर निष्पादन योग्य है के लिए एक क्षेत्र शामिल हैं - आपको क्वेरी करने और के साथ इस पर नियंत्रण कर सकते execstack । एक निष्पादन योग्य स्टैक को सक्षम करने के लिए, चलाएं
execstack -s /path/to/myprog
यह एक recompile की आवश्यकता के बिना मनमाना कार्यक्रमों पर किया जा सकता है, लेकिन स्वचालित रूप से स्टैक कैनरी को अक्षम नहीं करेगा क्योंकि ये संकलन पर बेक किए गए हैं।
कि बंद करने के लिए, echo 0 > /proc/sys/kernel/randomize_va_space
।
नहीं, किसी भी शोषण को स्टैक कैनरी (बहुत गैर तुच्छ) के आसपास काम करना चाहिए और या तो execstack
सेट के साथ एक प्रोग्राम ढूंढना होगा , या इसे सेट करना होगा (इसका अर्थ है कि यह पहले से ही किसी भी तरह से मनमाना आदेशों को निष्पादित कर सकता है) या फिर अधिक कठिन तकनीकों का उपयोग करें, जैसे कि libc / return पर लौटना ओरिएंटेड प्रोग्रामिंग।
आप इन विकल्पों के साथ कुछ सुरक्षा (स्टैक स्मैशिंग डिटेक्शन और स्टैक को निष्पादन योग्य बना सकते हैं) को निष्क्रिय कर सकते हैं।
--z execstack
-f no-stack-protector
आप कमांड के साथ बैश के साथ ASLR (एड्रेस स्पेस लेआउट रैंडमाइजेशन) को भी बंद कर सकते हैं:
echo 0 > /proc/sys/kernel/randomize_va_space