Mihin tietokonemaailmasta oppivan opiskelijan aivot pystyvät?

Hyvää päivää.

Valmistuttuani toisen käsikirjoituksen kirjoittamisen Bashissa tajusin, että kaiken pitäisi olla täysin erilaista, mutta kaikki toimi. Haluan näyttää teille, mitä röyhkeyttä ja kainalosauvoja kirjoitin ratkaistakseni ongelman, mutta minulla ei vielä ole tietoa. Toisin sanoen ohjelmoinnin karikatyyri.

Tehtävä


Jotain tuli tarpeelliseksi:

  • Näytti useita riimejä sanalle neliöitä lukuun ottamatta
  • Ylitti kahden sanan monet riimit

Minkä vuoksi? No, siinä se - ja siinä se.
Kuka ei tiedä, neliön riimi (yleisessä kielessä - neliö) on kaksi sanaa, joiden oikeinkirjoituksen kaksi viimeistä kirjainta osuvat yhteen, mikä (usein tämä on ainoa asia) tekee niistä riimin. Esimerkiksi ruusut ovat huurteita; rengas - auto. Ihmiset eivät ole erityisen hyväksyneet neliöiden käyttöä nykyaikaisessa versiossa niiden primitiivisyyden vuoksi.

päätös


Minusta näytti, että yksinkertaisin ratkaisu oli kirjoittaa Bashissa komentosarja, joka käyttää jo olemassa olevaa riimigeneraattoria - HOSTia, joka valitsee ne ensisijaisesti konsonanssin eikä oikeinkirjoituksen perusteella. Millainen isäntä? Koska jos ilmoitat sivuston oikean nimen, he sanovat, että se on mainos. Mikset jatkaisi sen käyttöä? Ensinnäkin huolimatta siitä, että hänellä on etu valita riimejä konsonanssien perusteella, hän tuottaa edelleen usein neliöitä. Toiseksi, sinun täytyy silti ajatella aivoillasi, käyttää aikaa välilehtien välillä vaihtamiseen ja energiaa muistaa toistuvia sanoja luetteloissa löytääksesi riimin kahdelle sanalle.

Vahvojen riimien saaminen

Mitä minä tiedän? Tiedän apuohjelmasta wget, joka lataa sivun määritetystä URL-osoitteesta. Okei, suoritetaan pyyntö - saamme HTML-sivun tiedostoon, jonka nimi on riimivä sana. Etsitään esimerkiksi sanaa "täällä":

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

Mutta tarvitsen vain sanalistan, kuinka pääsen eroon kaikesta muusta? Katsomme ja näemme, että sanaluettelo on muotoiltu, vaikka se olisi kuinka outoa tahansa, luettelon muodossa ja sanat ovat tageissa . No, meillä on hyvä apuväline. jano - kirjoitetaan se ylös näin:

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

Valitse ensin sanatiedostosta rivit, jotka sisältävät tunnisteen - saamme joukon tyhjiä tunnisteita ja rivejä sanoilla. Poistamme itse tagin ja sen sulkevan - tässä käytetään prosenttisymboleja vinoviivojen sijaan, koska itse tagissa siellä on jo kauttaviiva, miksi? jano ei ymmärrä sinua vähän. Ja korkojen kanssa kaikki on kunnossa. Poistamme tiedostosta kaikki välilyönnit, poistamme tyhjät rivit. Voila - valmis sanaluettelo.

Poistaaksesi sanat, jotka riimivät viimeisillä kirjaimilla, valitse kaksi viimeistä kirjainta alkuperäisestä sanasta ja tyhjennä luettelo:

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

Katsomme, yritämme - kaikki toimii... niin, missä on lista sanalle "play"? Ja sanalle "menen"? Tiedosto on tyhjä! Ja tämä kaikki johtuu siitä, että nämä sanat ovat verbejä, ja me tiedämme, mitä ne tekevät niille, jotka riimeilevät verbeillä. Verbiriimi on pahempi kuin neliöriimi, koska venäjän kielessä on eniten verbejä, ja niillä kaikilla on samat päätteet, minkä vuoksi ne eivät olleet lopputiedostossa päätteiden tarkistuksen jälkeen.

Meillä ei kuitenkaan ole kiirettä. Jokaiselle sanalle ei ole vain riimejä, vaan myös assonansseja, jotka joskus kuulostavat paljon paremmilta kuin riimi - siksi ne ovat assonansseja (ranskalainen assonanssi, latinasta assono - kuulen harmonisesti).

Saamme assonansseja

Tästä hauskuus alkaa: assonanssit näkyvät erillisessä URL-osoitteessa ja samalla sivulla suorittamalla komentosarjan, lähettämällä HTTP-pyynnön ja vastaanottamalla vastauksen. Miten voin sanoa wget'Painatko nappia? Mutta ei mitenkään. Valitettavasti.

Huomasin, että rivin URL-osoite oli jotenkin muuttumassa, kopioin siellä olevan assonanssiin vaihtamisen jälkeen ja liitin sen uudelle selaimen välilehdelle - vahvoja riimejä avautui. Ei se.

Itse asiassa ajattelin, että palvelimelle ei pitäisi olla väliä, suoritetaanko sille pyynnön lähettänyt komentosarja vai kirjoittaako henkilö sen käsin. Niin? Kuka tietää, mennään katsomaan.

Minne lähettää? Mitä lähettää? HTTP-pyyntö palvelimen IP:lle, siellä on jotain kuten GET... sitten on jotain HTTP/1.1... Pitää katsoa mitä selain lähettää ja minne. Asentaa Wireshark, katso liikennettä:

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

Öö mitä? Kyllä, meillä on HTTPS. Mitä tehdä? Aloita MITM-hyökkäys itseäsi vastaan? Ihannetapauksessa uhri itse auttaa meitä.

Yleisesti ottaen, kun päätin surffata selaimessa, löysin lopulta itse pyynnön ja vastaanottajan. Mennä:

Vuoropuhelu terminaalin kanssa

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.

Hei. Hehehe. Todellakin, sitä odotin lähettäessäni paljaan HTTP-pyynnön HTTPS-porttiin. Pitäisikö meidän nyt salata? Kaikki tämä meteli RSA-avaimilla ja sitten SHA256:lla. Miksi, on OpenSSL sellaisiin asioihin. No, tiedämme jo mitä tehdä, poistamme vain Viittaus- ja Eväste-kentät - en usko, että ne eivät vaikuta asiaan paljoa:

Vuoropuhelu terminaalin kanssa

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

Mihin tietokonemaailmasta oppivan opiskelijan aivot pystyvät?

Mitä tämä on, palvelimen kiroilu? No, ainakin minulle vastattiin 200 OK, mikä tarkoittaa, että evästeet ja viittaus eivät vaikuta mihinkään. Pakkaus on gzip, mutta kopioitaessa ASCII-merkit kopioidaan. Aivan, voit poistaa linjan Hyväksy-koodaus. Kaikki on hyvin - saamme HTML-dokumentin, nyt assonanssien kanssa. Mutta tässä on kaksi kysymystä: kuinka suorittaa OpenSSL ja siirtää tietoja siihen komentosarjan avulla? Ja kuinka lukea tulos, jos vastauksen saatuamme jäämme ikään kuin OpenSSL-kuoreen? Jos voit keksiä jotain toisella, mutta ensimmäisellä...

Hyvä että on Habrjosta luin apuohjelmasta odottaa, joka automatisoi vuorovaikutuksen sellaisten ohjelmien kanssa, jotka odottavat ihmisten vuorovaikutusta. Joukkue on vieläkin houkuttelevampi automaattinen odotus, tuottaa odottaa käsikirjoitus toimintasi perusteella. No, käynnistämme sen, teemme kaiken tämän ja tässä on valmis käsikirjoitus. Vain hän on erittäin suuri, ja kaikki siksi OpenSSL näyttää varmenteet, avaimet ja odottaa odottaa tämän kaiken tulosta. Tarvitsemmeko tätä? Ei. Poistamme koko ensimmäisen kehotteen jättäen vain viimeisen rivinvaihdon "r". Poistamme pyynnöstämme myös User-Agent- ja Accept-kentät - ne eivät vaikuta mihinkään. Joten käynnistetään. Skripti suoritettiin, mutta missä on arvokas HTML-dokumentti? Odottaa söi sen. Saadaksesi hänet sylkemään sen ulos, sinun on laitettava:

set results $expect_out(buffer)

ennen komentosarjan loppua - näin suoritettavan tiedoston tulos kirjoitetaan odottaa'om-komento ja näytetään näytöllä. Yhteenvetona jotain tämän kaltaista:

odottaa käsikirjoitusta

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

Mutta ei siinä vielä kaikki! Kuten näet, kaikissa esimerkeissä pyynnön URL-osoite oli staattinen, mutta se on URL-osoite, joka on vastuussa siitä, mikä sana liittyy assonanssiin. Ja niin käy ilmi, että etsimme jatkuvasti sanaa "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" ASCII-muodossa tai "täällä" UTF-8:ssa. Mitä tehdä? Tietenkin, luo vain uusi käsikirjoitus joka kerta, ystävät! Ei enää automaattinen odotus"Oi, ja sen avulla kaiku, koska Uudessamme mikään ei muutu paitsi sana. Ja eläköön uusi ongelma: kuinka voimme älykkäästi kääntää sanan kyrillisestä URL-muotoon? Myöskään terminaalissa ei ole mitään erityistä. No, ei hätää, voimme tehdä sen, eikö? Voi:

Katso mitä voin tehdä!

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

Kaiken kaikkiaan meillä on skripti, joka muuntaa sanan ASCII-tekstiksi ja luo toisen komentosarjan, joka pyytää palvelimelta sivua assonanssien kanssa OpenSSL:n kautta. Ja sitten ohjaamme viimeisen skriptin tulosteen tiedostoon ja välitämme sen vanhanaikaisesti läpi "suodattimet" ylimääräisiä neliöitä ja kirjoita ne tiedostoon.

Monien risteys. Bottom line

Itse asiassa tämä aiheuttaa vähiten ongelmia. Suoritamme yllä olevat toimenpiteet kahdelle sanalle, sitten kahdesta luettelosta vertaamme jokaista sanaa kuhunkin ja jos vastaavuus löytyy, tulostamme sen. Nyt meillä on skripti, joka ottaa kaksi sanaa syötteenä ja näyttää luettelon sanoista, jotka rimmuavat molempien kanssa, ja jopa assonanssit huomioon ottaen, ja kaikki tämä ilman manuaalista vaihtamista neljän välilehden välillä ja sanojen muistamista "silmällä" - kaikki kerätty, laskettu varten ja hylätään automaattisesti. Ihana.

Tämän julkaisun tarkoituksena oli osoittaa, että jos ihminen tarvitsee jotain, hän tekee sen joka tapauksessa. Erittäin tehoton, vino, kammottava, mutta se toimii.

Lähde: will.com

Lisää kommentti