كيف يمكنني تحديد موقع كود تفكيكها داخل قابل للتنفيذ؟
-
22-07-2019 - |
سؤال
ولقد حصلت على ملف قابل للتنفيذ (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).