10-09-2022, 04:01 PM
أقصد هكذا
XOR EAX, EAX
إنه أكثر كفاءة.
كود التشغيل أقصر من
MOV EAX, 0
ب 2 bytes أي word
، ويتعرف المعالج على الحالة الخاصة ويعاملها على أنها
MOV EAX, 0
سيحتوي MOV EAX, 0 على بايت فارغ (null) في assembled bytes ، بينما XOR EAX, EAX لا يحتوي على بايت فارغ.
أقصد هنا
'0\'
أو
x00\
يعد هذا أمرًا بالغ الأهمية للعديد من عمليات الاستغلال نظرًا لأن المصطلح الشائع في كود C يقرأ حتى يكون لديك بايت فارغ.
عادةً ما يتم تخزين String variables كمصفوفات من الأحرف ، منتهية ببايت فارغ.
لا يمكننا دفع PUSH أو نقل MOV قيمة 0 لأن ذلك سيؤدي تلقائيًا إلى إنشاء بايت فارغ (x00\) والذي سيوقف shellcode. وبدلاً من ذلك ، سننشئ null في EAX عن طريق إجراء XOR مع نفسها ثم دفع تلك القيمة إلى stack.
ختام
في architectures الحديثة ، سيكون XOR أسرع لأن السجل مصفر في rename stage دون استخدام أي وحدة تنفيذ.