Zertarako gai da ordenagailuen mundua ikasten ari den ikasle baten garuna?

Egun on.

Bash-en beste gidoi bat idazten amaituta, dena guztiz ezberdina izan behar zela konturatu nintzen, baina dena funtzionatu zuen. Erakutsi nahi dizut zein lizunkeria eta makulu idatzi nituen arazoa konpontzeko, baina oraindik ezagutzaren bagoirik ez edukitzea. Alegia, programazioaren karikatura.

Task


Zerbait beharrezkoa bihurtu zen:

  • Hitzaren errima asko bistaratzen ditu, karratuak izan ezik
  • Bi hitzen errima ugari gurutzatu ditu

Zertarako? Tira, hori da, eta kito.
Nork ez daki, errima karratua (hizkera arruntean - karratua) ortografiako azken bi letrak bat egiten duten bi hitz dira, eta horrek (askotan, hau da gauza bakarra) errima bihurtzen ditu. Adibidez, arrosak izoztuak dira; pneumatiko - autoa. Bertsolaritza modernoan karratuen erabilera ez du jendeak bereziki onartzen, bere primitibotasuna dela eta.

Erabaki


Irtenbiderik errazena jada existitzen den errima-sorgailu bat erabiltzen duen Bash-en idaztea zela iruditu zitzaidan: HOST, batez ere kontsonantziaz eta ez ortografiaz hautatzen dituena. Nolako HOSTIA? Gunearen benetako izena adieraziz gero, iragarki bat dela esango baitute. Zergatik ez jarraitu erabiltzen? Lehenik eta behin, kontsonantzian oinarritutako errimak hautatzeko abantaila duen arren, oraindik laukiak sortzen ditu askotan. Bigarrenik, oraindik burmuinarekin pentsatu behar duzu, denbora fitxa batetik bestera aldatzen eta zerrendetan errepikatutako hitzak memorizatzen energia bi hitzentzako errima bat aurkitzeko.

Errima sendoak lortzea

Zer dakit nik? Badakit erabilgarritasunari buruz wget, orria zehaztutako URLan deskargatzen duena. Ados, exekutatu dezagun eskaera - HTML orri bat jasoko dugu errimadun hitz batekin izendatutako fitxategi batean. Adibidez, bila dezagun "hemen" hitza:

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

Baina hitz zerrenda bat besterik ez dut behar, nola kendu beste guztia? Begiratu eta ikusten dugu hitzen zerrenda formatua dagoela, arraroa izan arren, zerrenda moduan, eta hitzak etiketetan daudela. . Beno, erabilgarritasun handia dugu. egarria - Idatz dezagun honela:

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

Lehenik eta behin, hitz fitxategitik, hautatu etiketa duten lerroak — etiketa eta lerro huts mordoa lortzen ditugu hitzekin. Etiketa bera eta ixteko bat kentzen dugu - hemen ehuneko ikurrak erabiltzen dira barraren ordez, etiketa bera delako dagoeneko barra bat dago, zergatik? egarria ez zaitu pixka bat ulertzen. Eta dena ondo dago interesarekin. Fitxategitik zuriune guztiak kentzen ditugu, lerro hutsak kendu. Voila - prest dauden hitzen zerrenda.

Azken letrak erabiliz errima duten hitzak kentzeko, hautatu jatorrizko hitzaren azken bi letrak eta garbitu zerrenda:

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

Begiratzen dugu, saiatzen gara - denak funtzionatzen du... beraz, non dago "jolastu" hitzaren zerrenda? Eta "noa" hitzagatik? Fitxategia hutsik dago! Eta hau guztia, hitz hauek aditzak direlako, eta badakigu zer egiten dieten aditzekin errima dutenei. Aditz errima errima karratua baino okerragoa da, errusiar hizkuntzak baitauka aditz gehien, eta denek amaiera berdinak dituzte, horregatik ez zeuden amaierako fitxategian amaierak egiaztatu ondoren.

Hala ere, ez dugu presarik. Hitz bakoitzeko errimak ez ezik, asonantziak ere badaude, batzuetan errima baino askoz hobeto entzuten direnak - horregatik dira asonantziak (frantsesezko asonantzia, latinezko assonotik - harmonian soinua dut).

Asonantziak lortzen ditugu

Hor hasten da dibertsioa: asonantziak URL bereizi batean agertzen dira, eta orrialde berean, script bat exekutatuz, HTTP eskaera bat bidaliz eta erantzuna jasoz. Nola esan dezaket wget'Botoia sakatzen al duzu? Baina inola ere ez. Zoritxarrez.

Lerroko URLa nolabait aldatzen ari zela ohartuta, asonantziara aldatu ondoren zegoena kopiatu eta arakatzaileko fitxa berri batean itsatsi nuen - errima sendoak ireki ziren. Ez hori.

Funtsean, pentsatu nuen, zerbitzariari ez lioke axola eskaera bidaltzen dion scripta exekutatzen den edo pertsonak eskuz idazten duen ala ez. Beraz? Nork daki, goazen ikustera.

Nora bidali? Zer bidali? HTTP eskaera IP zerbitzariari, GET bezalako zerbait dago... gero HTTP/1.1 zerbait dago... Nabigatzaileak zer bidaltzen duen eta nora ikusi behar dugu. Instalatu Wireshark, begiratu trafikoa:

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... zer? Bai, HTTPS dugu. Zer egin? MITM eraso bat abiarazi zeure buruari? Egokiena, biktimak berak lagunduko digu.

Orokorrean, nabigatzailean nabigatzea erabakita, azkenean eskaera bera eta hartzailea aurkitu ditut. Joan:

Terminalarekin elkarrizketa

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.

Aizu. Jejeje. Izan ere, horixe espero nuen HTTP eskaera huts bat HTTPS ataka batera bidaltzean. Zifratu behar al dugu orain? Nahasketa hori guztia RSA gakoekin, gero SHA256rekin. Zergatik, badago OpenSSL holako gauzetarako. Beno, badakigu zer egin behar dugun, lehenik eta behin Erreferentea eta Cookie eremuak kenduko ditugu - uste dut ez dutela gaiari asko eragingo:

Terminalarekin elkarrizketa

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

Zertarako gai da ordenagailuen mundua ikasten ari den ikasle baten garuna?

Zer da hau, zerbitzariari zin egitea? Beno, gutxienez 200 OK erantzun didate, hau da, cookie-ak eta erreferenteak ez dutela ezertan eragiten. Konpresioa gzip da, baina kopiatzerakoan, ASCII karaktereak kopiatzen dira. Zehazki, lerroa kendu dezakezu Onartu-kodeketa. Dena ondo dago - HTML dokumentu bat lortzen dugu, orain asonantziarekin. Baina hona hemen bi galdera: nola exekutatu OpenSSL eta nola transferitu datuak script bat erabiliz? Eta nola irakurri irteera erantzuna jaso ondoren OpenSSL “shell” batean geratzen bagara, nolabait? Bigarrenarekin zerbait asmatzen baduzu, baina lehenengoarekin...

Ona da badagoela Habrnon erabilgarritasunari buruz irakurri nuen espero, gizakien interakzioa espero duten programekin elkarreragiteko prozesua automatizatzen duena. Talde bat izatea are erakargarriagoa da autoespero, sortzen espero zure ekintzetan oinarritutako gidoia. Tira, martxan jartzen dugu, hau guztia egin eta hona hemen amaitutako gidoia. Bera bakarrik oso handia da, eta dena delako OpenSSL ziurtagiriak, gakoak eta espero honen guztiaren irteeraren zain dago. Hau behar al dugu? Ez. Lehenengo gonbita osoa kentzen dugu, azken lerro-jauzi 'r' bakarrik utziz. Erabiltzaile-Agentea eta Onartu eremuak ere kentzen ditugu gure eskaeratik - ez dute ezer eragiten. Beraz, abiarazi dezagun. Scripta exekutatu zen, baina non dago altxor HTML dokumentua? Espero jan zuen. Berari tu egiteko, jarri behar duzu:

set results $expect_out(buffer)

script-a amaitu baino lehen - horrela idatziko da exekutagarriaren irteera espero'om komandoa eta pantailan bistaratzen da. Laburbilduz, honelako zerbait:

espero gidoia

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

Baina hori ez da guztia! Ikus dezakezunez, adibide guztietan eskaeraren URLa estatikoa zen, baina URLa da asonantziarekin lotuko den hitzaren arduraduna. Eta, beraz, gertatzen da etengabe bilatuko dugula "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" hitza ASCII-n edo "hemen" UTF-8-n. Zer egin? Jakina, sor ezazu gidoi berri bat aldi bakoitzean, lagunak! Jada ez autoespero'A, eta laguntzarekin galdu, zeren Gure berrian ez da ezer aldatzen hitza izan ezik. Eta bizi arazo berriak: nola itzul dezakegu modu adimentsuan zirilikotik hitz bat URL formatura? Terminalarentzat ere ez dago ezer berezirik. Beno, ondo dago, egin dezakegu, ezta? Ahal:

Begira zer egin dezakedan!

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

Guztira, hitz bat ASCII testu bihurtzen duen script bat dugu, OpenSSL bidez zerbitzariari asonantziak dituen gune orri bat eskatzen duen beste script bat sortuz. Eta gero, azken script-aren irteera fitxategi batera birbideratzen dugu eta, antzinako erara, pasatzen dugu "iragazkiak" lauki gehigarriak eta idatzi fitxategian.

Askoren elkargunea. Beheko lerroa

Egia esan, hori da arazo gutxien eragiten duena. Aurreko prozedurak bi hitzetarako egiten ditugu, gero bi zerrendetatik hitz bakoitzarekin konparatzen dugu eta bat etortzen bada, ateratzen dugu. Orain sarrera gisa bi hitz hartzen dituen gidoia dugu eta biekin errima duten hitzen zerrenda bistaratzen du, baita asonantziak ere kontuan hartuta, eta hori guztia lau fitxa batetik bestera eskuz aldatu gabe eta "begiz" hitzak gogoratu gabe - dena bilduta, kontatuta. eta automatikoki baztertu. Zoragarria.

Argitalpen honen helburua pertsona batek zerbait behar badu, hala ere egingo duela erakustea zen. Oso eraginkorra, makurra, beldurgarria, baina funtzionatuko du.

Iturria: www.habr.com

Gehitu iruzkin berria