Čoho je schopný mozog študenta, ktorý sa učí o svete počítačov?

Dobrý deň.

Po dokončení písania ďalšieho scenára v Bash som si uvedomil, že všetko by malo byť úplne inak, ale všetko fungovalo. Chcem vám ukázať, aké sprostosti a barličky som napísal, aby som problém vyriešil, ale zatiaľ nemám vagón vedomostí. Inými slovami, karikatúra programovania.

Úloha


Niečo sa stalo nevyhnutným:

  • Zobrazuje veľa rýmov pre slovo, okrem štvorcov
  • Prekrížil veľa rýmov dvoch slov

Prečo? No to je ono – a to je všetko.
Kto nevie, štvorcový rým (v bežnom jazyku - štvorec) sú dve slová, ktorých posledné dve písmená v pravopise sa zhodujú, čo (často je to jediná vec) z nich robí rým. Napríklad ruže sú mrazivé; pneumatika - auto. Používanie štvorcov v modernej verzií ľudia zvlášť neschvaľujú pre ich primitívnosť.

rozhodnutie


Zdalo sa mi, že najjednoduchším riešením je napísať skript v Bash, ktorý využíva už existujúci generátor rýmov – HOST, ktorý ich primárne vyberá podľa súzvuku, a nie podľa pravopisu. Aký HOST? Pretože ak uvediete skutočný názov stránky, povedia, že ide o reklamu. Prečo ho nepoužívať ďalej? Po prvé, napriek svojej výhode výberu rýmov na základe konsonancií stále často vytvára štvorce. Po druhé, stále musíte premýšľať mozgom, tráviť čas prepínaním medzi kartami a energiou zapamätať si opakované slová v zoznamoch, aby ste našli rým pre dve slová.

Získanie silných rýmov

Čo ja viem? Viem o utilite wget, ktorý stiahne stránku na zadanej URL. Dobre, vykonáme požiadavku – dostaneme stránku HTML v súbore pomenovanom rýmovaným slovom. Hľadajme napríklad slovo „tu“:

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

Ale potrebujem len zoznam slov, ako sa môžem zbaviť všetkého ostatného? Pozeráme sa a vidíme, že zoznam slov je naformátovaný, bez ohľadu na to, aké zvláštne to môže byť, vo forme zoznamu a slová sú v značkách . No, máme skvelú pomôcku. smäd - zapíšme si to takto:

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

Najprv zo súboru programu Word vyberte riadky, ktoré obsahujú značku — dostaneme kopu prázdnych značiek a riadkov so slovami. Odstraňujeme samotnú značku a jej koncovú - tu sa namiesto lomítok používajú symboly percent, pretože v samotnej značke už je tam lomítko, prečo? smäd trochu ti nerozumie. A s úrokmi je všetko v poriadku. Zo súboru odstránime všetky medzery, odstránime prázdne riadky. Voila - hotový zoznam slov.

Ak chcete odstrániť slová, ktoré sa rýmujú pomocou posledných písmen, vyberte posledné dve písmená z pôvodného slova a vymažte zoznam:

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

Pozeráme, skúšame – všetko funguje... tak, kde je zoznam slova „hrať“? A na slovo „idem“? Súbor je prázdny! A to všetko preto, že tieto slová sú slovesá a vieme, čo robia tým, ktorí sa rýmujú so slovesami. Slovesný rým je horší ako štvorcový rým, pretože v ruštine je najviac slovies a všetky majú rovnaké koncovky, preto sa po kontrole koncoviek nenachádzali v konečnom súbore.

Nikam sa však neponáhľame. Pre každé slovo sú nielen rýmy, ale aj asonancie, ktoré niekedy znejú oveľa lepšie ako rým - preto sú to asonancie (francúzsky asonancia, z latinského assono - zniem v melódii).

Dostávame asonancie

Tu začína zábava: asonancie sa objavia na samostatnej adrese URL a na tej istej stránke spustením skriptu, odoslaním požiadavky HTTP a prijatím odpovede. Ako poviem wget„Stlačíte tlačidlo? Ale v žiadnom prípade. žiaľ.

Všimol som si, že URL v riadku sa nejako mení, skopíroval som to, čo tam bolo, po prepnutí na asonancie a vložil som to do novej karty prehliadača - otvorili sa silné rýmy. Nie, že.

V podstate som si myslel, že serveru by nemalo záležať na tom, či sa vykoná skript, ktorý mu odošle požiadavku, alebo či ho osoba napíše ručne. Takže? Kto vie, poďme sa na to pozrieť.

Kam poslať? Čo poslať? HTTP požiadavka na IP servera, tam je niečo ako GET... potom je tam niečo HTTP/1.1... Potrebujeme vidieť, čo prehliadač posiela a kam. Inštalácia Wiresharkpozri na premávku:

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... čo? Áno, máme HTTPS. Čo robiť? Zahájiť útok MITM na seba? Ideálne je, ak nám pomôže samotná obeť.

Vo všeobecnosti, keď som sa rozhodol surfovať v prehliadači, nakoniec som našiel samotnú žiadosť a adresáta. Choď:

Dialóg s terminálom

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.

Ahoj. Hehehe. To je to, čo som očakával pri odosielaní holého HTTP požiadavky na HTTPS port. Máme teraz šifrovať? Všetok tento rozruch s RSA kľúčmi, potom s SHA256. Prečo, existuje OpenSSL za takéto veci. No, už vieme, čo máme robiť, len najskôr odstránime polia Referer a Cookie – myslím, že túto záležitosť príliš neovplyvnia:

Dialóg s terminálom

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

Čoho je schopný mozog študenta, ktorý sa učí o svete počítačov?

Čo je to, nadávanie na server? No aspoň mi odpovedali 200 OK, čo znamená, že cookies a referrer nič neovplyvňujú. Kompresia je gzip, ale pri kopírovaní sa skopírujú znaky ASCII. Presne tak, linku môžete odstrániť Accept-kódovanie. Všetko je v poriadku - dostaneme HTML dokument, teraz s asonanciami. Ale sú tu dve otázky: ako spustiť OpenSSL a preniesť doň dáta pomocou skriptu? A ako čítať výstup, ak po prijatí odpovede zostaneme akoby v „shell“ OpenSSL? Ak sa vám podarí niečo vymyslieť s druhým, ale s prvým...

Je dobré, že existuje Habrkde som čítal o utilite očakávať, ktorá automatizuje proces interakcie s programami, ktoré očakávajú ľudskú interakciu. Mať tím je ešte atraktívnejšie automatické očakávanie, generovanie očakávať skript na základe vašich akcií. No, spustíme to, urobíme toto všetko a tu je hotový skript. Len on je veľmi obrovský, a to všetko preto OpenSSL zobrazuje certifikáty, kľúče a očakávať čaká na výstup z toho všetkého. Potrebujeme toto? Nie Odstránime celú prvú výzvu a ponecháme len koniec posledného riadku „r“. Z našej požiadavky tiež odstraňujeme polia User-Agent a Accept – nič neovplyvňujú. Takže, poďme na štart. Skript bol spustený, ale kde je cenný dokument HTML? Očakávať zjedol to. Aby ste ho prinútili vypľuť, musíte dať:

set results $expect_out(buffer)

pred koncom skriptu - takto sa zapíše výstup spustiteľného súboru očakávať'om príkaz a zobrazí sa na obrazovke. Stručne povedané, niečo také:

očakávať scenár

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

Ale to nie je všetko! Ako vidíte, vo všetkých príkladoch bola adresa URL požiadavky statická, ale je to adresa URL, ktorá je zodpovedná za to, ktoré slovo bude spojené s asonanciami. A tak to dopadne tak, že budeme neustále hľadať slovo “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” v ASCII alebo “tu” v UTF-8. Čo robiť? Samozrejme, vždy jednoducho vygenerujte nový skript, priatelia! Už nie automatické očakávanie'Och, as pomocou minúť, pretože V našom novom sa okrem slova nič nemení. A nech žije nový problém: ako môžeme inteligentne preložiť slovo z azbuky do formátu URL? Ani terminál nie je ničím výnimočný. No to je v poriadku, zvládneme to, však? Môcť:

Pozrite, čo dokážem!

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

Celkovo máme skript, ktorý konvertuje slovo na text ASCII a generuje ďalší skript, ktorý požaduje stránku lokality s asonanciami zo servera cez OpenSSL. A potom presmerujeme výstup posledného skriptu do súboru a starým spôsobom ho prenesieme "filtre" extra štvorčeky a zapíšte ich do súboru.

Priesečník mnohých. Spodná čiara

V skutočnosti je to presne to, čo spôsobuje najmenšie problémy. Vyššie uvedené postupy vykonáme pre dve slová, potom z dvoch zoznamov porovnáme každé slovo s každým a ak sa nájde zhoda, vypíšeme ho. Teraz máme skript, ktorý berie ako vstup dve slová a zobrazuje zoznam slov, ktoré sa s oboma rýmujú, a dokonca berie do úvahy asonancie, a to všetko bez manuálneho prepínania medzi štyrmi kartami a zapamätania si slov „od oka“ – všetko zhromaždené, započítané pre a automaticky vyradené. úžasné.

Cieľom tejto publikácie bolo ukázať, že keď človek niečo potrebuje, tak to aj tak urobí. Veľmi neefektívne, krivé, strašidelné, ale pôjde to.

Zdroj: hab.com

Pridať komentár