كيف يمكنني تحديد موقع كود تفكيكها داخل قابل للتنفيذ؟

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

سؤال

ولقد حصلت على ملف قابل للتنفيذ (C ++، I386، وقد تم تجميعها تحت ماك / X النمر، إذا كان يهم) الذي يحتوي على الشوائب. الإصلاح للخلل واضح ومباشر - هناك مكان في التعليمات البرمجية حيث أنه يدعو شوكة ()، وأنه لا ينبغي. لأن الإصلاح هو بسيط، ولأن اعادة تجميع القابل للتنفيذ من الصفر سيكون من الصعب في هذه المرحلة (لا تسأل)، أود أن مجرد تصحيح للتنفيذ / ملف ثنائي مباشرة.

وكخطوة أولى نحو ذلك، ركضت "otool -tV MyExecutableName" على بلدي للتنفيذ، وفويلا، لقد وجدت هذا في إخراج التفكيك:

./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d        subl    $0x10,%esp
0002ce10        calll   0x0051adac
0002ce15        movzbl  0x14(%ebp),%esi
0002ce19        calll   0x00850ac9      ; symbol stub for: _fork
0002ce1e        cmpl    $0x00,%eax
0002ce21        jll     0x0002cf02
0002ce27        jle     0x0002ce34
[... many more lines omitted ...]

وإذا ما أريد القيام به هو استبدال شفرة التشغيل في خط 0002ce19، بحيث بدلا من calll'ing _fork، فإنه ببساطة يقفز دون قيد أو شرط إلى حالة الفشل (أي أنه ينبغي أن تتصرف كما لو شوكة () عاد -1 )

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

1) ما بايت ينبغي أن أكتب في مواقع 0002ce19 من خلال 0002xe1d للحصول على ما أريد؟ أفترض أنه سيكون ما يعادل تجميعها من "0x0002cf02 أحزاب اللقاء المشترك"، ولكن كيف يمكنني معرفة ما هي تلك بايت؟

2) ويبدو أن إزاحة المطبوعة من قبل "otool -tV" لتكون إزاحة إلى قطاع __TEXT القابل للتنفيذ. كيف يمكنني معرفة دلتا بايت بين إزاحة المطبوعة والجزء العلوي من الملف، حتى أستطيع أن تعديل / تصحيح بايت الصحيحة داخل الملف؟

وشكرا على اي النصيحة التي يمكن أن تعطي!

هل كانت مفيدة؟

المحلول

وأنا لست على دراية ماك / X ولكن استطيع ان اعطيكم بعض التلميحات.

والطريقة الصحيحة لإصلاح ذلك، هو استخدام المجمع لرأب الصدع الملف.

0002ce19        calll   0x00850ac9

ويمكن استبدالها مع

0002ce19        movl   eax, -1 ; mov eax, 0xFFFFFFFF

وللإزاحة التي تراها هي النسبية، وبالتالي لا يمكنك العثور عليها في الملف.
على سبيل المثال، jll 0x0002cf02 jll 0x000000DF الواقع

إذا أنا الصحيح، وكتلة التعليمات البرمجية أدناه

0002ce19        calll   0x00850ac9      ; symbol stub for: _fork
0002ce1e        cmpl    $0x00,%eax
0002ce21        jll     0x0002cf02
0002ce27        jle     0x0002ce34

وسوف يكون هذا النموذج تجميعها (20 بايت):

0x  E8   AB3C8200
    83F8 00
    0F8C DF000000
    0F84 0B000000

وإذا كان هذا التسلسل هو فريد من نوعه في ملف ثم يمكنك محاولة تغيير E8AB3C8200 إلى B8FFFFFFFF، إذا لم تتمكن من استخدام المجمع.

نصائح أخرى

وربما أسهل سيكون لوضع mov $-1, %eax في مكان المكالمة. يمكنك معرفة ما بايت الذي يتوافق من خلال وضعه في ملف .S، وجمع ذلك، وإلقاء النتيجة، الحشو مع nops إذا كان أقصر من موقع التصحيح. أحصل على "وما يليها B8 وما يليها وما يليها وما يليها"، التي تناسبها فقط.

ويمكنك العثور على بداية __TEXT عن طريق تشغيل otool -l وتبحث عن الإزاحة.

OTX و <لأ href = "http://ridiculousfish.com/hexfiend/" يختلط = "نوفولو noreferrer"> عرافة شرير سوف نكون اصدقاء لكم. سوف OTX تعطيك التفكيك مع إزاحة ملف النسبي، وسوف عرافة شرير تتيح لك التصحيح من القفزة. تذكر أن 0x90 هو (x86) وشفرة التشغيل لNOP، لذلك 9090909090 هو البديل المناسب للدعوة شوكة (). (فقط نأخذ في الاعتبار أنه لن تولد قيمة الإرجاع، وذلك شيء غريب قد ينتهي في EAX).

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