De què és capaç el cervell d'un estudiant que aprèn sobre el món informàtic?

Bon dia.

Després d'haver acabat d'escriure un altre guió a Bash, em vaig adonar que tot havia de ser completament diferent, però tot va funcionar. Vull mostrar-vos quines obscenitats i crosses vaig escriure per resoldre el problema, però sense tenir encara un vagó de coneixements. En altres paraules, una caricatura de la programació.

Tasca


Alguna cosa es va fer necessària per:

  • Mostra moltes rimes per a la paraula, excepte els quadrats
  • Creuar les moltes rimes de dues paraules

Per a què? Bé, això és tot... i ja està.
Qui no ho sap, una rima quadrada (en llenguatge comú - un quadrat) són dues paraules les dues últimes lletres de l'ortografia coincideixen, que (sovint, això és l'únic) les converteixen en rima. Per exemple, les roses són gelades; pneumàtic - cotxe. L'ús de quadrats en la versificació moderna no està especialment aprovat per la gent, a causa de la seva primitivitat.

decisió


Em va semblar que la solució més senzilla era escriure un script en Bash que utilitzi un generador de rimes ja existent: HOST, que els selecciona principalment per consonància i no per ortografia. Quin tipus d'HOST? Perquè si indiqueu el nom real del lloc, diran que és un anunci. Per què no seguir utilitzant-lo? En primer lloc, malgrat el seu avantatge de seleccionar rimes basades en consonàncies, encara produeix sovint quadrats. En segon lloc, encara has de pensar amb el teu cervell, passar temps canviant entre pestanyes i energia memoritzant paraules repetides en llistes per trobar una rima per a dues paraules.

Aconseguint rimes fortes

Què sé jo? Conec la utilitat wget, que baixa la pàgina a l'URL especificat. D'acord, executem la sol·licitud: obtenim una pàgina HTML en un fitxer anomenat amb una paraula que rime. Per exemple, cerquem la paraula "aquí":

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

Però només necessito una llista de paraules, com puc desfer-me de tota la resta? Mirem i veiem que la llista de paraules està formatada, per estrany que sigui, en forma de llista, i les paraules estan en etiquetes. . Bé, tenim una gran utilitat. set - Escrivim-ho així:

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

Primer, des del fitxer word, seleccioneu les línies que contenen l'etiqueta — Tenim un munt d'etiquetes i línies buides amb paraules. Traiem l'etiqueta en si i la de tancament; aquí s'utilitzen símbols de percentatge en comptes de barres inclinades perquè a l'etiqueta mateixa ja hi ha una barra, per què? set no t'entenc una mica. I tot està bé amb interès. Traiem tots els espais del fitxer, eliminem les línies buides. Voila: una llista de paraules ja feta.

Per eliminar paraules que rimen amb les últimes lletres, seleccioneu les dues últimes lletres de la paraula original i esborreu la llista:

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

Mirem, intentem, tot funciona... doncs, on és la llista de la paraula "jugar"? I per la paraula "vaig"? El fitxer està buit! I tot això és perquè aquestes paraules són verbs, i sabem què fan amb els que rimen amb verbs. La rima verbal és pitjor que fins i tot la rima quadrada, perquè la llengua russa té la majoria de verbs, i tots tenen les mateixes terminacions, per això no estaven a l'arxiu final després de comprovar les terminacions.

Tanmateix, no tenim cap pressa. Per a cada paraula no només hi ha rimes, sinó també assonàncies, que de vegades sonen molt millor que la rima, per això són assonàncies (assonàncies en francès, del llatí assono - sono en harmonia).

Tenim assonàncies

Aquí és on comença la diversió: les assonàncies apareixen en un URL separat i a la mateixa pàgina, executant un script, enviant una sol·licitud HTTP i rebent una resposta. Com puc dir wget'Premeu el botó? Però de cap manera. Malauradament.

En adonar-me que l'URL de la línia estava canviant d'alguna manera, vaig copiar el que hi havia després de canviar a assonàncies i el vaig enganxar en una nova pestanya del navegador: es van obrir rimes fortes. No això.

Essencialment, vaig pensar, no hauria d'importar al servidor si s'executa l'script que li envia la sol·licitud o si la persona l'escriu a mà. Tan? Qui sap, anem a comprovar-ho.

On enviar? Què enviar? Sol·licitud HTTP a la IP del servidor, hi ha alguna cosa com GET... després hi ha alguna cosa HTTP/1.1... Hem de veure què envia el navegador i on. Instal·lar wireshark, mireu el trànsit:

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... què? Sí, tenim HTTPS. Què fer? Llançar un atac MITM contra tu mateix? L'ideal és que la víctima mateixa ens ajudi.

En general, després d'haver decidit navegar pel navegador, finalment vaig trobar la sol·licitud en si i el destinatari. Vés:

Diàleg amb el terminal

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.

Ei. Hehehe. De fet, això és el que esperava quan enviava una sol·licitud HTTP nua a un port HTTPS. Hem de xifrar ara? Tot aquest enrenou amb claus RSA, després amb SHA256. Per què, n'hi ha OpenSSL per a aquestes coses. Bé, ja sabem què hem de fer, primer eliminarem els camps Referer i Cookie; crec que no afectaran gaire l'assumpte:

Diàleg amb el terminal

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

De què és capaç el cervell d'un estudiant que aprèn sobre el món informàtic?

Què és això, jurar al servidor? Bé, almenys em van respondre 200 OK, és a dir, que les cookies i el referent no afecten res. La compressió és gzip, però quan es copia, es copien caràcters ASCII. Exactament, podeu eliminar la línia Acceptar-codificació. Tot està bé: obtenim un document HTML, ara amb assonàncies. Però aquí hi ha dues preguntes: com executar OpenSSL i transferir-hi dades mitjançant un script? I com llegir la sortida si després de rebre la resposta ens quedem, per dir-ho, en un "shell" OpenSSL? Si pots arribar a alguna cosa amb el segon, però amb el primer...

Està bé que n'hi hagi Habron vaig llegir sobre la utilitat esperar, que automatitza el procés d'interacció amb programes que esperen interacció humana. Tenir un equip és encara més atractiu espera automàtica, generant esperar guió basat en les vostres accions. Bé, ho posem en marxa, feu tot això i aquí teniu el guió acabat. Només ell és molt gran, i tot perquè OpenSSL mostra certificats, claus i esperar espera la sortida de tot això. Necessitem això? No. Eliminem tota la primera indicació, deixant només l'últim salt de línia "r". També eliminem els camps User-Agent i Accept de la nostra sol·licitud; no afecten res. Així doncs, iniciem. L'script s'ha executat, però on és el document HTML atresorat? Esperar se'l va menjar. Per fer-lo escopir, heu de posar:

set results $expect_out(buffer)

abans del final de l'script: així s'escriurà la sortida de l'executable esperarcomanda 'om i es mostra a la pantalla. En resum, una cosa així:

espereu un guió

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

Però això no és tot! Com podeu veure, en tots els exemples l'URL de la sol·licitud era estàtic, però és l'URL el responsable de quina paraula s'associarà amb assonàncies. I així resulta que buscarem constantment la paraula "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" en ASCII o "aquí" en UTF-8. Què fer? Per descomptat, només heu de generar un script nou cada cop, amics! Mai més espera automàtica'Oh, i amb l'ajuda trobo, perquè En el nostre nou, res no canvia excepte la paraula. I visca el nou problema: com podem traduir intel·ligentment una paraula del ciríl·lic al format URL? Tampoc hi ha res especial per al terminal. Bé, està bé, podem fer-ho, oi? Llauna:

Mira què puc fer!

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

En total, disposem d'un script que converteix una paraula en text ASCII, generant un altre script que sol·licita una pàgina del lloc amb assonàncies des del servidor via OpenSSL. A continuació, redirigim la sortida de l'últim script a un fitxer i, a l'antiga manera, la passem "filtres" quadrats addicionals i escriu-los al fitxer.

Intersecció de molts. Linia inferior

De fet, això és exactament el que causa menys problemes. Realitzem els procediments anteriors per a dues paraules, després de les dues llistes comparem cada paraula amb cadascuna i si es troba una coincidència, la sortim. Ara tenim un script que pren dues paraules com a entrada i mostra una llista de paraules que rimen amb ambdues, i fins i tot tenint en compte les assonàncies, i tot això sense canviar manualment entre quatre pestanyes i recordar paraules "a ull", tot recollit, comptabilitzat. per i descartat automàticament. Meravellós.

L'objectiu d'aquesta publicació era mostrar que si una persona necessita alguna cosa, ho farà igualment. Molt ineficaç, tort, esgarrifós, però funcionarà.

Font: www.habr.com

Afegeix comentari