Kompyuter dunyosini o'rganayotgan talabaning miyasi nimaga qodir?

Kunning xushmuomala vaqti.

Bash-da yana bir skript yozishni tugatgandan so'ng, men hamma narsa butunlay boshqacha bo'lishi kerakligini tushundim, lekin hamma narsa ishladi. Men sizga muammoni hal qilish uchun qanday uyat va tayoqchalar yozganimni ko'rsatmoqchiman, lekin hali bir vagon bilimga ega emasman. Boshqacha aytganda, dasturlash karikaturasi.

Maqsad


Nimadir kerak bo'ldi:

  • Kvadratchalardan tashqari so'z uchun ko'plab qofiyalar ko'rsatilgan
  • Ikki so'zning ko'p qofiyalarini kesib o'tdi

Sabab? Xo'sh, shunday - va shunday.
Kim bilmaydi, kvadrat qofiya (umumiy tilda - kvadrat) - bu imlodagi oxirgi ikki harfi bir-biriga to'g'ri keladigan ikkita so'z bo'lib, bu (ko'pincha, bu yagona narsa) ularni qofiyaga aylantiradi. Masalan, atirgullar ayozli; shina - avtomobil. Zamonaviy versifikasiyada kvadratchalardan foydalanish, ularning ibtidoiyligi tufayli odamlar tomonidan ayniqsa ma'qullanmagan.

qaror


Menimcha, eng oddiy yechim Bash-da allaqachon mavjud qofiya generatoridan - HOSTdan foydalanadigan skript yozish edi, bu ularni birinchi navbatda imlo bo'yicha emas, balki undoshlik bo'yicha tanlaydi. Qanday HOST? Chunki saytning haqiqiy nomini ko'rsatsangiz, reklama deyishadi. Nega undan foydalanishni davom ettirmaysiz? Birinchidan, undosh tovushlarga asoslangan qofiyalarni tanlash afzalligiga qaramay, u hali ham ko'pincha kvadratchalarni ishlab chiqaradi. Ikkinchidan, siz hali ham miyangiz bilan o'ylashingiz, yorliqlar o'rtasida almashishga vaqt sarflashingiz va ikki so'z uchun qofiyani topish uchun ro'yxatdagi takrorlangan so'zlarni yodlashga kuch sarflashingiz kerak.

Kuchli qofiyalarni olish

Men nima bilaman? Men yordamchi dastur haqida bilaman wget, bu sahifani belgilangan URL manzilida yuklaydi. Xo'sh, keling, so'rovni bajaramiz - biz qofiyali so'z bilan nomlangan faylda HTML sahifani olamiz. Masalan, "bu erda" so'zini qidiramiz:

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

Lekin menga faqat so'zlar ro'yxati kerak, qolgan hamma narsadan qanday qutulish mumkin? Biz qaraymiz va ko'ramizki, so'zlar ro'yxati qanchalik g'alati bo'lmasin, ro'yxat ko'rinishida formatlangan va so'zlar teglarda . Xo'sh, bizda ajoyib yordamchi dastur bor. sed - buni shunday yozamiz:

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

Birinchidan, so'z faylidan tegni o'z ichiga olgan qatorlarni tanlang - biz bir nechta bo'sh teglar va so'zlar bilan satrlarni olamiz. Biz tegning o'zini va uning yopilishini olib tashlaymiz - bu erda qiyshiq chiziq o'rniga foiz belgilari ishlatiladi, chunki tegning o'zida allaqachon chiziq bor, nega? sed sizni biroz tushunmaydi. Va qiziqish bilan hamma narsa yaxshi. Biz fayldan barcha bo'shliqlarni olib tashlaymiz, bo'sh chiziqlarni olib tashlaymiz. Voila - so'zlarning tayyor ro'yxati.

Oxirgi harflar yordamida qofiyalangan so'zlarni olib tashlash uchun asl so'zdan oxirgi ikki harfni tanlang va ro'yxatni tozalang:

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

Biz qaraymiz, harakat qilamiz - hamma narsa ishlaydi ... "o'yin" so'zining ro'yxati qayerda? Va "men ketaman" so'zi uchunmi? Fayl bo'sh! Buning hammasi, chunki bu so'zlar fe'ldir va biz ular fe'l bilan qofiyalanganlarga nima qilishlarini bilamiz. Fe'l qofiyasi hatto kvadrat olmoshdan ham yomonroq, chunki rus tilida eng ko'p fe'llar bor va ularning barchasi bir xil songa ega, shuning uchun ular yakunlarni tekshirgandan so'ng yakuniy faylda bo'lmagan.

Biroq, biz shoshilmayapmiz. Har bir so'z uchun nafaqat qofiyalar, balki assonanslar ham mavjud, ular ba'zan qofiyadan ko'ra yaxshiroq eshitiladi - shuning uchun ular assonanslardir (frantsuzcha assonans, lotincha assono - men uyg'unlikda aytaman).

Biz assonanslarni olamiz

Qiziq shu erda boshlanadi: assonanslar alohida URL manzilida va xuddi shu sahifada skriptni bajarish, HTTP so'rovini yuborish va javob olish orqali paydo bo'ladi. Qanday aytishim mumkin wget'Tugmani bosasizmi? Lekin yo'q. Afsuski.

Satrdagi URL qandaydir tarzda o'zgarib borayotganini payqab, assonanslarga o'tgandan so'ng u erda nima borligini ko'chirib oldim va uni yangi brauzer yorlig'iga joylashtirdim - kuchli qofiyalar ochildi. Unday emas.

Aslida, men so'rov yuborgan skript bajarilganmi yoki odam uni qo'lda yozadimi, server uchun muhim emas deb o'yladim. Xo'sh? Kim biladi, keling, tekshirib ko'raylik.

Qayerga yuborish kerak? Nima yuborish kerak? Server IP-ga HTTP so'rovi, GET kabi narsa bor ... keyin HTTP/1.1 narsa bor ... Brauzer nimani va qaerga yuborayotganini ko'rishimiz kerak. O'rnatish wireshark, tirbandlikka qarang:

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Ó.

Um... nima? Ha, bizda HTTPS bor. Nima qilish kerak? O'zingizga MITM hujumini uyushtirasizmi? Ideal holda, jabrlanuvchining o'zi bizga yordam beradi.

Umuman olganda, brauzerni kezishga qaror qilib, men nihoyat so'rovning o'zini va qabul qiluvchini topdim. Boring:

Terminal bilan dialog

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.

Hey. Hehehe. Haqiqatan ham, HTTPS portiga yalang'och HTTP so'rovini yuborishda kutgan narsam shu edi. Endi shifrlashimiz kerakmi? Bularning barchasi RSA tugmachalari, keyin esa SHA256 bilan shovqin. Nega, bor OpenSSL bunday narsalar uchun. Xo'sh, biz nima qilish kerakligini allaqachon bilamiz, avval Referer va Cookie maydonlarini olib tashlaymiz - menimcha, ular masalaga unchalik ta'sir qilmaydi:

Terminal bilan dialog

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

Kompyuter dunyosini o'rganayotgan talabaning miyasi nimaga qodir?

Bu nima, serverda so'kinish? Xo'sh, hech bo'lmaganda ular menga 200 OK deb javob berishdi, ya'ni cookie fayllari va yo'naltiruvchi hech narsaga ta'sir qilmaydi. Siqish - gzip, lekin nusxalashda ASCII belgilar nusxalanadi. To'g'ri, siz chiziqni olib tashlashingiz mumkin Qabul qilish-kodlash. Hammasi yaxshi - biz HTML hujjatini olamiz, endi assonanslar bilan. Ammo bu erda ikkita savol bor: OpenSSL-ni qanday ishga tushirish va unga skript yordamida ma'lumotlarni uzatish? Agar javobni olganimizdan so'ng, xuddi OpenSSL "qobig'ida" qolsak, natijani qanday o'qish kerak? Agar ikkinchisi bilan nimadir o'ylab topsangiz, lekin birinchisi bilan ...

borligi yaxshi Habru erda men yordam dasturi haqida o'qidim kuting, bu odamlarning o'zaro ta'sirini kutadigan dasturlar bilan o'zaro ta'sir qilish jarayonini avtomatlashtiradi. Jamoaga ega bo'lish yanada jozibali avtomatik kutish, hosil qiluvchi kuting harakatlaringizga asoslangan skript. Xo'sh, biz uni ishga tushiramiz, bularning barchasini bajaramiz va mana tayyor skript. Faqat u juda katta, va hammasi, chunki OpenSSL sertifikatlar, kalitlar va ko'rsatadi kuting bularning barchasi natijasini kutmoqda. Bu bizga kerakmi? Yo'q. Biz butun birinchi so'rovni olib tashlaymiz, faqat oxirgi qatorni "r" ni qoldiramiz. Shuningdek, biz so'rovimizdan User-Agent va Accept maydonlarini olib tashlaymiz - ular hech narsaga ta'sir qilmaydi. Shunday qilib, ishga tushamiz. Skript bajarildi, ammo qimmatbaho HTML hujjati qayerda? kutyapmiz yedi. Uni tupurishi uchun siz quyidagilarni qo'yishingiz kerak:

set results $expect_out(buffer)

skript tugashidan oldin - bajariladigan faylning chiqishi shunday yoziladi kuting'om buyrug'i va ekranda ko'rsatiladi. Xulosa qilib aytganda, shunga o'xshash narsa:

skriptni kuting

#!/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

Lekin bu hammasi emas! Ko'rib turganingizdek, barcha misollarda so'rov URL manzili statik edi, ammo bu URL qaysi so'z assonanslar bilan bog'lanishi uchun javobgardir. Shunday qilib, biz doimiy ravishda ASCIIda "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" yoki UTF-8da "bu erda" so'zini qidiramiz. Nima qilish kerak? Albatta, har safar yangi skript yarating, do'stlar! Yo'q Boshqa avtomatik kutish'Oh, va yordam bilan Echo, chunki Bizning yangimizda so'zdan boshqa hech narsa o'zgarmaydi. Yashasin, yangi muammo: qanday qilib biz so‘zni kirill alifbosidan URL formatiga oqilona o‘tkazishimiz mumkin? Terminal uchun ham alohida narsa yo'q. Xo'sh, yaxshi, biz buni qila olamiz, to'g'rimi? Mumkin:

Qarang, men nima qila olaman!

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')}

Umuman olganda, bizda so'zni ASCII matniga aylantiradigan, OpenSSL orqali serverdan assonanslar bilan sayt sahifasini so'raydigan boshqa skript yaratadigan skript mavjud. Va keyin biz oxirgi skriptning chiqishini faylga yo'naltiramiz va eski usulda uni o'tkazamiz. "filtrlar" qo'shimcha kvadratchalar va ularni faylga yozing.

Ko'pchilikning kesishishi. Pastki chiziq

Aslida, bu eng kam muammolarni keltirib chiqaradigan narsa. Biz yuqoridagi protseduralarni ikkita so'z uchun bajaramiz, so'ngra ikkita ro'yxatdan har bir so'zni har biri bilan taqqoslaymiz va agar moslik topilsa, uni chiqaramiz. Endi bizda ikkita so'zni kiritish sifatida qabul qiladigan va ikkalasi bilan qofiyalangan va hatto assonanslarni hisobga olgan holda va bularning barchasi to'rtta yorliq o'rtasida qo'lda almashmasdan va "ko'z bilan" so'zlarini eslab qolmasdan, so'zlar ro'yxatini ko'rsatadigan skript mavjud - barchasi to'plangan, hisobga olingan. uchun va avtomatik ravishda o'chiriladi. Ajoyib.

Ushbu nashrning maqsadi, agar insonga biror narsa kerak bo'lsa, baribir buni amalga oshirishini ko'rsatish edi. Juda samarasiz, egri, qo'rqinchli, lekin u ishlaydi.

Manba: www.habr.com

a Izoh qo'shish