Was das Gehirn eines Studenten in der Computerwelt kann

Guten Tag.

Nachdem ich ein weiteres Skript über Bash geschrieben hatte, wurde mir klar, dass alles völlig anders sein sollte, aber alles funktionierte. Ich möchte Ihnen zeigen, welche Schimpfwörter und Krücken ich geschrieben habe, um das Problem zu lösen, aber bisher ohne ein Auto des Wissens. Mit anderen Worten, eine Karikatur der Programmierung.

Herausforderung


Etwas wurde notwendig, um:
  • Es wurden viele Reime für ein Wort gedruckt, außer für Quadrate
  • Kreuzte viele Reime von zwei Wörtern

Wofür? Nun, hier ist es - und das war's.
Wer nicht weiß, ein quadratischer Reim (im allgemeinen Sprachgebrauch - ein Quadrat) ist zwei Wörter, die die letzten beiden Buchstaben in der Schreibweise haben, was sie (oft nur dies) zu einem Reim macht. Zum Beispiel Rosen - Frost; Der Reifen ist ein Auto. Die Verwendung von Quadraten in der modernen Versifikation wird von Menschen aufgrund ihrer Primitivität nicht besonders gebilligt.

Lösung


Die einfachste Lösung schien mir, ein Skript auf Bash zu schreiben, das den bereits existierenden Reimgenerator - HOST - verwendet, der sie zuallererst nach Harmonien auswählt und nicht durch Rechtschreibung. Was ist ein Host? Denn wenn Sie den tatsächlichen Namen der Website angeben, wird diese Werbung angezeigt. Warum nicht weiterverwenden? Erstens erzeugt es trotz seines Vorteils bei der Auswahl von Reimen nach Harmonien häufig Quadrate. Zweitens müssen Sie immer noch mit Ihrem Gehirn nachdenken, Zeit damit verbringen, zwischen Registerkarten zu wechseln, und sich daran erinnern, Wörter in Listen wiederholt zu haben, um Reime für zwei Wörter zu finden.

Starke Reime bekommen


Was weiß ich Ich kenne das Dienstprogramm wget , das die Seite unter der angegebenen URL herunterlädt. Nun, wir erfüllen die Anfrage - wir bekommen die HTML-Seite in der Datei, die ein Wort für Reim genannt wird. Suchen Sie beispielsweise nach dem Wort "hier":

wget https://HOST/rifma/ 

Aber ich brauche nur eine Liste von Wörtern, wie man alles andere loswird? Wir schauen und sehen, dass die Liste der Wörter in Form einer Liste angeordnet ist, wie seltsam es auch erscheinen mag, und die Wörter befinden sich in den <li> </ li> -Tags. Nun, wir haben ein wunderbares sed- Utility - und schreiben es auf:


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

Wählen Sie zunächst aus der Wortdatei die Zeilen aus, die das <li> -Tag enthalten. Wir erhalten eine Reihe leerer Tags und Zeilen mit Wörtern. Wir entfernen das Tag selbst und sein schließendes - hier werden Prozentzeichen anstelle von Schrägstrichen verwendet, da das </ li> -Tag bereits einen Schrägstrich enthält, weshalb sed Sie nicht ein bisschen versteht. Und mit Interesse ist alles in Ordnung. Wir entfernen alle Leerzeichen aus der Datei, löschen leere Zeilen. Voila - eine vollständige Liste der Wörter.

Um Wörter zu entfernen, die sich aufgrund der letzten Buchstaben reimen, wählen Sie die letzten beiden Buchstaben aus dem ursprünglichen Wort aus und bereinigen Sie die Liste:

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

Wir schauen, versuchen - alles funktioniert ... also, aber wo ist die Liste für das Wort "spielen"? Und für das Wort "Ich komme"? Die Datei ist leer! Und das alles, weil diese Wörter Verben sind und wir wissen, was sie mit denen machen, die sich zu Verben reimen. Der Verbreim ist für die meisten Verben in der russischen Sprache und sogar für alle mit denselben Endungen noch schlechter als der quadratische, weshalb sie nach Überprüfung der Endungen nicht in der endgültigen Datei enthalten waren.

Allerdings nicht in Eile. Für jedes Wort gibt es nicht nur Reime, sondern auch Assonanzen, die manchmal viel besser klingen als Reime - dafür sind sie auch Assonanzen (französische Assonanz, aus dem lateinischen assono - ich klinge gut).

Bekomme Assonanzen


Hier beginnt der Spaß: Die Assonanzen werden auf einer separaten URL und auf derselben Seite angezeigt, indem ein Skript ausgeführt, eine HTTP-Anfrage gesendet und eine Antwort empfangen wird. Wie kann ich wget anweisen , auf eine Schaltfläche zu klicken? Aber in irgendeiner Weise. Es ist traurig.

Als ich bemerkte, dass sich die URL in der Zeichenfolge immer noch irgendwie ändert, kopierte ich das, was nach dem Wechsel zu Assonanzen vorhanden war, und fügte es in einen neuen Browser-Tab ein - starke Reime wurden geöffnet. Nicht das.

Tatsächlich, dachte ich, sollte es dem Server egal sein, ob das Skript, das die Anfrage sendet, ausgeführt wird oder ob die Person sie manuell eingibt. Also? Und wer weiß, lass uns nachsehen.

Wohin senden? Was soll ich senden? Bei einer HTTP-Anfrage an die IP des Servers gibt es so etwas wie GET ... dann gibt es etwas HTTP / 1.1 ... Wir müssen sehen, was und wohin der Browser sendet. Installiere wireshark , sieh dir den Verkehr an:

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 ... was? Oh ja, wir haben HTTPS. Was zu tun ist? Einen MITM-Angriff auf sich selbst arrangieren? Im Idealfall hilft uns das Opfer selbst.

Im Allgemeinen habe ich beim Erraten des Browsers immer noch die Anfrage selbst und den Empfänger gefunden. Lass uns gehen:

Dialog mit dem 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. Hey hey In der Tat, was ich erwartet hatte, indem ich eine reine HTTP-Anfrage an einen HTTPS-Port gesendet habe. Ist es jetzt verschlüsselt? All diese Aufregung mit RSA-Schlüsseln, dann mit SHA256. Und warum gibt es OpenSSL für solche Angelegenheiten. Nun, wir wissen bereits, was zu tun ist. Entfernen Sie zuerst die Felder Referer und Cookie. Ich denke, sie werden die Angelegenheit nicht wesentlich beeinflussen:

Dialog mit dem 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 



Ist das ein Schachmatt auf dem Server? Nun, mindestens 200 OK haben mir geantwortet, was bedeutet, dass Cookies und Referrer nichts beeinflussen. Gzip-Komprimierung, aber ASCII-Zeichen werden beim Kopieren kopiert. Ebenso können Sie die Accept-Codierungszeile entfernen. Alles ist in Ordnung - wir bekommen ein HTML-Dokument, jetzt mit Assonanzen. Aber hier sind zwei Fragen: Wie kann man OpenSSL ausführen und Daten mit einem Skript an dieses übergeben? Und wie liest man die Ausgabe, wenn wir nach Erhalt der Antwort wie in der „Shell“ von OpenSSL bleiben? Wenn Ihnen mit dem zweiten etwas einfällt, aber mit dem ersten ...

Es ist gut, dass es einen Habr gibt , in dem ich über das Expect- Dienstprogramm lese, das den Prozess der Interaktion mit Programmen automatisiert, die auf menschliche Interaktion warten. Noch attraktiver ist das Vorhandensein des Befehls autoexpect , der ein Expect- Skript für Ihre Aktionen generiert. Nun, lauf, mach alles und hier ist das fertige Skript. Nur ist es sehr groß und alles, weil OpenSSL Zertifikate und Schlüssel anzeigt und erwartet, dass all dies angezeigt wird. Brauchen wir das Nein. Wir zerstören die erste Eingabeaufforderung und lassen nur den letzten Zeilenumbruch '\ r'. Wir entfernen auch die Felder User-Agent und Accept aus unserer Anfrage - sie haben keine Auswirkungen. Also, fangen wir an. Das Skript wird ausgeführt, aber wo befindet sich das begehrte HTML-Dokument? Erwarten Sie es gegessen. Um ihn dazu zu bringen, es auszuspucken, müssen Sie Folgendes sagen:

 set results $expect_out(buffer) 

vor dem Ende des Skripts - auf diese Weise wird die Ausgabe des ausgeführten Befehls await geschrieben und angezeigt. Zusammenfassend so etwas wie:

Erwarten Sie ein Skript
 #!/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 

Aber das ist noch nicht alles! Wie Sie sehen können, war die Anforderungs-URL in allen Beispielen statisch. Er ist jedoch dafür verantwortlich, für welches Wort die Assonanzen angezeigt werden. Und so stellt sich heraus, dass wir ständig nach dem Wort "% d0% b7% d0% b4% d0% b5% d1% 81% d1% 8c" in ASCII oder "hier" in UTF-8 suchen. Was zu tun ist? Natürlich einfach jedes Mal ein neues Drehbuch generieren, Freunde! Nur nicht automatisch Ohm erwarten , sondern mit Echo , weil In unserem Land ändert sich nichts außer dem Wort. Und es lebe das neue Problem: Wie würden wir ein Wort aus dem Kyrillischen irgendwie intelligent in ein URL-Format übersetzen? Etwas für das Terminal ist auch nichts Besonderes. Na ja, nichts, können wir? Wir können:

Schau was ich kann!
 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')} 

Insgesamt haben wir ein Skript, das das Wort in ASCII-Text konvertiert und ein weiteres Skript generiert, das mit den Assonanzen über die OpenSSL-Serverseite der Site anfordert. Und dann leiten wir die Ausgabe des letzten Skripts in die Datei um und leiten sie auf die alte Weise durch die "Filter" der überschüssigen Quadrate und fügen sie der Datei hinzu.

Schnittmenge von Mengen. Zusammenfassung


Genau das verursacht die geringsten Probleme. Wir führen die obigen Prozeduren für zwei Wörter durch, vergleichen dann aus zwei Listen jedes Wort mit jedem und wenn es eine Übereinstimmung findet, zeigen wir es an. Jetzt haben wir ein Skript, das zwei Wörter zur Eingabe verwendet und eine Liste von Wörtern anzeigt, die sich mit beiden reimen, wobei die Assonanzen berücksichtigt werden, und dies alles, ohne manuell zwischen den vier Registerkarten zu wechseln und sich die Wörter „per Auge“ zu merken - das ist alles automatisch gesammelt, aufgezeichnet und verworfen. Großartig.

Der Zweck dieser Veröffentlichung war es zu zeigen, dass eine Person, die etwas braucht, es trotzdem tun wird. Sehr ineffizient, krumm, gruselig, aber das wird funktionieren.

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


All Articles