Kion kapablas la cerbo de studento lernanta pri la komputila mondo?

Bonan tempon de tago.

Fininte verki alian skripton en Bash, mi rimarkis, ke ĉio devus esti tute alia, sed ĉio funkciis. Mi volas montri al vi kiajn obscenaĵojn kaj lambastonojn mi skribis por solvi la problemon, sed ankoraŭ ne havante vagonon de scio. Alivorte, karikaturo de programado.

Objektivo


Io fariĝis necesa por:

  • Montris multajn rimojn por la vorto, krom kvadratoj
  • Transiris la multajn rimojn de du vortoj

Por kio? Nu, jen — kaj jen.
Kiu ne scias, kvadrata rimo (laŭ komuna lingvo - kvadrato) estas du vortoj, kies lastaj du literoj en literumo koincidas, kiuj (ofte, tio estas la sola) igas ilin rimo. Ekzemple, rozoj estas frostaj; pneŭo - aŭto. La uzo de kvadratoj en moderna versado ne estas precipe aprobita de homoj, pro ilia primitiveco.

decido


Ŝajnis al mi, ke la plej simpla solvo estis verki skripton en Bash, kiu uzas jam ekzistantan rimgeneratoron - HOST, kiu unuavice elektas ilin per konsonanco, kaj ne per literumo. Kia GASTO? Ĉar se vi indikas la veran nomon de la retejo, ili diros, ke ĝi estas reklamo. Kial ne daŭre uzi ĝin? Unue, malgraŭ sia avantaĝo elekti rimojn bazitajn sur konsonancoj, li ankoraŭ ofte produktas kvadratojn. Due, vi ankoraŭ devas pensi per via cerbo, pasigi tempon ŝanĝante inter langetoj, kaj energio enmemorigante ripetajn vortojn en listoj por trovi rimon por du vortoj.

Akirante fortajn rimojn

Kion mi scias? Mi scias pri la utileco wget, kiu elŝutas la paĝon ĉe la specifita URL. Bone, ni plenumu la peton - ni ricevas HTML-paĝon en dosiero nomita per rimvorto. Ekzemple, ni serĉu la vorton "ĉi tie":

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

Sed mi bezonas nur liston de vortoj, kiel mi povas forigi ĉion alian? Ni rigardas kaj vidas, ke la listo de vortoj estas formatita, kiom ajn stranga ĝi estu, en formo de listo, kaj la vortoj estas en etikedoj. . Nu, ni havas bonegan utilecon. sed - ni skribu ĝin jene:

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

Unue, el la vortdosiero, elektu la liniojn kiuj enhavas la etikedon — ni ricevas amason da malplenaj etikedoj kaj linioj kun vortoj. Ni forigas la etikedon mem kaj ĝian fermon - ĉi tie oni uzas procentajn simbolojn anstataŭ oblikvojn ĉar en la etikedo mem jam estas oblikvo, kial? sed ne komprenas vin iomete. Kaj ĉio estas en ordo kun intereso. Ni forigas ĉiujn spacojn de la dosiero, forigas malplenajn liniojn. Voila - preta listo de vortoj.

Por forigi vortojn, kiuj rimiĝas uzante la lastajn literojn, elektu la lastajn du literojn el la origina vorto kaj purigu la liston:

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

Ni rigardas, ni provas - ĉio funkcias... do, kie estas la listo por la vorto "ludi"? Kaj por la vorto "mi iras"? La dosiero estas malplena! Kaj ĉi tio estas ĉio ĉar ĉi tiuj vortoj estas verboj, kaj ni scias, kion ili faras al tiuj, kiuj rimiĝas kun verboj. Verba rimo estas pli malbona ol eĉ kvadrata rimo, ĉar la rusa lingvo havas la plej multajn verbojn, kaj ĉiuj havas la samajn finaĵojn, tial ili ne estis en la fina dosiero post kontrolo de la finaĵoj.

Tamen ni ne hastas. Por ĉiu vorto estas ne nur rimoj, sed ankaŭ asonancoj, kiuj foje sonas multe pli bone ol rimo - tial ili estas asonancoj (franca asonanco, el la latina assono - mi sonas harmonie).

Ni ricevas asonancojn

Jen kie komenciĝas la amuzo: asonancoj aperas ĉe aparta URL, kaj sur la sama paĝo, per ekzekuto de skripto, sendante HTTP-peton kaj ricevante respondon. Kiel mi povas diri wget— Ĉu vi premas la butonon? Sed neniel. Bedaŭrinde.

Rimarkinte, ke la URL en la linio iel ŝanĝiĝas, mi kopiis tion, kio estis tie post ŝanĝado al asonancoj kaj algluis ĝin en novan foliumilan langeton - fortaj rimoj malfermiĝis. Ne tio.

Esence, mi pensis, ne gravas al la servilo ĉu la skripto sendanta al ĝi la peton estas efektivigita, aŭ ĉu la persono tajpas ĝin mane. Do? Kiu scias, ni iru kontroli ĝin.

Kien sendi? Kion sendi? HTTP-peto al la IP-servilo, estas io kiel GET... tiam estas io HTTP/1.1... Ni devas vidi kion la retumilo sendas kaj kien. Instali wireshark, rigardu la trafikon:

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

Um... kio? Ho jes, ni havas HTTPS. Kion fari? Ĉu lanĉi MITM-atakon kontraŭ vi mem? Ideale, la viktimo mem helpos nin.

Ĝenerale, decidinte navigi la retumilon, mi finfine trovis la peton mem kaj la adresaton. Iru:

Dialogo kun la terminalo

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.

Hej. Hehehe. Efektive, tion mi atendis sendinte nudan HTTP-peton al HTTPS-haveno. Ĉu ni nun ĉifri? Ĉio ĉi tiu tumulto kun RSA-ŝlosiloj, poste kun SHA256. Nu, ekzistas OpenSSL por tiaj aferoj. Nu, ni jam scias kion fari, ni unue forigos la kampojn Referer kaj Kuketo - mi pensas, ke ili ne multe influos la aferon:

Dialogo kun la terminalo

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

Kion kapablas la cerbo de studento lernanta pri la komputila mondo?

Kio estas ĉi tio, ĵurado sur la servilo? Nu, ili almenaŭ respondis al mi 200 Bone, kio signifas, ke kuketoj kaj la referanto influas nenion. Kunpremado estas gzip, sed dum kopiado, Askio-signoj estas kopiitaj. Ĝuste, vi povas forigi la linion Akcept-kodigo. Ĉio estas en ordo - ni ricevas HTML-dokumenton, nun kun asonancoj. Sed jen du demandoj: kiel ruli OpenSSL kaj transdoni datumojn al ĝi per skripto? Kaj kiel legi la eligon, se post ricevi la respondon ni restas kvazaŭ en OpenSSL "ŝelo"? Se vi povas elpensi ion kun la dua, sed kun la unua...

Estas bone, ke ekzistas Habrkie mi legis pri la utileco atendu, kiu aŭtomatigas la procezon de interagado kun programoj kiuj atendas homan interagon. Havi teamon estas eĉ pli alloga autoatendi, generante atendu skripto bazita sur viaj agoj. Nu, ni lanĉas ĝin, faru ĉion ĉi kaj jen la finita skripto. Nur li estas tre grandega, kaj ĉio ĉar OpenSSL montras atestilojn, ŝlosilojn, kaj atendu atendas la eligon de ĉio ĉi. Ĉu ni bezonas ĉi tion? Ne. Ni forigas la tutan unuan instigon, lasante nur la lastan linion "r". Ni ankaŭ forigas la kampojn Uzanto-Agente kaj Akceptu de nia peto - ili influas nenion. Do, ni lanĉu. La skripto estis ekzekutita, sed kie estas la trezora HTML-dokumento? atendi manĝis ĝin. Por igi lin kraĉi ĝin, vi devas meti:

set results $expect_out(buffer)

antaŭ la fino de la skripto - jen kiel la eligo de la plenumebla estos skribita atendu'om komando kaj montrata sur la ekrano. En resumo, io kiel ĉi tio:

expect'a skripto

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

Sed tio ne estas ĉio! Kiel vi povas vidi, en ĉiuj ekzemploj la peta URL estis senmova, sed estas la URL kiu respondecas pri kiu vorto la asonancoj estos montrataj. Kaj do rezultas, ke ni konstante serĉos la vorton "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" en ASCII aŭ "ĉi tie" en UTF-8. Kion fari? Kompreneble, simple simple generu novan skripton ĉiufoje, amikoj! Ne plu autoatendi— Ho, kaj kun la helpo eĥo, ĉar En nia nova, nenio ŝanĝiĝas krom la vorto. Kaj vivu la nova problemo: kiel ni inteligente traduku vorton el la cirila en URL-formaton? Ankaŭ estas nenio speciala por la fina stacio. Nu, estas bone, ni povas fari ĝin, ĉu ne? Povas:

Rigardu, kion mi povas fari!

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

Entute, ni havas skripton, kiu konvertas vorton en ASCII-tekston, generante alian skripton, kiu petas retejan paĝon kun asonancoj de la servilo per OpenSSL. Kaj tiam ni redirektas la eliron de la lasta skripto al dosiero kaj, laŭ la malnova maniero, trapasas ĝin "filtriloj" kromaj kvadratoj kaj skribu ilin al la dosiero.

Intersekciĝo de multaj. Malsupra linio

Efektive, ĉi tio estas ĝuste kio kaŭzas la malplej problemoj. Ni faras la suprajn procedurojn por du vortoj, tiam el la du listoj ni komparas ĉiun vorton kun ĉiu kaj se kongruo estas trovita, ni eligas ĝin. Nun ni havas skripton, kiu prenas du vortojn kiel enigo kaj montras liston de vortoj, kiuj rimiĝas kun ambaŭ, kaj eĉ konsiderante asonancojn, kaj ĉio ĉi sen permane ŝanĝi inter kvar langetoj kaj memori vortojn "per okulo" - ĉio kolektita, kalkulita. por kaj forĵetita aŭtomate. Mirinda.

La celo de ĉi tiu eldonaĵo estis montri ke se homo bezonas ion, li faros ĝin ĉiuokaze. Tre neefika, kurba, timiga, sed ĝi funkcios.

fonto: www.habr.com

Aldoni komenton