De quoi est capable le cerveau d’un étudiant qui découvre le monde informatique ?

Bonne journée.

Après avoir fini d'écrire un autre script dans Bash, j'ai réalisé que tout devait être complètement différent, mais tout a fonctionné. Je veux vous montrer quelles obscénités et quelles béquilles j'ai écrites pour résoudre le problème, mais sans avoir encore un wagon de connaissances. Autrement dit, une caricature de la programmation.

Tâche


Quelque chose devenait nécessaire pour :

  • Affichage de nombreuses rimes pour le mot, à l'exception des carrés
  • J'ai croisé les nombreuses rimes de deux mots

Pour quoi? Eh bien, c'est tout - et c'est tout.
Qui ne sait pas, une rime carrée (dans le langage courant - un carré) sont deux mots dont les deux dernières lettres dans l'orthographe coïncident, ce qui (souvent, c'est la seule chose) en fait une rime. Par exemple, les roses sont givrées ; pneu - voiture. L'utilisation de carrés dans la versification moderne n'est pas particulièrement approuvée par les gens, en raison de leur caractère primitif.

décision


Il m'a semblé que la solution la plus simple était d'écrire un script en Bash qui utilise un générateur de rimes déjà existant - HOST, qui les sélectionne principalement par consonance et non par orthographe. Quel type d'HÔTE ? Car si vous indiquez le vrai nom du site, ils diront que c'est une publicité. Pourquoi ne pas continuer à l'utiliser ? Premièrement, malgré son avantage de sélectionner des rimes basées sur des consonances, il produit encore souvent des carrés. Deuxièmement, vous devez toujours réfléchir avec votre cerveau, passer du temps à basculer entre les onglets et de l'énergie à mémoriser des mots répétés dans des listes pour trouver une rime pour deux mots.

Obtenir des rimes fortes

Qu'est ce que je sais? Je connais l'utilitaire wget, qui télécharge la page à l'URL spécifiée. D'accord, exécutons la requête - nous obtenons une page HTML dans un fichier nommé avec un mot qui rime. Par exemple, recherchons le mot « ici » :

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

Mais je n’ai besoin que d’une liste de mots, comment puis-je me débarrasser de tout le reste ? On regarde et on voit que la liste de mots est formatée, aussi étrange soit-elle, sous la forme d'une liste, et les mots sont dans des balises . Eh bien, nous avons un grand utilitaire. sed - écrivons-le comme ceci :

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 Word, sélectionnez les lignes qui contiennent la balise — nous obtenons un tas de balises vides et de lignes avec des mots. Nous supprimons la balise elle-même et sa balise de fermeture - ici les symboles de pourcentage sont utilisés à la place des barres obliques car dans la balise elle-même il y a déjà une barre oblique, pourquoi ? sed ne te comprend pas du tout. Et tout va bien avec les intérêts. Nous supprimons tous les espaces du fichier, supprimons les lignes vides. Voila - une liste de mots prête à l'emploi.

Afin de supprimer les mots qui riment avec les dernières lettres, sélectionnez les deux dernières lettres du mot d'origine et effacez la liste :

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

On regarde, on essaie, tout fonctionne... alors, où est la liste du mot « jouer » ? Et pour le mot « j’y vais » ? Le fichier est vide ! Et tout cela parce que ces mots sont des verbes, et nous savons ce qu'ils font à ceux qui riment avec des verbes. La rime verbale est pire que la rime carrée, car la langue russe a le plus de verbes, et tous ont les mêmes terminaisons, c'est pourquoi ils n'étaient pas dans le fichier final après avoir vérifié les terminaisons.

Cependant, nous ne sommes pas pressés. Pour chaque mot, il y a non seulement des rimes, mais aussi des assonances, qui sonnent parfois bien mieux que des rimes - c'est pourquoi ce sont des assonances (assonance française, du latin assono - je sonne juste).

On obtient des assonances

C'est là que 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 puis-je dire wget« Est-ce que vous appuyez sur le bouton ? Mais pas question. Malheureusement.

Remarquant que l'URL de la ligne changeait d'une manière ou d'une autre, j'ai copié ce qui s'y trouvait après être passé aux assonances et je l'ai collé dans un nouvel onglet du navigateur - des rimes fortes se sont ouvertes. Pas ça.

Essentiellement, pensais-je, peu importe pour le serveur que le script qui lui envoie la requête soit exécuté ou que la personne la tape à la main. Donc? Qui sait, allons voir.

Où envoyer ? Quoi envoyer ? Requête HTTP à l'IP du serveur, il y a quelque chose comme GET... puis il y a quelque chose HTTP/1.1... Nous devons voir ce que le navigateur envoie et où. Installer 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. Ce qu'il faut faire? Lancer une attaque MITM contre vous-même ? Idéalement, la victime elle-même nous aidera.

En général, après avoir décidé de naviguer sur le navigateur, j'ai finalement trouvé la demande elle-même et le destinataire. Aller:

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.

Hé. Héhéhé. En effet, c'est ce à quoi je m'attendais lors de l'envoi d'une simple requête HTTP vers un port HTTPS. Devons-nous chiffrer maintenant ? Tout ce tapage avec les clés RSA, puis avec SHA256. Pourquoi, il y a OpenSSL pour de telles choses. Eh bien, nous savons déjà quoi faire, nous allons d'abord supprimer les champs Référent 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

De quoi est capable le cerveau d’un étudiant qui découvre le monde informatique ?

Qu'est-ce que c'est, jurer sur le serveur ? Eh bien, au moins, ils m'ont répondu 200 OK, ce qui signifie que les cookies et le référent n'affectent rien. La compression est gzip, mais lors de la copie, les caractères ASCII sont copiés. Exactement, vous pouvez supprimer la ligne Accepter-encodage. Tout va bien - nous obtenons un document HTML, maintenant avec des assonances. Mais voici deux questions : comment exécuter OpenSSL et y transférer des données à l'aide d'un script ? Et comment lire le résultat si après avoir reçu la réponse nous restons, pour ainsi dire, dans un « shell » OpenSSL ? Si vous pouvez trouver quelque chose avec le second, mais avec le premier...

C'est bien qu'il y ait Habroù j'ai lu sur l'utilitaire attendre, qui automatise le processus d'interaction avec les programmes qui attendent une interaction humaine. Avoir une équipe est encore plus attractif attente automatique, générant attendre script basé sur vos actions. Bon, on le lance, on fait tout ça et voici le script terminé. Seulement, il est très énorme, et tout cela parce que OpenSSL affiche les certificats, les clés et attendre attend la sortie de tout cela. Avons-nous besoin de ça ? Non. Nous supprimons l'intégralité de 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. Alors, lançons. Le script a été exécuté, mais où est le précieux document HTML ? Attendre je l'ai mangé. Pour le faire cracher, il faut mettre :

set results $expect_out(buffer)

avant la fin du script - c'est ainsi que la sortie de l'exécutable sera écrite attendre'om commande et affiché à l'écran. En résumé, quelque chose comme ça :

j'attends un 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.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

Mais ce n'est pas tout! Comme vous pouvez le constater, dans tous les exemples, l'URL de la requête était statique, mais c'est l'URL qui détermine quel mot sera associé aux assonances. Il s’avère donc que nous rechercherons constamment le mot « %d0%b7%d0%b4%d0%b5%d1%81%d1%8c » en ASCII ou « ici » en UTF-8. Ce qu'il faut faire? Bien sûr, générez simplement un nouveau script à chaque fois, mes amis ! Pas plus attente automatique'oh, et avec l'aide echo, parce que Dans notre nouveauté, rien ne change sauf le mot. Et vive le nouveau problème : comment traduire intelligemment un mot du cyrillique au format URL ? Il n’y a rien de spécial non plus pour le terminal. Eh bien, c'est bon, nous pouvons le faire, non ? Peut:

Regardez ce que je peux faire !

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 un mot en texte ASCII, générant un autre script qui demande une page du site avec des assonances au serveur via OpenSSL. Et puis nous redirigeons la sortie du dernier script vers un fichier et, à l'ancienne, la transmettons "filtres" carrés supplémentaires et écrivez-les dans le fichier.

Intersection de plusieurs. Conclusion

En fait, c’est exactement ce qui pose le moins de problèmes. Nous effectuons les procédures ci-dessus pour deux mots, puis à partir des deux listes, nous comparons chaque mot avec chacun et si une correspondance est trouvée, nous l'affichons. Nous avons maintenant un script qui prend deux mots en entrée et affiche une liste de mots qui riment avec les deux, et même en tenant compte des assonances, et tout cela sans basculer manuellement entre quatre onglets et sans mémoriser les mots « à l'œil nu » - tous collectés, comptabilisés et rejetés automatiquement. Merveilleux.

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 ça fonctionnera.

Source: habr.com

Ajouter un commentaire