ما عقل الطالب في عالم الكمبيوتر قادر على

يوم جيد.

بعد أن انتهيت من كتابة نص آخر على Bash ، أدركت أن كل شيء يجب أن يكون مختلفًا تمامًا ، ولكن كل شيء كان ناجحًا. أريد أن أوضح لك ما كتبته الألفاظ والعكازات من أجل حل المشكلة ، لكن حتى الآن بدون سيارة معرفة. وبعبارة أخرى ، كاريكاتير البرمجة.

مهمة


أصبح شيء ضروري ل:
  • طبع الكثير من القوافي لكلمة ، باستثناء المربعات
  • عبرت العديد من القوافي من كلمتين

من اجل ماذا؟ حسنًا ، إنه كذلك - وهذا كل شيء.
من لا يعرف ، فإن القافية المربعة (في لغة مشتركة - مربع) هي كلمتين تحتويان على آخر حرفين في الهجاء ، والتي (في كثير من الأحيان هذا فقط) تجعلها قافية. على سبيل المثال ، الورود - الصقيع. الاطارات هي سيارة. لم يتم اعتماد استخدام المربعات في الإصحاح الحديث بشكل خاص من قِبل الناس ، بسبب بدائيتها.

قرار


بدا لي أن الحل الأبسط هو كتابة نص برمجي على Bash ، باستخدام مولد القافية الموجود بالفعل - HOST ، والذي يقوم أولاً بتحديده وفقًا للتناسق ، وليس عن طريق الإملاء. ما هو المضيف؟ لأنه إذا قمت بتحديد الاسم الحقيقي للموقع - فسيقولون ذلك الإعلان. لماذا لا تستمر في استخدامه؟ أولاً ، على الرغم من ميزته في اختيار القوافي وفقًا للتناسق ، فإنه غالبًا ما ينتج مربعات. ثانياً ، لا يزال عليك التفكير في أدمغتك ، وقضاء بعض الوقت في التبديل بين علامات التبويب ، وقوة تذكر الكلمات المتكررة في القوائم للعثور على القوافي لكلمتين.

الحصول على قوافي قوية


ماذا اعرف أعلم عن الأداة المساعدة wget التي تقوم بتنزيل الصفحة على عنوان URL المحدد. حسنًا ، نحن نلبي الطلب - نحصل على صفحة HTML في الملف ، والتي تسمى كلمة للقافية. على سبيل المثال ، ابحث عن كلمة "هنا":

wget https://HOST/rifma/ 

لكنني فقط بحاجة إلى قائمة الكلمات ، وكيفية التخلص من كل شيء آخر؟ ننظر ونرى أن قائمة الكلمات مرتبة ، على الرغم من أنها قد تبدو غريبة ، في شكل قائمة ، وتكون الكلمات في العلامات <li> </li>. حسنًا ، لدينا أداة مساعدة رائعة - واكتبها:


 cat $word | grep '<li>' | sed -e "s%<li>%%" | sed -e "s%</li>%%" | sed -e "s/ //g" | sed -e "/^$/d" 1> $word 

أولاً ، من ملف الكلمات ، حدد الأسطر التي تحتوي على العلامة <li> - نحصل على مجموعة من العلامات الفارغة والأسطر مع الكلمات. نزيل العلامة نفسها وإغلاقها - يتم استخدام رموز النسبة المئوية هنا بدلاً من الخطوط المائلة لأن العلامة </li> تحتوي بالفعل على شرطة مائلة ، وهذا هو السبب في أن sed لا يفهمك قليلاً. ومع الاهتمام ، كل شيء على ما يرام. نقوم بإزالة جميع المسافات من الملف ، وحذف الأسطر الفارغة. فويلا - قائمة كاملة من الكلمات.

لإزالة الكلمات القافية بسبب الحروف الأخيرة ، حدد آخر حرفين من الكلمة الأصلية وقم بتنظيف القائمة:

 squad=${word:((${#word}-2)):2} cat $word | sed -e "/.$squad$/d" 1> $word 

ننظر ، جرب - كل شيء يعمل ... إذن ، ولكن أين توجد قائمة "play"؟ وبالنسبة لكلمة "أنا قادم"؟ الملف فارغ! وهذا كله لأن هذه الكلمات هي أفعال ، ونحن نعرف ما يفعلونه مع أولئك الذين يقفون إلى أفعال. قافية الفعل أسوأ من المربع الأول ، بالنسبة لمعظم الأفعال في اللغة الروسية ، وحتى مع كل النهايات نفسها ، وهذا هو السبب في أنها لم تظهر في الملف النهائي بعد التحقق من النهايات.

ومع ذلك ، ليس في عجلة من امرنا. لكل كلمة لا توجد قوافي فحسب ، بل أيضًا قراءات ، تبدو أحيانًا أفضل بكثير من القوافي - لأنها أيضًا صوائف (صفة فرنسية ، من صخرية لاتينية - تبدو جيدة).

الحصول على assonances


هنا تبدأ المتعة: تظهر أشكال التطابق على عنوان URL منفصل ، وفي الصفحة نفسها ، عن طريق تنفيذ برنامج نصي وإرسال طلب HTTP وتلقي استجابة. كيفية معرفة wget "للنقر على زر؟ لكن بأي حال من الأحوال. إنه لأمر محزن.

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

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

أين ترسل؟ ماذا ترسل؟ طلب HTTP إلى عنوان IP الخاص بالخادم ، هناك شيء مثل GET ... ثم هناك شيء HTTP / 1.1 ... نحتاج إلى معرفة ماذا وأين يرسل المتصفح. تثبيت wireshark ، إلقاء نظرة على حركة المرور:

0040 37 5d a3 84 27 e7 fb 13 6d 93 ed cd 56 04 9d 82 7]£.'çû.m.íÍV...
0050 32 7c fb 67 46 71 dd 36 4d 42 3d f3 62 1b e0 ad 2|ûgFqÝ6MB=ób.à.
0060 ef 87 be 05 6a f9 e1 01 41 fc 25 5b c0 77 d3 94 ï.¾.jùá.Aü%[ÀwÓ.

أم ... ماذا؟ أوه نعم ، لدينا HTTPS. ما يجب القيام به ترتيب هجوم MITM على نفسك؟ من الناحية المثالية ، سوف تساعدنا الضحية نفسها.

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

الحوار مع المحطة
 telnet IP PORT Trying IP... Connected to IP. Escape character is '^]'. GET /rifma/%D0%BC%D0%B0%D1%82%D1%8C?mode=block&type=asn HTTP/1.1 Host: HOST Accept-Language: en-US,en;q=0.5 X-Requested-With: XMLHttpRequest Connection: close HTTP/1.1 400 Bad Request Server: nginx/1.8.0 Date: Sun, 03 Nov 2019 20:06:59 GMT Content-Type: text/html; charset=utf-8 Content-Length: 270 Connection: close <html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> <hr><center>nginx/1.8.0</center> </body> </html> Connection closed by foreign host. 
XLI. مهلا يا. في الواقع ، ما كنت أتوقع عن طريق إرسال طلب HTTP العارية إلى منفذ HTTPS. هل هو تشفير الآن؟ كل هذا العناء مع مفاتيح RSA ، ثم مع SHA256. ولماذا ، هناك OpenSSL لمثل هذه الأمور. حسنًا ، نحن نعرف بالفعل ما يجب فعله ، فقط قم بإزالة حقلي الإحالة وملفات تعريف الارتباط - أعتقد أنهما لن يؤثران بشكل كبير على الأمر:

الحوار مع المحطة
 openssl s_client -connect IP:PORT { , } GET /rifma/%D0%B7%D0%B4%D0%B5%D1%81%D1%8C?mode=block&type=asn HTTP/1.1 Host: HOST User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: text/javascript,text/html,application/xml,text/xml,*/* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br X-Requested-With: XMLHttpRequest Connection: keep-alive HTTP/1.1 200 OK Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding Status: 200 OK Date: Sun, 03 Nov 2019 20:34:33 GMT Set-Cookie: COOKIE X-Powered-By: Phusion Passenger 5.0.16 Server: nginx/1.8.0 + Phusion Passenger 5.0.16 Expires: Thu, 01 Jan 1970 00:00:01 GMT Cache-Control: no-cache Strict-Transport-Security: max-age=31536000 Content-Security-Policy: block-all-mixed-content Content-Encoding: gzip 



هل هذا كشيكم على الخادم؟ حسنًا ، أجابني 200 موافق على الأقل ، مما يعني أن ملفات تعريف الارتباط والمراجع لا تؤثر على أي شيء. ضغط Gzip ، ولكن يتم نسخ أحرف ASCII عند النسخ. وبالمثل ، يمكنك إزالة خط قبول الترميز . كل شيء على ما يرام - لقد حصلنا على مستند HTML ، الآن مع assonances. ولكن إليك سؤالان: كيفية تشغيل OpenSSL وتمرير البيانات إليه باستخدام برنامج نصي؟ وكيف تقرأ المخرجات ، إذا بعد تلقي الإجابة ، سنبقى كما لو كنا في "غلاف" OpenSSL؟ إذا كنت تستطيع التفكير في شيء مع الثانية ، ولكن مع الأول ...

من الجيد أن يكون هناك حبر ، حيث قرأت عن الأداة تتوقع ، والتي تعمل على أتمتة عملية التفاعل مع البرامج التي تنتظر التفاعل البشري. والأكثر جاذبية هو وجود أمر autoexpect الذي يولد نصًا متوقعًا لإجراءاتك. حسنًا ، ركض ، افعل كل شيء وإليك النص النهائي. إنه ضخم للغاية ، وكل ذلك لأن OpenSSL يعرض الشهادات والمفاتيح ويتوقع أن يعرض كل هذا. هل نحتاج هذا؟ لا. نقوم بهدم المطالبة الأولى ، مع ترك فاصل السطر الأخير فقط. نزيل أيضًا حقلي User-Agent و Accept من طلبنا - لا يؤثران على أي شيء. لذلك ، دعونا نبدأ ذلك. يتم تنفيذ البرنامج النصي ، ولكن أين هو مستند HTML المطلوب؟ توقع أكلت. من أجل جعله يبصق بها ، تحتاج إلى وضع:

 set results $expect_out(buffer) 

قبل نهاية البرنامج النصي - هذه هي الطريقة التي سيتم بها كتابة إخراج الأمر المتوقع الذي تم تنفيذه وعرضه. باختصار ، شيء مثل هذا:

توقع السيناريو
 #!/usr/bin/expect -f set timeout -1 spawn openssl s_client -connect IP:PORT match_max 100000 expect -exact " ---\r " send -- "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1\rHost: HOST\rAccept-Language: en-US,en;q=0.5\rX-Requested-With: XMLHttpRequest\rConnection: close" expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1\r Host: HOST\r Accept-Language: en-US,en;q=0.5\r X-Requested-With: XMLHttpRequest\r Connection: close" send -- "\r" set results $expect_out(buffer) expect -exact "\r " send -- "\r" expect eof 

لكن هذا ليس كل شيء! كما ترون ، كان عنوان URL للطلب ثابتًا في جميع الأمثلة ، ومع ذلك ، فهو المسؤول عن الكلمة التي سيتم عرض التقاويم عليها. وهكذا اتضح أننا سوف نبحث باستمرار عن كلمة "٪ d0٪ b7٪ d0٪ b4٪ d0٪ b5٪ d1٪ 81٪ d1٪ 8c" في ASCII أو "هنا" في UTF-8. ما يجب القيام به بالطبع ، فقط في كل مرة تولد نصًا جديدًا يا أصدقاء! ليس فقط autoexpect 'أوم ، ولكن مع صدى ، ل في بلدنا ، لا شيء يتغير إلا الكلمة. وعاشت المشكلة الجديدة: كيف يمكننا بطريقة ما ترجمة كلمة من السيريلية بذكاء إلى تنسيق URL؟ شيء للمحطة ليست خاصة أيضا. حسنا ، لا شيء ، هل يمكننا؟ يمكننا:

انظروا الى ما استطيع
 function furl { furl=$(echo "$word" | sed 's::%d0%90:g;s::%d0%91:g;s::%d0%92:g;s::%d0%93:g;s::%d0%94:g;s::%d0%95:g;s::%d0%96:g;s::%d0%97:g;s::%d0%98:g;s::%d0%99:g;s::%d0%9a:g;s::%d0%9b:g;s::%d0%9c:g;s::%d0%9d:g;s::%d0%9e:g;s::%d0%9f:g;s::%d0%a0:g;s::%d0%a1:g;s::%d0%a2:g;s::%d0%a3:g;s::%d0%a4:g;s::%d0%a5:g;s::%d0%a6:g;s::%d0%a7:g;s::%d0%a8:g;s::%d0%a9:g;s::%d0%aa:g;s::%d0%ab:g;s::%d0%ac:g;s::%d0%ad:g;s::%d0%ae:g;s::%d0%af:g;s::%d0%b0:g;s::%d0%b1:g;s::%d0%b2:g;s::%d0%b3:g;s::%d0%b4:g;s::%d0%b5:g;s::%d0%b6:g;s::%d0%b7:g;s::%d0%b8:g;s::%d0%b9:g;s::%d0%ba:g;s::%d0%bb:g;s::%d0%bc:g;s::%d0%bd:g;s::%d0%be:g;s::%d0%bf:g;s::%d1%80:g;s::%d1%81:g;s::%d1%82:g;s::%d1%83:g;s::%d1%84:g;s::%d1%85:g;s::%d1%86:g;s::%d1%87:g;s::%d1%88:g;s::%d1%89:g;s::%d1%8a:g;s::%d1%8b:g;s::%d1%8c:g;s::%d1%8d:g;s::%d1%8e:g;s::%d1%8f:g;s::%d1%91:g;s::%d0%81:g')} 

إجمالًا ، لدينا برنامج نصي يحول الكلمة إلى نص ASCII ، مما يؤدي إلى إنشاء برنامج نصي آخر يطلب من خلال صفحة خادم OpenSSL في الموقع مع عمليات التطابق. ثم نقوم بإعادة توجيه إخراج البرنامج النصي الأخير إلى الملف ، وبأسلوب قديم نقوم بتمريره عبر "عوامل التصفية" الخاصة بالزيادة ، المربعات وإضافتها إلى الملف.

تقاطع مجموعات. يؤدي


في الواقع هذا هو بالضبط ما يسبب أقل المشاكل. ننفذ الإجراءات المذكورة أعلاه لكلمتين ، ثم من قائمتين نقارن كل كلمة بكل منها وإذا تم العثور على تطابق ، نعرضها. الآن لدينا برنامج نصي يأخذ كلمتين في المدخلات ويعرض قائمة بالكلمات التي تقفيها مع كليهما ، مع الأخذ في الاعتبار التباينات ، وكل هذا دون التبديل يدويًا بين علامات التبويب الأربعة وتذكر الكلمات "بالعين" - هذا كل شيء تم جمعها وتسجيلها وتجاهلها تلقائيًا. غرامة.

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

Source: https://habr.com/ru/post/ar474448/


All Articles