الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الهندسه العكسيه مع LD_PRELOAD

مغلق
بدأه Qnix في 19 نوفمبر 2005 · 3 رد · 1,481 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

اليوم سوف اقوم بشرح طريقه جديده من نوعها في عمليه exploiting & hijacking functions في برامج التشغيل

الموصله ديناميكيا ( اتحدث عن ليونكس )

evil-linux1.jpg

هذه التقنيه الجديده من نوعها والخاصه بنظام ليونكس تمكنك من التغيير في فنكشن محدد لتتحكم فيه عن طريق مكتبات ديناميكيه

تقوم بعمل load لها عن طريق LD_PRELOAD .

ال LD_PRELOAD هي خاصيه قويه في ليونكس تعالج المكتبات الديناميكيه التي تستعمل من قبل البرامج .

مثلا لدينا هاذا الكود C

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
        char passwd[] = "!#$%^&*()(*&^%$%^&*()";

        if(argc < 2)
        {
                printf("%s <passwd>\n",argv[0]);
                return(0);
        }
        if(!strcmp(passwd, argv[1]))
        {
                printf("Correct passwd ...\n");
                return(1);
        }
        printf("Wrong passwd ....\n");
        return(0);
}

مثل ماتشوف الكود هاذا راح يقبل اوامر من سطر الاوامر مباشره ليقارن المدخل الاول argv[1] مع passwd

اذا كان المدخل مشابه ل passwd راح يقولك Correct passwd ... واذا كان المدخل خاطء راح يقولك Wrong passwd ...

لنقوم بتجميع البرنامج وتشغيله

Qnix dev # gcc passwd.c -o passwd
Qnix dev # ./passwd
./passwd <passwd>

قمنا بتجميعه وتشغيله .. والان لنعتبر انني لا اعرف ماهو الباسورد ولدي هاذا البرنامج واريد عمل hijacking ل strcmp()

لكي اقوم بتغير قيمه ال passwd واختيارها بنفسي <_<

الان سوف نقوم بعرض ال dynamic libs المستخدمه من قبل البرنامج

Qnix dev # ldd passwd
        linux-gate.so.1 =>  (0xffffe000)
        libc.so.6 => /lib/libc.so.6 (0x40032000)
        /lib/ld-linux.so.2 (0x40000000)

طبعا جميع هذه المكتبات يتم معالجتها عن طريق LD_PRELOAD ... الان نحن سنقوم بكتابه مكتبه مشاركه تقوم

بعمل hijack ل strcmp() وتغير قيمتها من s1 الى s2 .

سوف نقوم الان بكتابه الكود

#include <stdio.h>
#include <string.h>

int strcmp(const char *s1, const char *s2)
{
        printf("Real passwd : %s\n",s1);
        printf("Hijacked    : %s\n",s2);

        return(0);
}

هاذا الكود سوف يقوم بارجاع fixed value للداله strcmp()

وسوف يعرض لنا ال s1 وال s2

ال s1 : هي القيمه الحقيقه في البرنامج وهي passwd ... كما ترون

في الكود هاذا الكود

if(!strcmp(passwd, argv[1]))

كما مبين في الشكل ان ال

passwd = s1

argv[1] = s2

سوف نقوم الان بتجميع الكود وتشغيله ونرى ماذا سيحدث

Qnix dev # gcc -fPIC -c hijack.c -o hijack.o
Qnix dev # gcc -shared hijack.o -o hijack.so

قمنا بتجميع البرنامج ... الان سوف نقوم بادخاله عن طريق LD_PRELOAD ( هي خاصه ب bash )

وبعدها نقوم بتشغيل البرنامج مباشره ... فالبرنامج سوف يقوم بتشغيل هذه المكتبه وهي سوف تقوم بتغيير القيمه s1

الى s2 وارجاعها على انها equal

( لاننسى ان ال return 0; دائما يعيد قيمه مساويه )

Qnix dev # LD_PRELOAD="./hijack.so" ./passwd aaaa
Real passwd : !#$%^&*()(*&^%$%^&*()
Hijacked    : aaaa
Correct passwd ...

تمت العمليه تم ارجاع قيمه s2 على انها Equal :lol:

صوره:

rev1.jpg

قمت بأنشاء فيديو عن هذه الطريقه لكي يوضح عملها اكثر .... يمكن الحصول عليه من هنا

http://www.0x11.org/rewlp.html

( اي استفسار ارجو طرحه هنا بدون تردد ... وإن شاء الله نشوف تفاعل مع الموضوع )

تحياتي

تم تعديل هذه المشاركة بواسطة Qnix في 19 نوفمبر 2005 في 21:34

#2

السلام عليكم

اولاً اريد ان احيك على مجهودك الرائع, ولكن للاسف جميع الامثلة هى على بيئة اللينكس وقليلين جدين من يستخدم بيئة اللينكس..

لدى سؤال, ما سبب استخدام برنامج password للدالة strcmp الموجودة فى المكتبة الديناميكية وإهمالها الاخرى الموجوده فى المكتبة الإستاتيكيه..

هل يعنى هذا انه فى بيئه اللينكس يمكنك تغير جميع دوال برنامج معين لمجرد انك استخدمت مكتبة ديناميكيه اثناء تحميل البرنامج..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3
اقتباس
اولاً اريد ان احيك على مجهودك الرائع, ولكن للاسف جميع الامثلة هى على بيئة اللينكس وقليلين جدين من يستخدم بيئة اللينكس

حياك الله ... عند كتابتي هذه المواضيع اعلم انه قله من يراها ... لكن ان لم يستفد منها اليوم سوف يستفاد منها غدا . إن شاء الله

اقتباس
لدى سؤال, ما سبب استخدام برنامج password للدالة strcmp الموجودة فى المكتبة الديناميكية وإهمالها الاخرى الموجوده فى المكتبة الإستاتيكيه

كما تعلم برنامج passwd الذي قمت بكتابته هو ديناميكي في الاساس ... طبعا كما تعلم اثناء عمليه الكومبايل

هاذا البرنامج يعتمد ( على حسب ماكتب ) على مكتبات خاصه ... وهي مكتبات موجوده في النظام ...

بعض الاحيان هاذا الهجوم يكون ثغره في مكتبه وليس في البرنامج ... او تكون الثغره في الفنكشن نفسها ...

ال Gcc بشكل اعتيادي سوف يقوم باخراج passwd وسيكون موصل ديناميكيا الا لو اضفت -static

انظر الى هاذا المثال

Qnix dev # gcc passwd.c -o passwd; LD_PRELOAD="./hijack.so" ./passwd aaaa
Real passwd : !#$%^&*()(*&^%$%^&*()
Hijacked    : aaaa
Correct passwd ...

هنا قمت بعمليه تجميع البرنامج على انه موصل ديناميكيا طبعا نجح الهجوم ....

Qnix dev # gcc passwd.c -o passwd -static; LD_PRELOAD="./hijack.so" ./passwd aaaa
Wrong passwd ....

اما هنا لم ينجح الهجوم لاني قمت باضافه خيار -static للكومبايلر على انه يكون موصل ستاتيكيا .

اما الفرق هو هنا

Qnix dev # gcc passwd.c -o passwd; du -h passwd
8.0K    passwd
Qnix dev # gcc passwd.c -o passwd -static; du -h passwd
496K    passwd

كما ترى البرنامج الديناميكي اصغر بكثير من البرنامج الاستاتيكي ... لكنه اكثر حمايه <_<

فهاذا نوع من انواع التصدي لهاذا النوع من الهجمات .....

اقتباس
هل يعنى هذا انه فى بيئه اللينكس يمكنك تغير جميع دوال برنامج معين لمجرد انك استخدمت مكتبة ديناميكيه اثناء تحميل البرنامج..

طبعا ... لكن ليس كل الدوال ...

تم تعديل هذه المشاركة بواسطة Qnix في 19 نوفمبر 2005 في 20:41

#4

صار لازم غير للينوكس بسرعة :P

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

هذا الموضوع مغلق.

مواضيع مشابهة