Di cosa è capace il cervello di uno studente che apprende il mondo dei computer?

Buongiorno.

Dopo aver finito di scrivere un'altra sceneggiatura in Bash, mi sono reso conto che tutto dovrebbe essere completamente diverso, ma tutto ha funzionato. Voglio mostrarti quali oscenità e stampelle ho scritto per risolvere il problema, ma non avendo ancora un carro di conoscenza. In altre parole, una caricatura della programmazione.

Compito


Qualcosa si è reso necessario per:

  • Visualizzate molte rime per la parola, ad eccezione dei quadrati
  • Incrociate le tante rime di due parole

Per quello? Bene, questo è tutto - e questo è tutto.
Chi non lo sa, una rima quadrata (nel linguaggio comune - un quadrato) sono due parole le cui ultime due lettere nell'ortografia coincidono, il che (spesso è l'unica cosa) le rende una rima. Ad esempio, le rose sono gelide; pneumatico - macchina. L'uso dei quadrati nella versificazione moderna non è particolarmente approvato dalle persone, a causa della loro primitività.

Soluzione


Mi è sembrato che la soluzione più semplice fosse scrivere uno script in Bash che utilizzi un generatore di rime già esistente - HOST, che le seleziona principalmente per consonanza e non per ortografia. Che tipo di HOST? Perché se indichi il vero nome del sito, diranno che si tratta di una pubblicità. Perché non continuare ad usarlo? In primo luogo, nonostante il vantaggio di selezionare le rime in base alle consonanze, produce ancora spesso dei quadrati. In secondo luogo, devi ancora pensare con il cervello, passare il tempo a passare da una scheda all'altra ed impegnarti a memorizzare le parole ripetute negli elenchi per trovare una rima per due parole.

Ottenere rime forti

Cosa so? Conosco l'utilità wget, che scarica la pagina all'URL specificato. Ok, eseguiamo la richiesta: otteniamo una pagina HTML in un file denominato con una parola in rima. Ad esempio, cerchiamo la parola “qui”:

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

Ma ho solo bisogno di un elenco di parole, come posso liberarmi di tutto il resto? Guardiamo e vediamo che l'elenco delle parole è formattato, non importa quanto strano possa essere, sotto forma di un elenco e le parole sono nei tag . Bene, abbiamo una grande utilità. sete - scriviamolo così:

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

Innanzitutto, dal file word, seleziona le righe che contengono il tag - otteniamo un mucchio di tag vuoti e righe con parole. Rimuoviamo il tag stesso e quello di chiusura: qui vengono utilizzati i simboli percentuale al posto delle barre perché nel tag stesso c'è già una barra, perché? sete non ti capisce neanche un po'. E va tutto bene con gli interessi. Rimuoviamo tutti gli spazi dal file, rimuoviamo le righe vuote. Voilà: un elenco di parole già pronto.

Per rimuovere le parole che fanno rima con le ultime lettere, seleziona le ultime due lettere della parola originale e cancella l'elenco:

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

Guardiamo, proviamo: tutto funziona... quindi, dov'è l'elenco per la parola "giocare"? E per la parola “vado”? Il file è vuoto! E questo è tutto perché queste parole sono verbi, e sappiamo cosa fanno a chi fa rima con i verbi. La rima verbale è peggiore anche della rima quadrata, perché la lingua russa ha il maggior numero di verbi e tutti hanno la stessa desinenza, motivo per cui non erano nel file finale dopo aver controllato le desinenze.

Tuttavia non abbiamo fretta. Per ogni parola non ci sono solo rime, ma anche assonanze, che a volte suonano molto meglio delle rime - ecco perché sono assonanze (assonanza francese, dal latino assono - suono in armonia).

Otteniamo assonanze

È qui che inizia il divertimento: le assonanze appaiono su un URL separato e sulla stessa pagina, eseguendo uno script, inviando una richiesta HTTP e ricevendo una risposta. Come posso dire wget'Premi il pulsante? Ma assolutamente no. Purtroppo.

Notando che l'URL nella riga stava in qualche modo cambiando, ho copiato quello che c'era dopo essere passato alle assonanze e l'ho incollato in una nuova scheda del browser: si sono aperte rime forti. Non quello.

In sostanza, ho pensato, al server non dovrebbe importare se lo script che invia la richiesta viene eseguito o se la persona lo digita a mano. COSÌ? Chi lo sa, andiamo a dare un'occhiata.

Dove inviare? Cosa inviare? Richiesta HTTP all'IP del server, c'è qualcosa come GET... poi c'è qualcosa HTTP/1.1... Dobbiamo vedere cosa invia il browser e dove. Installare Wireshark, guarda il traffico:

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

Ehm, cosa? Oh sì, abbiamo HTTPS. Cosa fare? Lanciare un attacco MITM contro te stesso? Idealmente, la vittima stessa ci aiuterà.

In generale, avendo deciso di navigare nel browser, ho finalmente trovato la richiesta stessa e il destinatario. Andare:

Dialogo con il terminale

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.

EHI. Eheheh. In effetti, è quello che mi aspettavo inviando una semplice richiesta HTTP a una porta HTTPS. Dovremmo crittografare adesso? Tutto questo trambusto con le chiavi RSA, poi con SHA256. Perché, c'è OpenSSL per queste cose. Bene, sappiamo già cosa fare, prima rimuoveremo semplicemente i campi Referer e Cookie - penso che non influiranno molto sulla questione:

Dialogo con il terminale

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

Di cosa è capace il cervello di uno studente che apprende il mondo dei computer?

Cos'è questo, giurare sul server? Beh, almeno mi hanno risposto 200 OK, il che significa che i cookie e il referrer non influiscono su nulla. La compressione è gzip, ma durante la copia vengono copiati i caratteri ASCII. Esatto, puoi rimuovere la linea Accetta-codifica. Va tutto bene: otteniamo un documento HTML, ora con assonanze. Ma ecco due domande: come eseguire OpenSSL e trasferirvi i dati utilizzando uno script? E come leggere l'output se dopo aver ricevuto la risposta rimaniamo, per così dire, in una “shell” OpenSSL? Se riesci a inventare qualcosa con il secondo, ma con il primo...

E' un bene che ci sia Habrdove ho letto dell'utilità attenderti, che automatizza il processo di interazione con programmi che prevedono l'interazione umana. Avere una squadra è ancora più attraente aspettarsi automaticamente, generando attenderti script in base alle tue azioni. Bene, lo lanciamo, facciamo tutto questo ed ecco lo script finito. Solo lui è molto enorme, e tutto perché OpenSSL visualizza certificati, chiavi e attenderti attende il risultato di tutto questo. Ne abbiamo bisogno? NO. Rimuoviamo l'intero primo prompt, lasciando solo l'ultima interruzione di riga 'r'. Rimuoviamo anche i campi User-Agent e Accetta dalla nostra richiesta: non influiscono su nulla. Quindi, lanciamoci. Lo script viene eseguito, ma dov'è il prezioso documento HTML? Aspettare l'ho mangiato. Per farglielo sputare bisogna mettere:

set results $expect_out(buffer)

prima della fine dello script: ecco come verrà scritto l'output dell'eseguibile attenderti'om comando e visualizzato sullo schermo. In sintesi, qualcosa del genere:

aspettatevi una sceneggiatura

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

Ma non è tutto! Come puoi vedere, in tutti gli esempi l'URL della richiesta era statico, ma è l'URL responsabile della parola che verrà associata alle assonanze. E così risulta che cercheremo costantemente la parola “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” in ASCII o “qui” in UTF-8. Cosa fare? Naturalmente, basta semplicemente generare un nuovo script ogni volta, amici! Semplicemente non più aspettarsi automaticamente«oh, e con l'aiuto eco, Perché Nel nostro nuovo non cambia nulla tranne la parola. E lunga vita al nuovo problema: come possiamo tradurre in modo intelligente una parola dal cirillico nel formato URL? Non c'è niente di speciale neanche per il terminale. Bene, va bene, possiamo farlo, giusto? Potere:

Guarda cosa posso fare!

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

In totale abbiamo uno script che converte una parola in testo ASCII, generando un altro script che richiede una pagina del sito con assonanze al server tramite OpenSSL. E poi reindirizziamo l'output dell'ultimo script in un file e, alla vecchia maniera, lo passiamo attraverso "filtri" quadrati extra e scriverli nel file.

Intersezione di molti. Linea di fondo

In realtà, questo è esattamente ciò che causa meno problemi. Eseguiamo le procedure sopra descritte per due parole, quindi dai due elenchi confrontiamo ogni parola con ciascuna e se viene trovata una corrispondenza, la restituiamo. Ora abbiamo uno script che prende due parole come input e visualizza un elenco di parole che fanno rima con entrambe, tenendo conto anche delle assonanze, e tutto questo senza passare manualmente da una scheda all'altra e senza ricordare le parole "a occhio" - tutto raccolto, contabilizzato e scartato automaticamente. Meraviglioso.

Lo scopo di questa pubblicazione era dimostrare che se una persona ha bisogno di qualcosa, la farà comunque. Molto inefficace, storto, inquietante, ma funzionerà.

Fonte: habr.com

Aggiungi un commento