উত্তর:
স্ট্যাক সুরক্ষা সংকলক দ্বারা সম্পন্ন করা হয় (স্ট্যাকটিতে কিছু অতিরিক্ত ডেটা যুক্ত করুন এবং কিছুটা কল এ স্ট্যাশ করুন, ফিরে আসার ক্ষেত্রে স্যানিটি পরীক্ষা করুন)। সংশোধন না করে এটি অক্ষম করতে পারে না। এটি সত্যিকার অর্থেই ...
ভনব্র্যান্ড কী আছে তার প্রসারিত করতে (সঠিকভাবে, +1) বলেছেন, লিনাক্সের স্ট্যাক সুরক্ষার দুটি অংশ রয়েছে।
স্ট্যাক ক্যানারিগুলি সংকলক-প্রয়োগকারী বৈশিষ্ট্য ভনব্র্যান্ডকে বোঝায়। এগুলি একটি পুনঃনির্দেশনা ব্যতীত অক্ষম করা যায় না।
এটি নিজের কাছে প্রমাণ করার জন্য এবং নীচের কোডটি কীভাবে তারা কাজ করে তা দেখুন:
#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
আউটপুট একত্রিত হয়ে এবং পড়তে খুশি হওয়ায় এখন এই ( ) কে gnu তে একটি সংকলন করুন। গুরুত্বপূর্ণ বিষয়টি হ'ল 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
যে পৃষ্ঠাগুলিতে শেলকোড ডেটা থাকে সেগুলিতে আপনি যে অনুমতিগুলি চান তা যুক্ত করতে ব্যবহার করেন।
আপনি যদি শেলকোড সহ একটি traditionalতিহ্যবাহী শোষণের দৃশ্যের উদাহরণস্বরূপ আমার উপরের খারাপ কোডটি পরীক্ষা করতে যাচ্ছেন তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে সহজ ক্ষেত্রে স্ট্যাক কার্যকর হয়। পিই ফাইল ফর্ম্যাটতে স্ট্যাকটি কার্যকরযোগ্য কিনা তা নির্ধারণের জন্য একটি ক্ষেত্র রয়েছে - আপনি এক্সিকিস্ট্যাকের সাহায্যে এটিকে কোয়েরি করতে এবং নিয়ন্ত্রণ করতে পারেন । এক্সিকিউটেবল স্ট্যাক সক্ষম করতে, চালান
execstack -s /path/to/myprog
এটি পুনরায় কম্পাইলের প্রয়োজন ছাড়াই নির্বিচারে প্রোগ্রামগুলিতে করা যেতে পারে তবে স্ট্যাক ক্যানারিগুলি স্বয়ংক্রিয়ভাবে অক্ষম করবে না কারণ এগুলি সংকলনে বেক করা হয়েছে।
এটি বন্ধ করতে echo 0 > /proc/sys/kernel/randomize_va_space
,।
না। যে কোনও শোষণের জন্য অবশ্যই স্ট্যাক ক্যানারিগুলির চারপাশে কাজ করা উচিত (খুব অল্প তুচ্ছ) এবং হয় execstack
সেট সহ একটি প্রোগ্রাম সন্ধান করুন , বা সেট করুন (এর অর্থ এটি ইতিমধ্যে নির্বিচারে আদেশগুলি কার্যকর করতে পারে) অথবা অন্যথায় আরও কঠিন কৌশলগুলি ব্যবহার করা যেতে পারে, যেমন লিবিসি / রিটার্নে ফিরে আসা ওরিয়েন্টেড প্রোগ্রামিং।
আপনি এই বিকল্পগুলির সাহায্যে কিছু সুরক্ষা (স্ট্যাকের স্ম্যাশিং সনাক্তকরণ এবং স্ট্যাকটিকে কার্যকরযোগ্য করে তোলা) অক্ষম করতে পারেন।
--z execstack
-f no-stack-protector
আপনি কমান্ডের সাহায্যে ASLR (ঠিকানা স্থান বিন্যাস র্যান্ডমাইজেশন র্যান্ডমাইজেশন) বন্ধ করতে পারেন:
echo 0 > /proc/sys/kernel/randomize_va_space