مغز دانش آموزی که در مورد دنیای کامپیوتر یاد می گیرد چه توانایی هایی دارد؟

روز بخیر.

پس از پایان نوشتن فیلمنامه دیگری در بش، متوجه شدم که همه چیز باید کاملاً متفاوت باشد، اما همه چیز جواب داد. من می خواهم به شما نشان دهم که برای حل مشکل چه فحاشی ها و عصاهایی نوشتم اما هنوز یک واگن علم نداشتم. به عبارت دیگر کاریکاتور برنامه نویسی.

کار


چیزی لازم شد تا:

  • قافیه های زیادی برای کلمه نمایش داده می شود، به جز مربع
  • از قافیه های زیاد دو کلمه عبور کرد

برای چی؟ خوب، همین - و بس.
کسی که نداند، قافیه مربع (در اصطلاح رایج - مربع) دو کلمه ای است که دو حرف آخر آنها در املا مطابقت دارند، که (اغلب، این تنها چیز است) آنها را به قافیه تبدیل می کند. به عنوان مثال، گل رز یخ زده است. لاستیک - ماشین. استفاده از مربع ها در ابیات مدرن به دلیل بدوی بودن مورد تایید مردم نیست.

تصمیم


به نظر من ساده ترین راه حل نوشتن یک اسکریپت در Bash است که از یک تولید کننده قافیه از قبل موجود استفاده می کند - HOST، که در درجه اول آنها را با همخوانی انتخاب می کند و نه با املا. چه نوع میزبانی؟ چون اگه اسم واقعی سایت رو بگید میگن تبلیغه. چرا به استفاده از آن ادامه نمی دهید؟ اولاً، علیرغم مزیتی که در انتخاب قافیه‌ها بر اساس همخوانی داشت، هنوز اغلب مربع تولید می‌کند. ثانیاً، شما هنوز باید با مغز خود فکر کنید، زمانی را صرف جابه‌جایی بین برگه‌ها کنید و انرژی را صرف حفظ کردن کلمات تکراری در فهرست‌ها کنید تا برای دو کلمه قافیه پیدا کنید.

گرفتن قافیه های قوی

من چه می دانم؟ من در مورد ابزار مفید می دانم دستور wget، که صفحه را در URL مشخص شده دانلود می کند. خوب، بیایید درخواست را اجرا کنیم - یک صفحه HTML در فایلی به نام با یک کلمه قافیه دریافت می کنیم. به عنوان مثال، بیایید کلمه "اینجا" را جستجو کنیم:

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

اما من فقط به لیستی از کلمات نیاز دارم، چگونه می توانم از شر هر چیز دیگری خلاص شوم؟ نگاه می کنیم و می بینیم که فهرست کلمات هر چقدر هم که عجیب باشد در قالب یک لیست قالب بندی شده است و کلمات در برچسب ها هستند. . خوب، ما یک ابزار عالی داریم. SED - بیایید آن را به این صورت بنویسیم:

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

ابتدا از فایل word خطوطی که حاوی تگ هستند را انتخاب کنید - ما یک دسته از برچسب ها و خطوط خالی با کلمات دریافت می کنیم. ما خود برچسب و بسته شدن آن را حذف می کنیم - در اینجا از نمادهای درصد به جای اسلش استفاده می شود زیرا در خود تگ قبلاً یک بریده وجود دارد، چرا؟ SED کمی شما را درک نمی کند و همه چیز با علاقه خوب است. ما تمام فاصله ها را از فایل حذف می کنیم، خطوط خالی را حذف می کنیم. Voila - یک لیست آماده از کلمات.

برای حذف کلماتی که با استفاده از آخرین حروف قافیه می شوند، دو حرف آخر را از کلمه اصلی انتخاب کنید و لیست را پاک کنید:

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

ما نگاه می کنیم، تلاش می کنیم - همه چیز کار می کند ... بنابراین، لیست کلمه "بازی" کجاست؟ و برای کلمه "من می روم"؟ فایل خالی است! و این همه به این دلیل است که این کلمات فعل هستند و ما می دانیم با کسانی که با افعال قافیه می کنند چه می کنند. قافیه فعل حتی از قافیه مربع هم بدتر است، زیرا زبان روسی بیشترین افعال را دارد و همه آنها پایان های یکسانی دارند و به همین دلیل پس از بررسی پایان ها در پرونده نهایی قرار نداشتند.

با این حال ما عجله ای نداریم. برای هر کلمه نه تنها قافیه، بلکه همخوانی وجود دارد که گاهی اوقات بسیار بهتر از قافیه به نظر می رسد - به همین دلیل است که آنها همخوانی هستند (آسونانس فرانسوی، از لاتین assono - من با هماهنگی صدا می کنم).

آسونانس می گیریم

اینجاست که سرگرمی شروع می شود: آسونانس ها در یک 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.

سلام. هههه در واقع، این همان چیزی است که هنگام ارسال یک درخواست HTTP خالی به یک پورت HTTPS انتظار داشتم. الان باید رمزگذاری کنیم؟ این همه هیاهو با کلیدهای RSA و سپس با SHA256. چرا، وجود دارد OpenSSL را برای چنین چیزهایی خوب، ما قبلاً می دانیم که چه کاری باید انجام دهیم، فقط ابتدا فیلدهای Referer و Cookie را حذف می کنیم - فکر می کنم آنها تأثیر زیادی روی این موضوع ندارند:

گفتگو با ترمینال

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 باقی بمانیم، چگونه خروجی را بخوانیم؟ اگر بتوانید با دومی چیزی بسازید، اما با اولی...

خوبه که هست هابرجایی که من در مورد ابزار مطالعه کردم انتظار، که فرآیند تعامل با برنامه هایی را که انتظار تعامل انسانی را دارند خودکار می کند. داشتن یک تیم حتی جذاب تر است انتظار خودکار، ایجاد می کند انتظار اسکریپت بر اساس اقدامات شما خوب، ما آن را راه اندازی می کنیم، همه این کارها را انجام می دهیم و این اسکریپت تمام شده است. فقط او بسیار بزرگ است، و همه به این دلیل OpenSSL را گواهینامه ها، کلیدها و انتظار منتظر خروجی این همه است. آیا ما به این نیاز داریم؟ خیر ما کل اولین دستور را حذف می کنیم و فقط آخرین خط "r" را باقی می گذاریم. ما همچنین فیلدهای User-Agent و Accept را از درخواست خود حذف می کنیم - آنها بر چیزی تأثیر نمی گذارند. بنابراین، بیایید راه اندازی کنیم. اسکریپت اجرا شد، اما سند 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

اضافه کردن نظر