Wun Code
منطقة جديدة

الهندسة العكسية

تتعلّم هنا أن تفهم البرنامج من بايتاته: تقرأ الست عشري وترتيب البايتات، وتفكّ التشفير البسيط، وتقرأ الأسمبلي، وتبني محاكيًا لآلة صغيرة، ثم تحلّ تحدّيات تستخرج فيها المفتاح بكودك. كل ذلك في Python داخل متصفّحك، على برامج صغيرة صنعناها لك.

الدروس
17
التحدّيات
6
مراحل الاختبار
3
المدّة
6 ساعات
جلسة Python
>>> prog = bytes.fromhex("01480502210500")>>> prog.hex(" ")'01 48 05 02 21 05 00'>>> print(*disasm(prog), sep="\n")LOAD 0x48
OUT
ADD 0x21
OUT
HALT>>> run(prog)b'Hi'>>> 
هذا ما تبنيه بيدك في مسار تحليل البرامج: مفكّك يقرأ البايتات أوامر، ومحاكٍ ينفّذها.

ثلاثة مسارات

تبدأ من البايت وتنتهي بتحدّيات تستخرج فيها المفتاح بنفسك. كل مسار يبني على الذي قبله، فاتبعها بالترتيب.

الاختبار والشهادة

يُفتح الاختبار حين تُتمّ دروس المنطقة وتحدّياتها كلّها. فيه ثلاث مراحل، سهلة ثم متوسّطة ثم صعبة، في كلٍّ منها سؤالان بلا تلميحات ولا حلول جاهزة، وكل مرحلة تفتح التي بعدها.

  1. المرحلة السهلة

    • قراءة ترويسة ELF
    • فكّ XOR بمفتاح متكرّر
  2. المرحلة المتوسّطة

    • استخراج النصوص بمواضعها
    • المفكّك مع القفز
  3. المرحلة الصعبة

    • المحاكي مع القفز
    • عكس مولّد المفتاح
اختبار الهندسة العكسية 0/3
معاينة

شهادة إتقان

الهندسة العكسية

اسمك هنا

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

المراحل
3 من 3
الأسئلة
6
الفحوص المجتازة
32
هكذا تبدو شهادة إتقان الهندسة العكسية. تظهر باسمك حين تجتاز المراحل الثلاث، وإذا سجّلت الدخول تستطيع أن تُصدر منها نسخة موثّقة لها رقم ورمز QR وصفحة تحقّق، بعد أن نعيد تصحيح إجاباتك على الخادم.

عدّة سريعة ترجع إليها

جداول قصيرة تحتاجها في كل درس وتحدٍّ: التحويل بين الأنظمة، والمحارف، وأحرف struct، والمسجّلات والأوامر، وترتيب البايتات، وأوامر آلتنا الصغيرة.

التحويل بين الأنظمة

عشريست عشريثنائي
00x000000 0000
10x010000 0001
100x0a0000 1010
150x0f0000 1111
160x100001 0000
420x2a0010 1010
650x410100 0001
1270x7f0111 1111
2550xff1111 1111

البايت رقم من 0 إلى 255، يُكتب برقمين ست عشريين أو بثمانية بتات. وفي Python تعرضه بالدالتين hex وbin، وتعيده من نصّه بالدالة int.

hex(42)         '0x2a'
bin(42)         '0b101010'
int("2a", 16)   42
f"{42:08b}"     '00101010'

ترتيب البايتات (endianness)

العدد 0x12345678 في أربعة بايتات من الذاكرة:

كبير الطرف (big)

  1. 12+0
  2. 34+1
  3. 56+2
  4. 78+3

صغير الطرف (little)

  1. 78+0
  2. 56+1
  3. 34+2
  4. 12+3

صغير الطرف يضع البايت الأدنى أولًا، وهو الأشيع في المعالجات. والملوّن هنا البايت الأعلى، والأرقام تحته موضع كل بايت من بداية العدد.

n = 0x12345678
n.to_bytes(4, "big").hex(" ")
'12 34 56 78'
n.to_bytes(4, "little").hex(" ")
'78 56 34 12'

مسجّلات x86-64

المسجّلما يحمله
raxالقيمة التي تُرجعها الدالة
rdi rsi rdx rcx r8 r9الوسائط من الأول إلى السادس
rspقمّة المكدّس
rbpقاعدة إطار الدالة
ripعنوان الأمر التالي

هذا اصطلاح System V في لينكس وماك. أمّا ويندوز فيمرّر الوسائط الأربعة الأولى في rcx وrdx وr8 وr9. ولكل مسجّل اسم لنصفه الأدنى، فالمسجّل eax هو النصف الأدنى من rax.

أشيع أوامر x86-64

الأمرما يفعله
mov a, bينسخ قيمة الثاني إلى الأول
lea a, [m]يضع في الأول عنوان m لا قيمته
add a, bيجمع الثاني إلى الأول
sub a, bيطرح الثاني من الأول
xor a, bيطبّق XOR بين الأول والثاني
inc a / dec aيزيد واحدًا أو ينقص واحدًا
cmp a, bيقارن ويضبط الأعلام
test a, bيطبّق AND ويضبط الأعلام
jmp Lيقفز إلى L دائمًا
je / jz Lيقفز إن تساويا أو كان الناتج صفرًا
jne / jnz Lيقفز إن اختلفا
jg / jle Lيقفز إن كان الأول أكبر، أو أصغر أو يساويه
push aيدفع قيمة إلى المكدّس
pop aيسحب قيمة من المكدّس
call f / retيستدعي دالة، ويعود منها

الأوامر هنا بصيغة Intel كما تعرضها أدوات مثل Ghidra، وفيها الوجهة قبل المصدر. وتعرض أدوات لينكس مثل objdump صيغة AT&T التي تعكس الترتيب وتسبق المسجّل بـ %، فأضف -M intel لتوافق ما هنا. والأمران cmp وtest لا يحفظان الناتج بل يضبطان الأعلام التي تقرؤها القفزات بعدهما، والأمر xor eax, eax طريقة مختصرة لتصفير المسجّل.

جدول ASCII للمحارف المطبوعة

المحارف من 0x20 إلى 0x7e: الصفّ الرقم الست عشري الأعلى، والعمود الأدنى
0123456789abcdef
2xsp!"#$%&'()*+,-./
3x0123456789:;<=>?
4x@ABCDEFGHIJKLMNO
5xPQRSTUVWXYZ[\]^_
6x`abcdefghijklmno
7xpqrstuvwxyz{|}~

اقرأ رمز المحرف من صفّه وعموده: الحرف A في الصفّ 4x والعمود 1، أي 0x41. والمطبوع كلّه بين 0x20 و0x7e، وما خرج عنه ضجيج غالبًا. وفي Python تحوّل المحرف رقمًا بالدالة ord، والرقم محرفًا بالدالة chr.

أحرف تنسيق struct

الحرفالبايتاتالمعنى
<صغير الطرف
>كبير الطرف
!ترتيب الشبكة، وهو كبير الطرف
x1بايت حشو يُتخطّى
B b1بايت بلا إشارة، وبإشارة
H h2عدد قصير بلا إشارة، وبإشارة
I i4عدد صحيح بلا إشارة، وبإشارة
Q q8عدد طويل بلا إشارة، وبإشارة
4s4أربعة بايتات كما هي
struct.unpack("<IHB", data)
struct.calcsize("<IHB")   # 7

نصّ التنسيق في المثال يقرأ أربعة بايتات ثم اثنين ثم واحدًا بترتيب صغير الطرف. وابدأ نصّ التنسيق دائمًا برمز الترتيب، فبدونه يضيف Python حشوًا ليحاذي الحقول.

أوامر الآلة الصغيرة

البايتالأمرمعاملما يفعله
0x00HALTلايوقف التنفيذ
0x01LOADنعميضع المُعامَل في المُراكِم
0x02ADDنعميجمع المُعامَل إلى المُراكِم
0x03XORنعميطبّق XOR بين المُراكِم والمُعامَل
0x04SUBنعميطرح المُعامَل من المُراكِم
0x05OUTلايضيف المُراكِم إلى المخرجات

آلة اخترعناها للتعلّم، تستعملها دروس تحليل البرامج والتحدّيات والاختبار. المُراكِم يبدأ بصفر، والحساب كلّه بباقي القسمة على 256، والأمر ذو المُعامَل طوله بايتان.

المصطلحات

كل مصطلح بالعربية كما نكتبه في الدروس، ومعه اسمه بالإنجليزية لتبحث عنه في المراجع.

البايتbyte
وحدة من ثمانية بتات، رقم من 0 إلى 255
الست عشريhexadecimal
نظام عدّ أساسه 16، يُكتب بالبادئة 0x، والبايت فيه رقمان
ترتيب البايتاتendianness
ترتيب بايتات العدد في الذاكرة، كبير الطرف أو صغير الطرف
القناعbitmask
رقم يُستعمل مع العمليات على البتات ليعزل بتات بعينها
البنيةstruct
حقول بأطوال معلومة مرتّبة في كتلة بايتات، تقرؤها بالدالة struct.unpack
الترويسةheader
حقول في أوّل الملف تصف محتواه، كأبعاد الصورة أو نوع الملفّ
التوقيعmagic number
بايتات في أوّل الملف تميّز صيغته، فلكل صيغة توقيعها
استخراج النصوصstrings
جمع تتابعات المحارف المطبوعة من كتلة بايتات
التفريغ الست عشريhexdump
عرض البايتات صفوفًا، في كلٍّ عنوانها وقيمها الست عشرية ونصّها
التشفير بـ XORxor cipher
تشفير يُفكّ بالمفتاح نفسه، لأن القيمة تعود كما كانت بعد تطبيق XOR مرّتين
العلمflag
نصّ سرّي تستخرجه حين تحلّ التحدّي، دليلًا على أنك كسرته
البصمةhash
رقم يُحسب من البيانات باتجاه واحد، لا يُعاد منه إلى أصله
البحث الشاملbrute force
تجريب كل الاحتمالات الممكنة حتى يُوجد المطابق
الأسمبليassembly
لغة قريبة من أوامر المعالج، كل سطر فيها أمر واحد
المسجّلregister
خانة صغيرة سريعة في المعالج تحمل قيمة أثناء التنفيذ
اصطلاح الاستدعاءcalling convention
القواعد المتّفق عليها لتمرير الوسائط وإرجاع القيمة
المكدّسstack
ذاكرة تنمو نحو العناوين الأدنى، تحفظ فيها الدالة وسائطها وعنوان عودتها
إطار المكدّسstack frame
الحيّز الذي تحجزه الدالة على المكدّس لمتغيّراتها وعنوان عودتها
تدفّق التحكّمcontrol flow
مسار التنفيذ عبر الشروط والقفزات والحلقات
المُراكِمaccumulator
خانة الآلة الصغيرة التي تجري فيها الحسابات، وتبدأ بصفر
الآلة الافتراضيةvirtual machine
برنامج ينفّذ بايتكود كأنه معالج صغير
البايتكودbytecode
أوامر مرمَّزة بايتات، تنفّذها آلة افتراضية لا المعالج مباشرة
المفكّكdisassembler
أداة تحوّل رمز الآلة أو البايتكود إلى أسماء تعليمات مقروءة
المحاكيemulator
برنامج ينفّذ تعليمات آلة أخرى خطوة خطوة
الترقيعpatching
تغيير بايتات البرنامج لتعديل سلوكه
المجموع الاختباريchecksum
رقم يُحسب من البايتات للتحقّق من سلامتها، مثل CRC32
التحدّي التعليميcrackme
برنامج صغير صُنع للتعلّم، تعكس فيه دالة التحقّق لتستخرج المفتاح

أسئلة قبل أن تبدأ

أجوبة مختصرة لأكثر ما يُسأل عنه قبل دخول المنطقة.

هل أحتاج إلى أدوات خاصّة؟

لا، فكل شيء يعمل في Python داخل متصفّحك. لا تثبيت ولا أدوات نظام، وكل البرامج التي تحلّلها بايتات صغيرة مضمَّنة في الدرس.

هل هذا قانوني؟

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

هل أحتاج أن أعرف الأسمبلي من قبل؟

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

ما علاقة Python بالهندسة العكسية؟

لغة Python أداة ممتازة لقراءة البايتات ومعالجتها، ومكتباتها القياسية مثل struct وzlib وhashlib تكفي لتحليل الصيغ وفكّ التشفير البسيط وبناء محاكٍ.

كيف تختلف التحدّيات عن الدروس؟

في التحدّيات تلميحات أقلّ، والفحص يتحقّق من المفتاح الذي يحسبه كودك على عدّة حالات مخفيّة، فلا ينفع نسخ جواب جاهز.

هل أحصل على شهادة؟

نعم، حين تجتاز اختبار الهندسة العكسية بمراحله الثلاث تحصل على شهادة إتقان باسمك، كما في اختبارات اللغات.

ابدأ من أوّل بايت

الدرس الأول قصير، تقرأ فيه أوّل بايتات ملفّ وتعرف متى تكون الهندسة العكسية مشروعة.