Uz ko spēj tā skolēna smadzenes, kas mācās par datoru pasauli?

Laba diena.

Pabeidzis rakstÄ«t kārtējo skriptu BaŔā, sapratu, ka visam vajadzētu bÅ«t pavisam savādāk, bet viss izdevās. Es vēlos jums parādÄ«t, kādas neÄ·Ä«trÄ«bas un kruÄ·us es rakstÄ«ju, lai atrisinātu problēmu, bet vēl nav zināŔanu vagona. Citiem vārdiem sakot, programmÄ“Å”anas karikatÅ«ra.

Uzdevums


Kaut kas kļuva nepiecieŔams, lai:

  • Vārdam tika rādÄ«ti daudzi atskaņas, izņemot kvadrātus
  • Šķērsoja daudzos divu vārdu atskaņas

Par ko? Nu tas tā ā€“ un viss.
Kas nezina, kvadrātveida atskaņa (parastā valodā - kvadrāts) ir divi vārdi, kuru pēdējie divi burti pareizrakstÄ«bā sakrÄ«t, kas (bieži vien tas ir vienÄ«gais) padara tos par atskaņu. Piemēram, rozes ir salnas; riepa - auto. Kvadrātu izmantoÅ”anu mÅ«sdienu versifikācijā cilvēki to primitivitātes dēļ Ä«paÅ”i neapstiprina.

Å Ä·Ä«dums


Man Ŕķita, ka vienkārŔākais risinājums ir uzrakstÄ«t skriptu Bash valodā, kas izmanto jau esoÅ”u atskaņu Ä£eneratoru - HOST, kas tos galvenokārt atlasa pēc lÄ«dzskaņas, nevis pēc pareizrakstÄ«bas. Kāda veida HOST? Jo, ja jÅ«s norādÄ«siet vietnes Ä«sto nosaukumu, viņi teiks, ka tā ir reklāma. Kāpēc ne turpināt to lietot? Pirmkārt, neskatoties uz viņa priekÅ”rocÄ«bām, izvēloties atskaņas, pamatojoties uz lÄ«dzskaņām, viņŔ joprojām bieži veido kvadrātus. Otrkārt, jums joprojām ir jādomā ar savām smadzenēm, jāpavada laiks, pārslēdzoties starp cilnēm, un jātērē laiks, lai iegaumētu atkārtotus vārdus sarakstos, lai atrastu atskaņu diviem vārdiem.

SpēcÄ«gu atskaņu iegÅ«Å”ana

Ko es zinu? Es zinu par lietderÄ«bu wget, kas lejupielādē lapu norādÄ«tajā URL. Labi, izpildÄ«sim pieprasÄ«jumu ā€“ mēs iegÅ«stam HTML lapu failā, kas nosaukts ar atskaņu vārdu. Piemēram, meklēsim vārdu ā€œÅ”eitā€:

wget https://HOST/rifma/Š·Š“ŠµŃŃŒ

Bet man vajag tikai vārdu sarakstu, kā es varu atbrÄ«voties no visa pārējā? Mēs skatāmies un redzam, ka vārdu saraksts ir noformēts, lai cik dÄ«vaini tas nebÅ«tu, saraksta formā un vārdi ir tagos . Nu, mums ir lieliska lietderÄ«ba. slāpes - pierakstÄ«sim Ŕādi:

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

Vispirms Word failā atlasiet rindas, kurās ir tags ā€” iegÅ«stam kaudzi tukÅ”u birku un rindiņu ar vārdiem. Mēs noņemam paÅ”u tagu un tā noslēdzoÅ”o ā€” Å”eit slÄ«psvÄ«tru vietā tiek izmantoti procentu simboli, jo paŔā tagā tur jau ir slÄ«psvÄ«tra, kāpēc? slāpes tevi mazliet nesaprot. Un ar procentiem viss kārtÄ«bā. Mēs noņemam no faila visas atstarpes, noņemam tukÅ”as rindas. Voila - gatavs vārdu saraksts.

Lai noņemtu vārdus, kas atskaņo, izmantojot pēdējos burtus, atlasiet oriģinālā vārda pēdējos divus burtus un notīriet sarakstu:

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

Skatāmies, cenÅ”amies - viss strādā... nu, kur ir saraksts ar vārdu ā€œspēlētā€? Un par vārdu "es ieÅ”u"? Fails ir tukÅ”s! Un tas viss ir tāpēc, ka Å”ie vārdi ir darbÄ«bas vārdi, un mēs zinām, ko tie dara tiem, kas atskaņo ar darbÄ«bas vārdiem. DarbÄ«bas vārdu atskaņa ir sliktāka par pat kvadrātveida atskaņu, jo krievu valodā ir visvairāk darbÄ«bas vārdu, turklāt tiem visiem ir vienādas galotnes, tāpēc pēc galotņu pārbaudes tie galÄ«gajā failā nebija.

Tomēr mēs nesteidzamies. Katram vārdam ir ne tikai atskaņas, bet arī asonanses, kas dažreiz izklausās daudz labāk nekā atskaņa - tāpēc tās ir asonanses (franču assonanse, no latīņu valodas assono - es skanu melodijā).

Mēs iegūstam asonanses

Å eit sākas jautrÄ«ba: asonanses parādās atseviŔķā URL un tajā paŔā lapā, izpildot skriptu, nosÅ«tot HTTP pieprasÄ«jumu un saņemot atbildi. Kā es varu teikt wget'Vai tu nospied pogu? Bet nekādā gadÄ«jumā. Diemžēl.

Pamanot, ka URL rindā kaut kā mainās, nokopēju tur esoÅ”o pēc pārejas uz asonancēm un ielÄ«mēju jaunā pārlÅ«kprogrammas cilnē - pavērās spēcÄ«gi atskaņas. Ne tā.

Būtībā, es domāju, serverim nevajadzētu būt svarīgiem, vai skripts, kas tam nosūta pieprasījumu, tiek izpildīts, vai arī persona to ieraksta ar roku. Tātad? Kas zina, iesim to pārbaudīt.

Kur sūtīt? Ko sūtīt? HTTP pieprasījums uz servera IP, ir kaut kas līdzīgs GET... tad ir kaut kas HTTP/1.1... Jāskatās, ko pārlūkprogramma sūta un kur. Uzstādīt Wireshark, paskatieties uz satiksmi:

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... ko? Ak, jā, mums ir HTTPS. Ko darÄ«t? Sākt MITM uzbrukumu sev? Ideālā gadÄ«jumā mums palÄ«dzēs pati cietuŔā.

Kopumā, nolēmusi sērfot pārlÅ«kprogrammā, es beidzot atradu paÅ”u pieprasÄ«jumu un adresātu. Iet:

Dialogs ar termināli

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.

Čau. Hehehe. PatieŔām, tas ir tas, ko es gaidÄ«ju, nosÅ«tot tukÅ”u HTTP pieprasÄ«jumu uz HTTPS portu. Vai mums tagad vajadzētu Å”ifrēt? Visa Ŕī kņada ar RSA taustiņiem, pēc tam ar SHA256. Kāpēc, ir OpenSSL par tādām lietām. Mēs jau zinām, kā rÄ«koties, vispirms noņemsim laukus Referer un Cookie ā€” es domāju, ka tie Å”o lietu Ä«paÅ”i neietekmēs:

Dialogs ar termināli

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

Uz ko spēj tā skolēna smadzenes, kas mācās par datoru pasauli?

Kas tas par zvērestu serverÄ«? Nu vismaz man atbildēja 200 OK, kas nozÄ«mē, ka sÄ«kdatnes un novirzÄ«tājs neko neietekmē. SaspieÅ”ana ir gzip, bet, kopējot, tiek kopētas ASCII rakstzÄ«mes. TieÅ”i tā, jÅ«s varat noņemt lÄ«niju Pieņemt-kodējums. Viss kārtÄ«bā ā€“ iegÅ«stam HTML dokumentu, tagad ar asonancēm. Bet Å”eit ir divi jautājumi: kā palaist OpenSSL un pārsÅ«tÄ«t datus uz to, izmantojot skriptu? Un kā nolasÄ«t izvadi, ja pēc atbildes saņemÅ”anas mēs it kā paliekam OpenSSL ā€œÄaulāā€? Ja ar otro var kaut ko izdomāt, bet ar pirmo...

Labi, ka ir Habrkur es lasÄ«ju par lietderÄ«bu gaidÄ«t, kas automatizē mijiedarbÄ«bas procesu ar programmām, kas sagaida cilvēka mijiedarbÄ«bu. Komandas izveide ir vēl pievilcÄ«gāka automātiski gaidÄ«t, Ä£enerējot gaidÄ«t skripts, pamatojoties uz jÅ«su darbÄ«bām. Nu, mēs to palaižam, darām to visu, un Å”eit ir gatavais skripts. Tikai viņŔ ir ļoti milzÄ«gs, un viss tāpēc OpenSSL parāda sertifikātus, atslēgas un gaidÄ«t gaida Ŕī visa iznākumu. Vai mums tas ir vajadzÄ«gs? Nē. Mēs noņemam visu pirmo uzvedni, atstājot tikai pēdējo rindiņas pārtraukumu ā€œrā€. Mēs arÄ« noņemam no pieprasÄ«juma laukus User-Agent un Accept ā€” tie neko neietekmē. Tātad, sāksim. Skripts tika izpildÄ«ts, bet kur ir vērtÄ«gais HTML dokuments? GaidÄ«t ēda to. Lai viņŔ to izspļautu, jums jāievieto:

set results $expect_out(buffer)

pirms skripta beigām - Ŕādi tiks rakstÄ«ta izpildāmā faila izvade gaidÄ«t'om komandu un tiek parādÄ«ts ekrānā. Rezumējot, kaut kas lÄ«dzÄ«gs Å”im:

gaidīt skriptu

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

Bet tas vēl nav viss! Kā redzat, visos piemēros pieprasÄ«juma URL bija statisks, taču tas ir vietrādis URL, kas ir atbildÄ«gs par to, kurÅ” vārds tiks saistÄ«ts ar asonansēm. Un tā izrādās, ka mēs pastāvÄ«gi meklēsim vārdu ā€œ%d0%b7%d0%b4%d0%b5%d1%81%d1%8cā€ ASCII vai ā€œÅ”eitā€ UTF-8. Ko darÄ«t? Protams, vienkārÅ”i katru reizi Ä£enerējiet jaunu skriptu, draugi! Vairs ne automātiski gaidÄ«tAk, un ar palÄ«dzÄ«bu palaist garām, jo MÅ«su jaunajā nekas nemainās, izņemot vārdu. Un lai dzÄ«vo jaunā problēma: kā mēs varam gudri pārtulkot vārdu no kirilicas URL formātā? ArÄ« terminālim nekas Ä«paÅ”s nav. Nu labi, mēs to varam, vai ne? Var:

Paskaties, ko es varu darīt!

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

Kopumā mums ir skripts, kas pārvērÅ” vārdu ASCII tekstā, Ä£enerējot citu skriptu, kas pieprasa vietnes lapu ar asonancēm no servera, izmantojot OpenSSL. Un tad mēs novirzām pēdējā skripta izvadi uz failu un vecmodÄ«gā veidā izlaižam to cauri "filtri" papildu kvadrātus un ierakstiet tos failā.

Daudzu krustojums. ApakŔējā lÄ«nija

PatiesÄ«bā tas ir tas, kas rada vismazākās problēmas. Mēs veicam iepriekÅ” minētās procedÅ«ras diviem vārdiem, pēc tam no diviem sarakstiem salÄ«dzinām katru vārdu ar katru un, ja tiek atrasta atbilstÄ«ba, mēs to izvadām. Tagad mums ir skripts, kas izmanto divus vārdus kā ievadi un parāda sarakstu ar vārdiem, kas sasaucas ar abiem, pat ņemot vērā asonanses, un tas viss, manuāli nepārslēdzoties starp četrām cilnēm un neatceroties vārdus ā€œar aciā€ ā€” visi ir savākti, uzskaitÄ«ti. par un automātiski izmests. BrÄ«niŔķīgi.

Å Ä«s publikācijas mērÄ·is bija parādÄ«t, ka, ja cilvēkam kaut ko vajag, viņŔ to tik un tā izdarÄ«s. Ä»oti neefektÄ«vi, greizi, rāpojoÅ”i, bet derēs.

Avots: www.habr.com

Pievieno komentāru