Waartoe zijn de hersenen van een student die over de computerwereld leert, in staat?

Goedendag.

Nadat ik klaar was met het schrijven van een ander script in Bash, realiseerde ik me dat alles compleet anders zou moeten zijn, maar alles werkte. Ik wil je laten zien welke obsceniteiten en krukken ik heb geschreven om het probleem op te lossen, maar ik heb nog geen wagen met kennis. Met andere woorden: een karikatuur van programmeren.

Taak


Er werd iets nodig om:

  • Er werden veel rijmpjes voor het woord weergegeven, behalve vierkanten
  • Ik heb de vele rijmpjes van twee woorden overgestoken

Waarvoor? Nou, dat is het - en dat is het.
Wie weet het niet, een vierkant rijm (in het gewone taalgebruik - een vierkant) is twee woorden waarvan de laatste twee letters in de spelling samenvallen, wat (vaak is dit het enige) er een rijm van maakt. Rozen zijn bijvoorbeeld ijzig; band - auto. Het gebruik van vierkanten in moderne versificatie wordt door mensen niet bijzonder goedgekeurd vanwege hun primitiviteit.

beslissing


Het leek mij dat de eenvoudigste oplossing was om een ​​script in Bash te schrijven dat een reeds bestaande rijmgenerator gebruikt - HOST, die ze voornamelijk selecteert op basis van consonantie, en niet op spelling. Wat voor soort HOST? Want als je de echte naam van de site aangeeft, zullen ze zeggen dat het een advertentie is. Waarom zou u het niet blijven gebruiken? Ten eerste produceert hij, ondanks zijn voordeel bij het selecteren van rijmpjes op basis van klanken, nog steeds vaak vierkanten. Ten tweede moet je nog steeds met je hersenen nadenken, tijd besteden aan het schakelen tussen tabbladen en energie besteden aan het onthouden van herhaalde woorden in lijsten om een ​​rijm voor twee woorden te vinden.

Sterke rijmpjes krijgen

Wat weet ik? Ik weet van het hulpprogramma wget, waarmee de pagina op de opgegeven URL wordt gedownload. Oké, laten we het verzoek uitvoeren - we krijgen een HTML-pagina in een bestand met de naam met een rijmend woord. Laten we bijvoorbeeld zoeken naar het woord ‘hier’:

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

Maar ik heb alleen een lijst met woorden nodig, hoe kan ik al het andere verwijderen? We kijken en zien dat de lijst met woorden is opgemaakt, hoe vreemd het ook mag zijn, in de vorm van een lijst, en dat de woorden in tags staan . Welnu, we hebben een groot nut. dorst - laten we het zo opschrijven:

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

Selecteer eerst vanuit het Word-bestand de regels die de tag bevatten — we krijgen een aantal lege tags en regels met woorden. We verwijderen de tag zelf en de afsluitende tag. Hier worden percentagesymbolen gebruikt in plaats van schuine strepen, omdat dit in de tag zelf gebeurt Er is al een schuine streep, waarom? dorst begrijpt je niet een beetje. En alles is goed met rente. We verwijderen alle spaties uit het bestand, verwijderen lege regels. Voila - een kant-en-klare lijst met woorden.

Om woorden te verwijderen die rijmen met de laatste letters, selecteert u de laatste twee letters van het oorspronkelijke woord en maakt u de lijst leeg:

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

We kijken, we proberen - alles werkt... dus waar is de lijst met het woord 'spelen'? En voor het woord “Ik ga”? Het bestand is leeg! En dit komt allemaal omdat deze woorden werkwoorden zijn, en we weten wat ze doen met degenen die op werkwoorden rijmen. Werkwoordrijm is slechter dan zelfs vierkant rijm, omdat de Russische taal de meeste werkwoorden heeft en ze allemaal dezelfde uitgangen hebben. Daarom stonden ze niet in het uiteindelijke bestand na het controleren van de uitgangen.

Wij hebben echter geen haast. Voor elk woord zijn er niet alleen rijmpjes, maar ook assonanties, die soms veel beter klinken dan rijm - daarom zijn het assonanties (Franse assonantie, van het Latijnse assono - ik klink in harmonie).

We krijgen assonanties

Dit is waar het plezier begint: assonanties verschijnen op een aparte URL en op dezelfde pagina, door een script uit te voeren, een HTTP-verzoek te verzenden en een antwoord te ontvangen. Hoe kan ik het zeggen wget'Druk jij op de knop? Maar op geen enkele manier. Helaas.

Toen ik merkte dat de URL in de regel op de een of andere manier aan het veranderen was, kopieerde ik wat er was nadat ik naar assonanties was overgeschakeld en plakte het in een nieuw browsertabblad - er werden sterke rijmpjes geopend. Niet dat.

In wezen, dacht ik, zou het voor de server niet uit moeten maken of het script dat het verzoek verzendt, wordt uitgevoerd, of dat de persoon het met de hand typt. Dus? Wie weet gaan we het eens bekijken.

Waar naartoe sturen? Wat te sturen? HTTP-verzoek naar de server-IP, er is zoiets als GET... dan is er iets HTTP/1.1... We moeten zien wat de browser verzendt en waar. Installeren wireshark, kijk naar het verkeer:

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

Eh... wat? Oh ja, we hebben HTTPS. Wat moeten we doen? Een MITM-aanval op jezelf lanceren? Idealiter zal het slachtoffer ons zelf helpen.

Over het algemeen vond ik, nadat ik had besloten om in de browser te surfen, eindelijk het verzoek zelf en de geadresseerde. Gaan:

Dialoog met de 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.

Hoi. Hehe. Dat is inderdaad wat ik had verwacht bij het verzenden van een kaal HTTP-verzoek naar een HTTPS-poort. Moeten we nu coderen? Al dit gedoe met RSA-sleutels en vervolgens met SHA256. Wel, dat is zo OpenSSL voor zulke dingen. Nou, we weten al wat we moeten doen, we zullen eerst de velden Verwijzing en Cookie verwijderen - ik denk dat ze de zaak niet veel zullen beïnvloeden:

Dialoog met de 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

Waartoe zijn de hersenen van een student die over de computerwereld leert, in staat?

Wat is dit, vloeken op de server? Nou ja, ze antwoordden me tenminste 200 OK, wat betekent dat cookies en de verwijzer nergens invloed op hebben. De compressie is gzip, maar bij het kopiëren worden ASCII-tekens gekopieerd. Precies, je kunt de lijn verwijderen Accept-codering. Alles is in orde - we krijgen een HTML-document, nu met assonanties. Maar hier zijn twee vragen: hoe voer je OpenSSL uit en breng je er gegevens naartoe over met behulp van een script? En hoe moeten we de uitvoer lezen als we na ontvangst van het antwoord als het ware in een OpenSSL-shell blijven? Als je iets kunt bedenken met het tweede, maar met het eerste...

Het is goed dat dat er is Habrwaar ik over het hulpprogramma las verwachten, dat het proces van interactie met programma's automatiseert die menselijke interactie verwachten. Het hebben van een team is nog aantrekkelijker automatisch verwachten, genereren verwachten script op basis van uw acties. Welnu, we lanceren het, doen dit allemaal en hier is het voltooide script. Alleen hij is erg groot, en dat allemaal omdat OpenSSL toont certificaten, sleutels en verwachten wacht op de uitkomst van dit alles. Hebben we dit nodig? Nee. We verwijderen de gehele eerste prompt, waardoor alleen het laatste regeleinde 'r' overblijft. We verwijderen ook de velden User-Agent en Accept uit ons verzoek; deze hebben nergens invloed op. Dus laten we lanceren. Het script is uitgevoerd, maar waar is het waardevolle HTML-document? Verwacht at het. Om hem het uit te laten spugen, moet je het volgende plaatsen:

set results $expect_out(buffer)

vóór het einde van het script - dit is hoe de uitvoer van het uitvoerbare bestand zal worden geschreven verwachten'om-opdracht en weergegeven op het scherm. Samengevat zoiets als dit:

verwacht een 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

Maar dat is niet alles! Zoals u kunt zien, was de verzoek-URL in alle voorbeelden statisch, maar het is de URL die verantwoordelijk is voor welk woord aan assonanties wordt gekoppeld. En zo blijkt dat we voortdurend zullen zoeken naar het woord “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” in ASCII of “hier” in UTF-8. Wat moeten we doen? Genereer natuurlijk gewoon elke keer een nieuw script, vrienden! Niet meer automatisch verwachten'Oh, en met de hulp echo, omdat In ons nieuwe verandert er niets behalve het woord. En lang leve het nieuwe probleem: hoe kunnen we op intelligente wijze een woord uit het Cyrillisch naar URL-formaat vertalen? Ook voor de terminal is er niets bijzonders. Nou, het is oké, we kunnen het doen, toch? Kan:

Kijk wat ik kan doen!

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 totaal hebben we een script dat een woord omzet in ASCII-tekst, en een ander script genereert dat via OpenSSL een sitepagina met assonanties opvraagt ​​bij de server. En dan sturen we de uitvoer van het laatste script om naar een bestand en geven het op de ouderwetse manier door "filters" extra vierkanten en schrijf ze naar het bestand.

Kruispunt van velen. Kortom

Eigenlijk is dit precies wat de minste problemen veroorzaakt. We voeren de bovenstaande procedures uit voor twee woorden, vervolgens vergelijken we uit de twee lijsten elk woord met elk woord en als er een overeenkomst wordt gevonden, voeren we deze uit. Nu hebben we een script dat twee woorden als invoer neemt en een lijst met woorden weergeeft die op beide rijmen, en zelfs rekening houdt met assonanties, en dit alles zonder handmatig tussen vier tabbladen te schakelen en woorden “met het oog” te onthouden - allemaal verzameld, verantwoord voor en automatisch verwijderd. Prachtig.

Het doel van deze publicatie was om te laten zien dat als iemand iets nodig heeft, hij het toch zal doen. Zeer ineffectief, krom, griezelig, maar het zal werken.

Bron: www.habr.com

Voeg een reactie