Ano ang utak ng isang mag-aaral na natututo tungkol sa mundo ng kompyuter na kayang gawin?

Magandang araw.

Matapos magsulat ng isa pang script sa Bash, napagtanto ko na ang lahat ay dapat na ganap na naiiba, ngunit lahat ay gumana. Nais kong ipakita sa iyo kung anong mga kalaswaan at saklay ang aking isinulat upang malutas ang problema, ngunit hindi pa magkaroon ng kariton ng kaalaman. Sa madaling salita, isang karikatura ng programming.

Gawain


Isang bagay ang naging kinakailangan upang:

  • Nagpakita ng maraming tula para sa salita, maliban sa mga parisukat
  • Tinawid ang maraming rhymes ng dalawang salita

Para saan? Well, iyon lang - at iyon na.
Sino ang hindi nakakaalam, ang isang square rhyme (sa karaniwang parlance - isang square) ay dalawang salita na ang huling dalawang titik sa spelling ay nag-tutugma, na kung saan (madalas, ito ang tanging bagay) ay ginagawa silang isang tula. Halimbawa, ang mga rosas ay mayelo; gulong - kotse. Ang paggamit ng mga parisukat sa modernong bersyon ay hindi partikular na inaprubahan ng mga tao, dahil sa kanilang primitiveness.

desisyon


Para sa akin, ang pinakasimpleng solusyon ay ang magsulat ng isang script sa Bash na gumagamit ng isang mayroon nang generator ng rhyme - HOST, na pangunahing pinipili ang mga ito sa pamamagitan ng consonance, at hindi sa pamamagitan ng spelling. Anong klaseng HOST? Dahil kung ipahiwatig ang tunay na pangalan ng site, sasabihin nila na ito ay isang ad. Bakit hindi ipagpatuloy ang paggamit nito? Una, sa kabila ng kanyang kalamangan sa pagpili ng mga rhymes batay sa mga consonance, madalas pa rin siyang gumagawa ng mga parisukat. Pangalawa, kailangan mo pa ring mag-isip gamit ang iyong utak, magpalipas ng oras sa paglipat sa pagitan ng mga tab, at enerhiya sa pagsasaulo ng mga paulit-ulit na salita sa mga listahan upang makahanap ng isang tula para sa dalawang salita.

Pagkuha ng malalakas na rhymes

Anong alam ko? Alam ko ang tungkol sa utility wget, na nagda-download ng pahina sa tinukoy na URL. Okay, isagawa natin ang kahilingan - nakakakuha tayo ng HTML page sa isang file na pinangalanang may tumutula na salita. Halimbawa, hanapin natin ang salitang "dito":

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

Ngunit kailangan ko lamang ng isang listahan ng mga salita, paano ko mapupuksa ang lahat ng iba pa? Tinitingnan namin at nakita namin na ang listahan ng mga salita ay naka-format, gaano man ito kakaiba, sa anyo ng isang listahan, at ang mga salita ay nasa mga tag. . Well, mayroon kaming isang mahusay na utility. uhaw - isulat natin ito ng ganito:

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

Una, mula sa word file, piliin ang mga linyang naglalaman ng tag — nakakakuha kami ng isang grupo ng mga walang laman na tag at linya na may mga salita. Inalis namin ang tag mismo at ang pagsasara nito - dito ginagamit ang mga porsyentong simbolo sa halip na mga slash dahil sa tag mismo may slash na, bakit? uhaw medyo hindi kita maintindihan. At lahat ay maayos sa interes. Inalis namin ang lahat ng mga puwang mula sa file, alisin ang mga walang laman na linya. Voila - isang yari na listahan ng mga salita.

Upang maalis ang mga salitang tumutula gamit ang mga huling titik, piliin ang huling dalawang titik mula sa orihinal na salita at i-clear ang listahan:

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

Tinitingnan namin, sinusubukan namin - gumagana ang lahat... kaya, nasaan ang listahan para sa salitang "play"? At para sa salitang "Pupunta ako"? Walang laman ang file! At ito ay lahat dahil ang mga salitang ito ay mga pandiwa, at alam natin kung ano ang ginagawa nila sa mga taong tumutula sa mga pandiwa. Ang verb rhyme ay mas masahol pa kaysa sa square rhyme, dahil ang wikang Ruso ay may pinakamaraming pandiwa, at lahat ng mga ito ay may parehong mga pagtatapos, kung kaya't wala sila sa huling file pagkatapos suriin ang mga pagtatapos.

Gayunpaman, hindi kami nagmamadali. Para sa bawat salita mayroong hindi lamang mga rhymes, kundi pati na rin ang mga asonans, na kung minsan ay mas mahusay kaysa sa rhyme - kaya't sila ay mga asonans (French assonance, mula sa Latin na assono - I sound in harmony).

Nakakakuha tayo ng asonansya

Dito nagsisimula ang saya: lumilitaw ang mga asonansya sa isang hiwalay na URL, at sa parehong pahina, sa pamamagitan ng pagsasagawa ng script, pagpapadala ng kahilingan sa HTTP at pagtanggap ng tugon. Paano ko sasabihin wget'Pinindot mo ba ang pindutan? Pero hindi pwede. Nakalulungkot.

Nang mapansin na ang URL sa linya ay kahit papaano ay nagbabago, kinopya ko kung ano ang naroon pagkatapos lumipat sa mga asonansya at i-paste ito sa isang bagong tab ng browser - nagbukas ang malalakas na rhymes. Hindi iyan.

Sa esensya, naisip ko, hindi dapat mahalaga sa server kung ang script na nagpapadala nito ng kahilingan ay naisakatuparan, o kung ang tao ay nag-type nito sa pamamagitan ng kamay. Kaya? Sino ang nakakaalam, tingnan natin ito.

Saan ipapadala? Ano ang ipapadala? HTTP request sa server IP, may parang GET... tapos may HTTP/1.1... Kailangan nating makita kung ano ang ipinapadala ng browser at kung saan. I-install wireshark, tingnan ang trapiko:

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 ano? Oo, mayroon kaming HTTPS. Anong gagawin? Maglunsad ng pag-atake ng MITM sa iyong sarili? Sa isip, ang biktima mismo ang tutulong sa atin.

Sa pangkalahatan, napagpasyahan kong mag-surf sa browser, sa wakas ay natagpuan ko ang kahilingan mismo at ang addressee. Pumunta:

Dialogue sa terminal

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.

Hey. Hehehe. Sa katunayan, iyon ang inaasahan ko kapag nagpapadala ng walang laman na kahilingan sa HTTP sa isang HTTPS port. Dapat ba tayong mag-encrypt ngayon? Ang lahat ng ito ay nagkakagulo sa mga RSA key, pagkatapos ay sa SHA256. Bakit, meron OpenSSL para sa mga ganyang bagay. Well, alam na namin kung ano ang gagawin, aalisin na lang muna namin ang mga field ng Referer at Cookie - Sa palagay ko, hindi sila makakaapekto sa bagay na ito:

Dialogue sa terminal

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

Ano ang utak ng isang mag-aaral na natututo tungkol sa mundo ng kompyuter na kayang gawin?

Ano ito, pagmumura sa server? Well, at least sinagot nila ako ng 200 OK, ibig sabihin, walang naaapektuhan ang cookies at ang referrer. Ang compression ay gzip, ngunit kapag kinokopya, ang mga ASCII na character ay kinokopya. Eksakto, maaari mong alisin ang linya Tanggapin-encoding. Maayos ang lahat - nakakakuha kami ng HTML na dokumento, ngayon ay may mga asonansya. Ngunit narito ang dalawang tanong: paano patakbuhin ang OpenSSL at ilipat ang data dito gamit ang isang script? At kung paano basahin ang output kung pagkatapos matanggap ang tugon ay nananatili kami, bilang ito ay, sa isang "shell" ng OpenSSL? Kung makakaisip ka ng isang bagay sa pangalawa, ngunit sa una...

Buti naman meron Habrkung saan nabasa ko ang tungkol sa utility asahan, na nag-o-automate sa proseso ng pakikipag-ugnayan sa mga programang umaasa sa pakikipag-ugnayan ng tao. Ang pagkakaroon ng isang koponan ay mas kaakit-akit autoexpect, pagbuo asahan script batay sa iyong mga aksyon. Well, inilunsad namin ito, gawin ang lahat ng ito at narito ang natapos na script. Siya lamang ang napakalaki, at lahat dahil OpenSSL nagpapakita ng mga sertipiko, mga susi, at asahan naghihintay sa output ng lahat ng ito. Kailangan ba natin ito? Hindi. Inalis namin ang buong unang prompt, na iiwan lamang ang huling line break na 'r'. Inalis din namin ang mga field ng User-Agent at Accept mula sa aming kahilingan - wala silang naaapektuhan. Kaya, ilunsad natin. Ang script ay naisakatuparan, ngunit nasaan ang treasured HTML na dokumento? Asahan kinain ito. Upang mailuwa siya, kailangan mong ilagay:

set results $expect_out(buffer)

bago matapos ang script - ito ay kung paano isusulat ang output ng executable asahan'om command at ipinapakita sa screen. Sa buod, isang bagay tulad nito:

asahan ang isang script

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

Ngunit hindi lang iyon! Tulad ng nakikita mo, sa lahat ng mga halimbawa ang URL ng kahilingan ay static, ngunit ito ang URL na responsable para sa kung aling salita ang iuugnay sa mga asonansya. At kaya lumalabas na patuloy kaming maghahanap ng salitang "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" sa ASCII o "dito" sa UTF-8. Anong gagawin? Siyempre, gumawa lang ng bagong script sa bawat pagkakataon, mga kaibigan! Hindi na autoexpect'oh, at sa tulong miss, dahil Sa bago natin, walang nagbabago maliban sa salita. At mabuhay ang bagong problema: paano natin maisasalin nang matalino ang isang salita mula sa Cyrillic sa format ng URL? Wala ring espesyal para sa terminal. Well, okay lang, kaya naman natin, di ba? Maaari:

Tingnan mo kung ano ang kaya kong gawin!

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

Sa kabuuan, mayroon kaming script na nagko-convert ng salita sa ASCII text, na bumubuo ng isa pang script na humihiling ng page ng site na may mga asonansya mula sa server sa pamamagitan ng OpenSSL. At pagkatapos ay i-redirect namin ang output ng huling script sa isang file at, sa lumang paraan, ipasa ito "mga filter" dagdag na mga parisukat at isulat ang mga ito sa file.

Intersection ng marami. Bottom line

Sa totoo lang, ito mismo ang nagiging sanhi ng hindi bababa sa mga problema. Isinasagawa namin ang mga pamamaraan sa itaas para sa dalawang salita, pagkatapos mula sa dalawang listahan ay inihahambing namin ang bawat salita sa bawat isa at kung may nakitang tugma, ilalabas namin ito. Ngayon ay mayroon na kaming script na kumukuha ng dalawang salita bilang input at nagpapakita ng isang listahan ng mga salitang tumutugma sa pareho, at kahit na isinasaalang-alang ang mga asonansya, at lahat ng ito nang hindi manu-manong lumilipat sa pagitan ng apat na tab at naaalala ang mga salita "sa pamamagitan ng mata" - lahat ay nakolekta, isinasaalang-alang para sa at awtomatikong itinapon. Kahanga-hanga.

Ang layunin ng publikasyong ito ay ipakita na kung ang isang tao ay nangangailangan ng isang bagay, gagawin pa rin niya ito. Napaka hindi epektibo, baluktot, katakut-takot, ngunit ito ay gagana.

Pinagmulan: www.habr.com

Magdagdag ng komento