ما الذي يستطيع عقل الطالب الذي يتعلمه عن عالم الكمبيوتر؟

سلام عليكم.

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

مهمة


أصبح شيئاً ضرورياً:

  • عرضت قوافي كثيرة للكلمة ما عدا المربعات
  • عبرت القوافي الكثيرة لكلمتين

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

حل


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

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

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

wget https://HOST/rifma/здесь

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

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

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

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

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

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

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

نحصل على السجع

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

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

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

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

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.

يا. هيهيهي. في الواقع، هذا ما كنت أتوقعه عند إرسال طلب HTTP مجرد إلى منفذ HTTPS. هل يجب علينا التشفير الآن؟ كل هذه الضجة مع مفاتيح RSA، ثم مع SHA256. لماذا، هناك بينسل لمثل هذه الأشياء. حسنًا، نحن نعرف بالفعل ما يجب فعله، سنقوم فقط بإزالة حقلي المُحيل وملفات تعريف الارتباط أولاً - أعتقد أنهما لن يؤثرا كثيرًا على الأمر:

الحوار مع المحطة

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، الآن مع السجعات. ولكن هناك سؤالان: كيفية تشغيل OpenSSL ونقل البيانات إليه باستخدام برنامج نصي؟ وكيف نقرأ المخرجات إذا بقينا بعد تلقي الرد في "صدفة" OpenSSL؟ إذا كان بإمكانك التوصل إلى شيء مع الثانية، ولكن مع الأول...

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

set results $expect_out(buffer)

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

نتوقع السيناريو

#!/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.1rHost: HOSTrAccept-Language: en-US,en;q=0.5rX-Requested-With: XMLHttpRequestrConnection: close"
expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1r
Host: HOSTr
Accept-Language: en-US,en;q=0.5r
X-Requested-With: XMLHttpRequestr
Connection: close"
send -- "r"
set results $expect_out(buffer)
expect -exact "r
"
send -- "r"
expect eof

ولكن هذا ليس كل شيء! كما ترون، في جميع الأمثلة، كان عنوان URL للطلب ثابتًا، ولكن عنوان URL هو المسؤول عن الكلمة التي سيتم ربطها بالتصادمات. وهكذا اتضح أننا سنبحث باستمرار عن الكلمة "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" في ASCII أو "هنا" في UTF-8. ما يجب القيام به؟ بالطبع، ما عليك سوى إنشاء نص جديد في كل مرة، أيها الأصدقاء! ليس بعد الآن توقع تلقائي"أوه، وبمساعدة." صدى، لأن في جديدنا لا شيء يتغير إلا الكلمة. وتحيا المشكلة الجديدة: كيف يمكننا ترجمة كلمة من السيريلية بذكاء إلى تنسيق 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. ثم نقوم بإعادة توجيه إخراج البرنامج النصي الأخير إلى ملف، وبالطريقة القديمة، نمرره من خلاله "المرشحات" المربعات الإضافية واكتبها في الملف.

تقاطع العديد. الحد الأدنى

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

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

المصدر: www.habr.com

إضافة تعليق