Mire képes a számítógépes világot megismerő diák agya?

Jó napot kívánok.

Miután befejeztem egy másik forgatókönyv megírását a Bashban, rájöttem, hogy mindennek teljesen másnak kell lennie, de minden működött. Meg akarom mutatni, milyen trágárságokat és mankókat írtam a probléma megoldása érdekében, de még nem rendelkezem egy vagány tudással. Más szóval, a programozás karikatúrája.

Feladat


Valami szükségessé vált:

  • Sok rímet jelenített meg a szóhoz, kivéve a négyzeteket
  • Két szó sok rímét keresztezte

Miért? Hát ez van – és ennyi.
Aki nem tudja, a négyzetrím (köznyelvben - négyzet) két olyan szó, amelyek helyesírásának utolsó két betűje egybeesik, ami (gyakran ez az egyetlen dolog) rímmé teszi őket. Például a rózsák fagyosak; gumiabroncs - autó. A négyzetek modern változatban való használatát primitívségük miatt az emberek nem kifejezetten hagyják jóvá.

döntés


Számomra úgy tűnt, hogy a legegyszerűbb megoldás egy olyan szkript megírása Bash-ban, amely egy már létező rímgenerátort használ - a HOST-ot, amely elsősorban konszonancia alapján választja ki őket, nem pedig helyesírással. Milyen HOST? Mert ha megadod az oldal valódi nevét, akkor azt mondják, hogy reklám. Miért nem használja tovább? Először is, annak ellenére, hogy előnye, hogy a rímeket mássalhangzók alapján választja ki, még mindig gyakran állít elő négyzeteket. Másodszor, továbbra is az agyaddal kell gondolkodnod, időt kell töltened a lapok közötti váltogatással, és energiát kell memorizálnod a listákban ismétlődő szavakat, hogy rímet találj két szóra.

Erős rímek szerzése

Mit tudhatnék? Tudok a segédprogramról wget, amely letölti az oldalt a megadott URL-ről. Rendben, hajtsuk végre a kérést – kapunk egy HTML oldalt egy rímszóval elnevezett fájlban. Keressünk például az „itt” szóra:

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

De nekem csak egy listára van szükségem a szavakról, hogyan tudnék megszabadulni minden mástól? Megnézzük és látjuk, hogy a szavak listája, bármilyen furcsa legyen is, lista formájában van formázva, és a szavak címkékben vannak. . Nos, van egy nagyszerű segédprogramunk. szomjúság - írjuk le így:

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

Először a Word fájlból válassza ki a címkét tartalmazó sorokat — egy rakás üres címkét és sorokat kapunk szavakkal. Eltávolítjuk magát a címkét és a zárójelet – itt százalékos szimbólumokat használunk perjelek helyett, mert magában a címkében már van perjel, miért? szomjúság kicsit sem ért téged. A kamatokkal pedig minden rendben van. Minden szóközt eltávolítunk a fájlból, eltávolítjuk az üres sorokat. Voila - egy kész szavak listája.

Az utolsó betűket használó szavak eltávolításához válassza ki az eredeti szó utolsó két betűjét, és törölje a listát:

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

Nézzük, próbálkozunk - minden működik... szóval, hol van a „játszani” szó listája? És az „megyek” szóra? A fájl üres! És mindez azért van, mert ezek a szavak igék, és tudjuk, mit tesznek azokkal, akik igékre rímelnek. Az igérím még a négyzetrímnél is rosszabb, mert az orosz nyelvben van a legtöbb ige, és mindegyiknek ugyanaz a végződése, ezért nem kerültek be a végfájlba a végződések ellenőrzése után.

Mi azonban nem sietünk. Minden szóhoz nemcsak rímek tartoznak, hanem asszonanciák is, amelyek néha sokkal jobban hangzanak, mint a rímek - ezért ezek aszonanciák (francia assonance, latinul assono - dallamban szólalok meg).

Aszonanciákat kapunk

Itt kezdődik a móka: a asszonanciák külön URL-en és ugyanazon az oldalon jelennek meg egy szkript végrehajtásával, HTTP-kérés elküldésével és válasz fogadásával. Hogy is mondjam wget– Megnyomod a gombot? De sehogy. Szomorúan.

Észrevettem, hogy a sorban lévő URL valahogy megváltozik, a asszonanciákra váltás után lemásoltam az ott lévőt és beillesztem egy új böngészőfülbe - erős rímek nyíltak meg. Azt nem.

Lényegében, gondoltam, a szervernek nem kell számítania, hogy a kérést küldő szkript végrehajtódik-e, vagy az illető kézzel írja be. Így? Aki tudja, menjünk és nézzük meg.

Hova küldjem? Mit kell küldeni? HTTP kérés a szerver IP-re, van valami GET... aztán van valami HTTP/1.1... Meg kell nézni, hogy mit és hova küld a böngésző. Telepítés wireshark, nézd meg a forgalmat:

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... mi? Igen, van HTTPS-ünk. Mit kell tenni? Indíts MITM támadást magad ellen? Ideális esetben maga az áldozat segít nekünk.

Általában véve, miután úgy döntöttem, hogy szörfözöm a böngészőben, végül megtaláltam magát a kérést és a címzettet. Megy:

Párbeszéd a terminállal

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.

Hé. Hehehe. Valóban erre számítottam, amikor puszta HTTP-kérést küldök egy HTTPS-portra. Most kellene titkosítanunk? Mindez az RSA kulcsokkal, majd az SHA256-tal való felhajtás. Miért, van OpenSSL ilyen dolgokra. Nos, már tudjuk, mit kell tennünk, először csak eltávolítjuk a Hivatkozó és a Cookie mezőket – szerintem ezek nem nagyon befolyásolják a dolgot:

Párbeszéd a terminállal

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

Mire képes a számítógépes világot megismerő diák agya?

Mi ez, káromkodás a szerveren? Nos, legalább 200 OK-t válaszoltak, ami azt jelenti, hogy a sütik és a hivatkozó nem befolyásol semmit. A tömörítés gzip, de másoláskor az ASCII karakterek másolódnak. Pontosan, eltávolíthatja a vonalat Kódolás elfogadása. Minden rendben van – kapunk egy HTML dokumentumot, most asszonanciákkal. De itt van két kérdés: hogyan kell futtatni az OpenSSL-t és átvinni rá adatokat egy szkript segítségével? És hogyan kell olvasni a kimenetet, ha a válasz beérkezése után egy OpenSSL „héjban” maradunk? Ha a másodikkal tudsz valamit kitalálni, de az elsővel...

Még jó, hogy van Habrahol a segédprogramról olvastam vár, amely automatizálja az emberi interakciót váró programokkal való interakció folyamatát. A csapat még vonzóbb autoexpect, generáló vár forgatókönyvet a tettei alapján. Nos, elindítjuk, megcsináljuk, és itt a kész forgatókönyv. Csak ő nagyon hatalmas, és mindez azért OpenSSL megjeleníti a tanúsítványokat, kulcsokat és vár várja mindezek kimenetelét. Kell ez nekünk? Nem. Eltávolítjuk a teljes első promptot, csak az utolsó „r” sortörést hagyjuk meg. A User-Agent és az Accept mezőket is eltávolítjuk kérésünkből – ezek semmit nem befolyásolnak. Szóval, indítsuk el. A szkriptet végrehajtották, de hol van a kincses HTML dokumentum? Vár megette. Ahhoz, hogy kiköpje, a következőket kell tennie:

set results $expect_out(buffer)

a szkript vége előtt - így lesz megírva a végrehajtható fájl kimenete vár'om parancsot, és megjelenik a képernyőn. Összefoglalva valami ilyesmi:

várj egy forgatókönyvet

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

De ez még nem minden! Amint láthatja, a kérés URL-címe minden példában statikus volt, de ez az URL felelős azért, hogy melyik szó lesz társítva az asszonanciákhoz. És így kiderül, hogy folyamatosan a „%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” szóra fogunk keresni az ASCII-ben vagy az „itt” UTF-8-ban. Mit kell tenni? Természetesen minden alkalommal egyszerűen generáljon új forgatókönyvet, barátaim! Többé nem autoexpect– Ó, és a segítséggel visszhang, mert Újunkban a szón kívül semmi sem változik. És éljen az új probléma: hogyan fordíthatunk le intelligensen egy szót cirill betűből URL formátumba? A terminálon sincs semmi különös. Nos, rendben van, meg tudjuk csinálni, nem? Tud:

Nézd, mit tehetek!

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

Összességében van egy szkriptünk, amely egy szót ASCII-szöveggé konvertál, és egy másik szkriptet generál, amely a kiszolgálótól OpenSSL-en keresztül kér egy oldalt aszonanciákkal. Ezután átirányítjuk az utolsó szkript kimenetét egy fájlba, és a régi módon továbbítjuk "szűrők" extra négyzeteket, és írd be a fájlba.

Sokak kereszteződése. A lényeg

Valójában ez okozza a legkevesebb problémát. A fenti eljárásokat két szóra hajtjuk végre, majd a két listából összehasonlítjuk az egyes szavakat, és ha találunk egyezést, akkor kiadjuk. Most már van egy szkriptünk, amely két szót vesz be bevitelként, és megjeleníti azoknak a szavaknak a listáját, amelyek mindkettőre rímelnek, és még az asszonanciákat is figyelembe veszik, és mindezt anélkül, hogy manuálisan váltanánk a négy lap között, és nem emlékeznénk a szavakra „szemmel” – mindezt összegyűjtöttük, elszámoltuk. és automatikusan eldobják. Csodálatos.

Ennek a kiadványnak az volt a célja, hogy megmutassa, ha valakinek szüksége van valamire, akkor azt úgyis megteszi. Nagyon hatástalan, görbe, hátborzongató, de menni fog.

Forrás: will.com

Hozzászólás