Za šta je sposoban mozak učenika da uči o kompjuterskom svijetu?

Vrsta vremena dana.

Nakon što sam završio pisanje još jednog scenarija u Bashu, shvatio sam da bi sve trebalo biti potpuno drugačije, ali sve je funkcioniralo. Želim da vam pokažem koje sam opscenosti i štake napisao da bih rešio problem, a da još nemam vagon znanja. Drugim riječima, karikatura programiranja.

Cilj


Nešto je postalo neophodno za:

  • Prikazano mnogo rima za riječ, osim kvadratića
  • Ukrstio mnoge rime od dvije riječi

Za što? Pa, to je to - i to je to.
Ko ne zna, četvrtasta rima (u narodnom govoru - kvadrat) su dvije riječi čija se posljednja dva slova u pravopisu poklapaju, što ih (često je to jedino) čini rimom. Na primjer, ruže su mrazne; guma - auto. Upotreba kvadrata u modernoj versifikaciji ljudi nije posebno odobravana zbog njihove primitivnosti.

odluka


Činilo mi se da je najjednostavnije rješenje napisati skriptu na Bashu koja koristi već postojeći generator rime - HOST, koji ih prvenstveno bira po harmoniji, a ne po pravopisu. Kakav HOST? Jer ako navedete pravi naziv stranice, reći će da je to reklama. Zašto ga ne nastavite koristiti? Prvo, uprkos svojoj prednosti odabira rime na osnovu sazvučja, on i dalje često stvara kvadrate. Drugo, i dalje morate razmišljati svojim mozgom, trošiti vrijeme na prebacivanje između kartica i energiju pamtiti ponavljane riječi na listama kako biste pronašli rimu za dvije riječi.

Dobivanje jakih rima

šta ja znam? Znam za uslužni program wget, koji preuzima stranicu na navedenom URL-u. U redu, izvršimo zahtjev - dobijamo HTML stranicu u datoteci nazvanoj rimovanom riječi. Na primjer, tražimo riječ "ovdje":

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

Ali treba mi samo spisak reči, kako da se otarasim svega ostalog? Gledamo i vidimo da je lista riječi formatirana, ma koliko čudna bila, u obliku liste, a riječi su u oznakama . Pa, imamo odličnu pomoć. sed - hajde da to zapišemo ovako:

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

Prvo, iz word datoteke odaberite redove koji sadrže oznaku — dobijamo gomilu praznih oznaka i redova sa rečima. Uklanjamo samu oznaku i njenu završnu - ovdje se umjesto kosih crtica koriste simboli procenta jer u samoj oznaci već postoji kosa crta, zašto? sed ne razume te malo. I sve je u redu sa kamatama. Uklanjamo sve razmake iz datoteke, uklanjamo prazne redove. Voila - gotova lista riječi.

Da biste uklonili riječi koje se rimuju koristeći zadnja slova, odaberite zadnja dva slova iz originalne riječi i obrišite listu:

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

Gledamo, pokušavamo - sve radi... pa, gdje je spisak za riječ "igra"? A za riječ "idem"? Fajl je prazan! A to je sve zato što su ove riječi glagoli, a znamo šta rade onima koji se rimuju s glagolima. Glagolska rima je lošija od čak i četvrtaste rime, jer ruski jezik ima najviše glagola, a svi imaju iste završetke, zbog čega nisu bili u konačnom fajlu nakon provjere završetaka.

Međutim, nikamo nam se ne žuri. Za svaku riječ postoje ne samo rime, već i asonance, koje ponekad zvuče mnogo bolje od rime - zato su to asonance (francuski assonance, od latinskog assono - zvučim u skladu).

Dobijamo asonance

Ovdje počinje zabava: asonance se pojavljuju na zasebnom URL-u i na istoj stranici, izvršavanjem skripte, slanjem HTTP zahtjeva i primanjem odgovora. Kako da kažem wget'Pritisnete li dugme? Ali nema šanse. Nažalost.

Primijetivši da se URL u redu nekako mijenja, kopirao sam ono što je tamo bilo nakon prelaska na asonance i zalijepio u novu karticu pretraživača - otvorile su se jake rime. Ne to.

U stvari, mislio sam, jer server Ne bi trebalo biti važno da li se izvršava skripta koja šalje zahtjev ili ga osoba ručno kuca. Je li tako? Ko zna? Hajde da provjerimo.

Gdje poslati? Šta poslati? HTTP zahtjev za IP servera, postoji nešto kao GET... onda postoji nešto HTTP/1.1... Moramo vidjeti šta pretraživač šalje i gdje. Instaliraj wireshark, pogledajte promet:

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

hm... šta? Oh da, imamo HTTPS. sta da radim? Pokrenuti MITM napad na sebe? U idealnom slučaju, sama žrtva će nam pomoći.

Generalno, nakon što sam odlučio surfati pretraživačem, konačno sam pronašao sam zahtjev i primatelja. idi:

Dijalog sa terminalom

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.

Hej. Hehehe. Zaista, to je ono što sam očekivao kada sam slao goli HTTP zahtjev na HTTPS port. Trebamo li sada šifrirati? Sva ova frka sa RSA ključevima, zatim sa SHA256. Zašto, postoji OpenSSL za takve stvari. Pa, već znamo šta da radimo, samo ćemo prvo ukloniti polja Referer i Cookie - mislim da neće mnogo uticati na stvar:

Dijalog sa terminalom

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

Za šta je sposoban mozak učenika da uči o kompjuterskom svijetu?

Šta je ovo, psovanje na serveru? Pa, barem su mi odgovorili 200 OK, što znači da kolačići i referer ne utiču ni na šta. Kompresija je gzip, ali pri kopiranju se kopiraju ASCII znakovi. Tačno, možete ukloniti liniju Prihvati-kodiranje. Sve je u redu - dobijamo HTML dokument, sada sa asonancama. Ali evo dva pitanja: kako pokrenuti OpenSSL i prenijeti podatke na njega pomoću skripte? A kako pročitati izlaz ako nakon primitka odgovora ostanemo, takoreći, u OpenSSL “ljusci”? Ako možete smisliti nešto sa drugim, ali sa prvim...

Dobro je da postoji Habrgdje sam čitao o uslužnom programu očekivati, koji automatizuje proces interakcije sa programima koji očekuju ljudsku interakciju. Imati tim je još privlačnije autoexpect, generiranje očekivati skriptu zasnovanu na vašim akcijama. Pa, pokrećemo ga, radimo sve ovo i evo gotovog scenarija. Samo što je on veoma ogroman, i sve zato OpenSSL prikazuje sertifikate, ključeve i očekivati čeka ishod svega ovoga. Treba li nam ovo? br. Uklanjamo cijeli prvi prompt, ostavljajući samo posljednji prijelom reda 'r'. Također uklanjamo polja User-Agent i Accept iz našeg zahtjeva - ona ne utiču ni na šta. Dakle, hajde da pokrenemo. Skripta je izvršena, ali gdje je dragoceni HTML dokument? očekivati jeo. Da biste ga natjerali da ga ispljune, morate staviti:

set results $expect_out(buffer)

prije kraja skripte - ovako će biti napisan izlaz izvršne datoteke očekivati'om i prikazan na ekranu. Ukratko, nešto ovako:

očekujte skriptu

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

Ali to nije sve! Kao što možete vidjeti, u svim primjerima URL zahtjeva je bio statičan, ali je URL taj koji je odgovoran za to koja će riječ biti povezana sa asonancama. I tako se ispostavilo da ćemo stalno tražiti riječ “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” u ASCII-u ili “ovdje” u UTF-8. sta da radim? Naravno, jednostavno generirajte novu skriptu svaki put, prijatelji! Ne više autoexpect'Oh, i uz pomoć odjek, jer U našem novom se ništa ne mijenja osim riječi. I živio novi problem: kako možemo inteligentno prevesti riječ sa ćirilice u URL format? Ni za terminal nema ništa posebno. Pa, u redu je, možemo to, zar ne? mogu:

Vidi šta mogu da uradim!

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

Ukupno imamo skriptu koja konvertuje reč u ASCII tekst, generišući drugu skriptu koja zahteva stranicu sajta sa asonancama sa servera preko OpenSSL-a. A onda preusmjeravamo izlaz posljednje skripte u datoteku i, na starinski način, proslijeđujemo je "filteri" dodatne kvadrate i zapišite ih u datoteku.

Raskrsnica mnogih. Zaključak

Zapravo, to je ono što uzrokuje najmanje problema. Provodimo gornje procedure za dvije riječi, zatim iz dvije liste upoređujemo svaku riječ sa svakom i ako se pronađe podudaranje, ispisujemo ga. Sada imamo skriptu koja uzima dvije riječi kao ulaz i prikazuje listu riječi koje se rimuju s obje, pa čak i uzimajući u obzir asonance, i sve to bez ručnog prebacivanja između četiri kartice i pamćenja riječi "na oko" - sve prikupljeno, uračunato za i automatski se odbacuje. Divno.

Svrha ove publikacije je bila da pokaže da ako čovjeku nešto treba, on će to ipak učiniti. Vrlo neefikasno, krivo, jezivo, ali će uspjeti.

izvor: www.habr.com

Kupite pouzdan hosting za sajtove sa DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster