Ce que le cerveau d'un étudiant dans le monde informatique est capable de faire

Bonjour.

Ayant fini d'écrire un autre script sur Bash, j'ai réalisé que tout devait être complètement différent, mais tout fonctionnait. Je veux vous montrer quelles blagues et béquilles j'ai écrit afin de résoudre le problème, mais jusqu'à présent sans voiture de connaissances. En d'autres termes, une caricature de programmation.

Défi


Quelque chose est devenu nécessaire pour:
  • Imprimé beaucoup de rimes pour un mot, sauf pour les carrés
  • Plusieurs rimes croisées de deux mots

Pour quoi? Et bien voilà - et c'est tout.
Qui ne sait pas, une rime carrée (dans le langage courant - un carré) est deux mots qui ont les deux dernières lettres de l'orthographe, ce qui (souvent cela seulement) en fait une rime. Par exemple, roses - gel; le pneu est une voiture. L'utilisation des carrés dans la versification moderne n'est pas particulièrement approuvée par les gens, en raison de leur primitivité.

Solution


La solution la plus simple m'a semblé écrire un script sur Bash, en utilisant le générateur de rimes déjà existant - HOST, qui les sélectionne d'abord en fonction des harmonies, et non par orthographe. Qu'est-ce qu'un hôte? Parce que si vous spécifiez le vrai nom du site - ils diront que la publicité. Pourquoi ne pas continuer à l'utiliser? Premièrement, malgré son avantage à sélectionner des rimes en fonction des harmonies, il produit souvent des carrés. Deuxièmement, vous devez toujours réfléchir avec votre cerveau, passer du temps à basculer entre les onglets, l'effort de se rappeler de répéter les mots dans les listes pour trouver des rimes pour deux mots.

Obtenir des rimes fortes


Que sais-je? Je connais l'utilitaire wget , qui télécharge la page à l'URL spécifiée. Eh bien, nous répondons à la demande - nous obtenons la page HTML dans le fichier, qui est appelé un mot pour rimer. Par exemple, recherchez le mot "ici":

wget https://HOST/rifma/ 

Mais je n'ai besoin que d'une liste de mots, comment se débarrasser de tout le reste? Nous regardons et voyons que la liste de mots est organisée, aussi étrange que cela puisse paraître, sous la forme d'une liste, et les mots sont dans les balises <li> </li>. Eh bien, nous avons un merveilleux utilitaire sed - et notez-le:


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

Tout d'abord, dans le fichier de mots , sélectionnez les lignes qui contiennent la balise <li> - nous obtenons un tas de balises vides et de lignes avec des mots. Nous supprimons la balise elle-même et sa fermeture - ici, des symboles de pourcentage sont utilisés à la place des barres obliques parce que la balise </li> a déjà une barre oblique, c'est pourquoi sed ne vous comprend pas un peu. Et avec intérêt, tout va bien. Nous supprimons tous les espaces du fichier, supprimons les lignes vides. Voila - une liste complète de mots.

Afin de supprimer les mots rimant en raison des dernières lettres, sélectionnez les deux dernières lettres du mot d'origine et nettoyez la liste:

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

Nous regardons, essayons - tout fonctionne ... alors, mais où est la liste du mot "jouer"? Et pour le mot "j'arrive"? Le fichier est vide! Et tout cela parce que ces mots sont des verbes, et nous savons ce qu'ils font avec ceux qui riment en verbes. La rime du verbe est encore pire que le carré, pour la plupart des verbes de la langue russe, et même tous avec les mêmes terminaisons, c'est pourquoi ils n'apparaissent pas dans le fichier final après vérification des terminaisons.

Cependant, pas pressé. Pour chaque mot, il y a non seulement des rimes, mais aussi des assonances, qui sonnent parfois beaucoup mieux que la rime - pour cela ce sont aussi des assonances (assonance française, du latin assono - je sonne bien).

Obtenez Assonances


Ici, le plaisir commence: les assonances apparaissent sur une URL distincte, et sur la même page, en exécutant un script, en envoyant une requête HTTP et en recevant une réponse. Comment dire à wget 'de cliquer sur un bouton? Mais en aucune façon. C'est triste.

Remarquant que l'URL dans la chaîne change toujours d'une manière ou d'une autre, j'ai copié ce qui était là après le passage aux assonances, et collé dans un nouvel onglet de navigateur - des rimes fortes ouvertes. Pas ça.

En fait, je pensais que le serveur ne devrait pas se soucier si le script qui envoie la requête est exécuté, ou si la personne le tape à la main. Alors? Et qui sait, allons vérifier.

Où envoyer? Quoi envoyer? Une requête HTTP à l'adresse IP du serveur, il y a quelque chose comme GET ... puis il y a quelque chose HTTP / 1.1 ... Nous devons voir quoi et où le navigateur envoie. Installez Wireshark , regardez le trafic:

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

Euh ... quoi? Oh oui, nous avons HTTPS. Que faire Organiser une attaque MITM contre vous-même? Idéalement, la victime elle-même nous aidera.

En général, en devinant pour grimper le navigateur, j'ai quand même trouvé la demande elle-même, et le destinataire. C'est parti:

Dialogue avec le 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. 
Huh. Hé hé. En effet, ce que j'attendais en envoyant une requête HTTP nue à un port HTTPS. Est-il chiffré maintenant? Tout ça avec des clés RSA, puis avec SHA256. Et pourquoi, il y a OpenSSL pour de telles questions. Eh bien, nous savons déjà quoi faire, supprimez d'abord les champs Referer et Cookie - je pense qu'ils n'affecteront pas beaucoup le problème:

Dialogue avec le 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 



Est-ce un échec et mat sur le serveur? Eh bien, au moins 200 OK m'ont répondu, ce qui signifie que les cookies et le référent n'affectent rien. Compression Gzip, mais les caractères ASCII sont copiés lors de la copie. De même, vous pouvez supprimer la ligne de codage Accept . Tout va bien - nous obtenons un document HTML, maintenant avec des assonances. Mais voici deux questions: comment exécuter OpenSSL et lui transmettre des données avec un script? Et comment lire la sortie, si après avoir reçu la réponse on reste comme dans le «shell» d'OpenSSL? Si vous pouvez penser à quelque chose avec le second, mais avec le premier ...

C'est bien qu'il y ait un Habr , où j'ai lu sur l'utilitaire expect , qui automatise le processus d'interaction avec les programmes qui attendent une interaction humaine. Encore plus attrayante est la présence de la commande autoexpect qui génère un script d' attente pour vos actions. Eh bien, cours, fais tout et voici le script fini. Seulement, c'est très énorme, et tout cela parce qu'OpenSSL affiche les certificats, les clés et s'attend à ce qu'il affiche tout cela. Avons-nous besoin de cela? Non. Nous démolissons la première invite, ne laissant que le dernier saut de ligne «\ r». Nous supprimons également les champs User-Agent et Accept de notre demande - ils n'affectent rien. Commençons donc. Le script est exécuté, mais où est le document HTML convoité? Attendez-vous mangé. Pour le faire cracher, vous devez mettre:

 set results $expect_out(buffer) 

avant la fin du script - c'est ainsi que la sortie de la commande expect exécutée sera écrite et affichée. En résumé, quelque chose comme ceci:

Attendre le script
 #!/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.1\rHost: HOST\rAccept-Language: en-US,en;q=0.5\rX-Requested-With: XMLHttpRequest\rConnection: close" expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1\r Host: HOST\r Accept-Language: en-US,en;q=0.5\r X-Requested-With: XMLHttpRequest\r Connection: close" send -- "\r" set results $expect_out(buffer) expect -exact "\r " send -- "\r" expect eof 

Mais ce n'est pas tout! Comme vous pouvez le voir, dans tous les exemples, l'URL de la requête était statique, mais c'est lui qui est responsable du mot sur lequel les assonances seront affichées. Et il s'avère que nous chercherons constamment par le mot "% d0% b7% d0% b4% d0% b5% d1% 81% d1% 8c" en ASCII ou "ici" en UTF-8. Que faire Bien sûr, générez simplement un nouveau script à chaque fois, amis! Non seulement ohm, mais avec écho , car dans notre pays, rien ne change sauf le mot. Et vive le nouveau problème: comment traduire intelligemment un mot de cyrillique en un format URL? Quelque chose pour le terminal n'a rien de spécial non plus. Eh bien, rien, pouvons-nous? Nous pouvons:

Regardez ce que je peux!
 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')} 

Au total, nous avons un script qui convertit le mot en texte ASCII, générant un autre script qui demande via la page du serveur OpenSSL du site avec les assonances. Et puis nous redirigeons la sortie du dernier script vers le fichier et à l'ancienne nous le passons à travers les "filtres" de l' excédent, les carrés et l'ajoutons au fichier.

Intersection d'ensembles. Résumé


En fait, c'est exactement ce qui cause le moins de problèmes. Nous effectuons les procédures ci-dessus pour deux mots, puis à partir de deux listes, nous comparons chaque mot avec chacun et si une correspondance est trouvée, nous l'afficherons. Maintenant, nous avons un script qui prend deux mots à l'entrée et affiche une liste de mots qui riment avec les deux, en tenant compte des assonances, et tout cela sans basculer manuellement entre les quatre onglets et se souvenir des mots «à l'œil» - c'est tout collectés, enregistrés et éliminés automatiquement. Super.

Le but de cette publication était de montrer que si une personne a besoin de quelque chose, elle le fera quand même. Très inefficace, tordu, effrayant, mais cela fonctionnera.

Source: https://habr.com/ru/post/fr474448/


All Articles