Čeho je schopen mozek studenta, který se učí o počítačovém světě?

Dobrý den.

Po dokončení psaní dalšího scénáře v Bash jsem si uvědomil, že všechno by mělo být úplně jinak, ale všechno fungovalo. Chci vám ukázat, jaké sprostosti a berličky jsem napsal, abych problém vyřešil, ale ještě nemám vagón znalostí. Jinými slovy, karikatura programování.

Úkol


Něco se stalo nezbytným:

  • Zobrazeno mnoho rýmů pro slovo, kromě čtverců
  • Zkřížil mnoho rýmů dvou slov

Proč? No, to je ono - a to je vše.
Kdo neví, čtvercový rým (v běžné řeči - čtverec) jsou dvě slova, jejichž poslední dvě písmena v pravopisu se shodují, což (často je to jediná věc) z nich dělá rým. Například růže jsou mrazivé; pneumatika - auto. Použití čtverců v moderní verzi není lidmi zvláště schvalováno kvůli jejich primitivnosti.

rozhodnutí


Zdálo se mi, že nejjednodušším řešením bylo napsat skript v Bash, který používá již existující generátor rýmů - HOST, který je primárně vybírá podle konsonance, a ne podle pravopisu. Jaký druh HOST? Protože pokud uvedete skutečný název webu, řeknou, že se jedná o reklamu. Proč ji nepoužívat dál? Za prvé, navzdory jeho výhodě výběru rýmů na základě souhlásek stále často vytváří čtverce. Za druhé, stále musíte myslet mozkem, trávit čas přepínáním mezi kartami a energií zapamatovat si opakovaná slova v seznamech, abyste našli rým pro dvě slova.

Získání silných rýmů

Co já vím? O utilitě vím wget, který stáhne stránku na zadané URL. Dobře, provedeme požadavek - dostaneme stránku HTML v souboru pojmenovaném rýmovaným slovem. Hledejme například slovo „zde“:

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

Ale potřebuji pouze seznam slov, jak se mohu zbavit všeho ostatního? Díváme se a vidíme, že seznam slov je formátován, bez ohledu na to, jak divný to může být, ve formě seznamu a slova jsou ve značkách . No, máme skvělou pomůcku. žízeň - zapiš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

Nejprve ze souboru aplikace Word vyberte řádky, které obsahují značku — dostaneme hromadu prázdných značek a řádků se slovy. Odstraňujeme samotný tag a jeho uzavírací jedničku - zde se místo lomítek používají symboly procent, protože v samotném tagu už je tam lomítko, proč? žízeň trochu ti nerozumí. A s úroky je vše v pořádku. Ze souboru odstraníme všechny mezery, odstraníme prázdné řádky. Voila - hotový seznam slov.

Chcete-li odstranit slova, která se rýmují pomocí posledních písmen, vyberte poslední dvě písmena z původního slova a vymažte seznam:

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

Díváme se, zkoušíme - všechno funguje... tak, kde je seznam pro slovo „hrát“? A na slovo „jdu“? Soubor je prázdný! A to vše proto, že tato slova jsou slovesa a víme, co dělají s těmi, kteří se rýmují se slovesy. Slovesný rým je horší než sudý čtvercový rým, protože ruský jazyk má nejvíce sloves a všechna mají stejné koncovky, proto po kontrole koncovek nebyly ve výsledném souboru.

My však nikam nespěcháme. U každého slova jsou nejen rýmy, ale i asonance, které někdy zní mnohem lépe než rým - proto jsou to asonance (francouzská asonance, z latiny assono - zním v melodii).

Dostáváme asonance

Zde začíná zábava: asonance se objevují na samostatné adrese URL a na stejné stránce spuštěním skriptu, odesláním požadavku HTTP a přijetím odpovědi. Jak se řekne wget„Stisknete tlačítko? Ale v žádném případě. Bohužel.

Všiml jsem si, že se URL v řádku nějak mění, zkopíroval jsem to, co tam bylo, po přepnutí na asonance a vložil to do nové záložky prohlížeče - otevřely se silné rýmy. Ne, že.

V zásadě jsem si myslel, že by serveru nemělo záležet na tom, zda je skript, který mu odesílá požadavek, proveden, nebo zda jej osoba napíše ručně. Tak? Kdo ví, pojďme se na to podívat.

Kam poslat? Co poslat? HTTP požadavek na IP serveru, tam je něco jako GET... pak je tam něco HTTP/1.1... Musíme vidět, co prohlížeč posílá a kam. Nainstalujte Wireshark, podívej se na provoz:

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... co? Ach ano, máme HTTPS. Co dělat? Spustit na sebe útok MITM? V ideálním případě nám pomůže oběť sama.

Obecně, když jsem se rozhodl procházet prohlížeč, nakonec jsem našel samotnou žádost a adresáta. Jít:

Dialog s terminálem

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. Ve skutečnosti jsem to očekával při odesílání holého požadavku HTTP na port HTTPS. Máme nyní šifrovat? Všechen ten povyk s RSA klíči, pak s SHA256. Proč, existuje OpenSSL za takové věci. No, už víme, co dělat, jen nejprve odstraníme pole Referer a Cookie – myslím, že to příliš neovlivní:

Dialog s terminálem

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

Čeho je schopen mozek studenta, který se učí o počítačovém světě?

Co to je, nadávky na serveru? No, alespoň mi odpověděli 200 OK, což znamená, že cookies a referrer nic neovlivňují. Komprese je gzip, ale při kopírování se kopírují znaky ASCII. Přesně, můžete odstranit čáru Accept-kódování. Vše je v pořádku – dostáváme HTML dokument, nyní s asonancemi. Ale jsou tu dvě otázky: jak spustit OpenSSL a přenést do něj data pomocí skriptu? A jak číst výstup, když po obdržení odpovědi zůstaneme jakoby v „shellu“ OpenSSL? Pokud s tím druhým něco vymyslíš, ale s tím prvním...

Je dobře, že existuje Habrkde jsem četl o utilitě očekávat, která automatizuje proces interakce s programy, které očekávají lidskou interakci. Mít tým je ještě atraktivnější automatické očekávání, generování očekávat skript na základě vašich akcí. No, spustíme to, uděláme to všechno a tady je hotový skript. Jen on je velmi obrovský, a to všechno proto OpenSSL zobrazuje certifikáty, klíče a očekávat čeká na výstup toho všeho. Potřebujeme to? Ne. Odstraníme celou první výzvu a ponecháme pouze poslední zalomení řádku 'r'. Z našeho požadavku také odstraníme pole User-Agent a Accept – nic neovlivní. Pojďme tedy spustit. Skript byl spuštěn, ale kde je cenný dokument HTML? Očekávat snědl to. Abyste ho přiměli vyplivnout, musíte zadat:

set results $expect_out(buffer)

před koncem skriptu - takto bude zapsán výstup spustitelného souboru očekávat'om příkaz a zobrazí se na obrazovce. V souhrnu něco takového:

očekávat scénář

#!/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 není vše! Jak vidíte, ve všech příkladech byla adresa URL požadavku statická, ale je to adresa URL, která je zodpovědná za to, které slovo bude spojeno s asonancemi. A tak to dopadne tak, že budeme neustále hledat slovo “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” v ASCII nebo “zde” v UTF-8. Co dělat? Samozřejmě, jednoduše vygenerujte pokaždé nový skript, přátelé! Už ne automatické očekávání'Oh, as pomocí minout, protože V našem novém se kromě slova nic nemění. A ať žije nový problém: jak můžeme inteligentně přeložit slovo z azbuky do formátu URL? Ani terminál není nic zvláštního. No, to je v pořádku, můžeme to udělat, ne? Umět:

Podívej, co umím!

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

Celkově máme skript, který převádí slovo na text ASCII a generuje další skript, který vyžaduje stránku webu s asonancemi ze serveru přes OpenSSL. A pak přesměrujeme výstup posledního skriptu do souboru a starým způsobem ho předáme "filtry" další čtverečky a zapište je do souboru.

Průsečík mnoha. Sečteno a podtrženo

Ve skutečnosti je to přesně to, co způsobuje nejmenší problémy. Výše uvedené postupy provedeme pro dvě slova, poté ze dvou seznamů porovnáme každé slovo s každým a pokud je nalezena shoda, vypíšeme ji. Nyní máme skript, který přijímá dvě slova jako vstup a zobrazuje seznam slov, která se rýmují s oběma, a dokonce bere v úvahu asonance, a to vše bez ručního přepínání mezi čtyřmi kartami a zapamatování si slov „od oka“ – vše shromážděno, započítáno pro a automaticky vyřazeny. Báječné.

Účelem této publikace bylo ukázat, že když člověk něco potřebuje, tak to stejně udělá. Velmi neúčinné, křivé, plíživé, ale půjde to.

Zdroj: www.habr.com

Přidat komentář