Ինչի՞ է ընդունակ համակարգչային աշխարհի մասին սովորող ուսանողի ուղեղը:

Բարի օր:

Բաշում մեկ այլ սցենար գրելուց հետո ես հասկացա, որ ամեն ինչ պետք է բոլորովին այլ կերպ լիներ, բայց ամեն ինչ ստացվեց։ Ուզում եմ ցույց տալ, թե ինչ լկտիություններ ու հենակներ եմ գրել, որ խնդիրը լուծեմ, բայց դեռ չունենալով գիտելիքի վագոն։ Այսինքն՝ ծրագրավորման ծաղրանկար։

Առաջադրանք


Ինչ-որ բան անհրաժեշտ դարձավ.

  • Ցուցադրվել են բառի համար բազմաթիվ ոտանավորներ, բացառությամբ քառակուսիների
  • Խաչեց երկու բառի բազմաթիվ հանգերը

Ինչի համար? Դե, վերջ - և վերջ:
Ո՞վ չգիտի, քառակուսի հանգը (ընդհանուր լեզվով ասած՝ քառակուսի) երկու բառ է, որոնց ուղղագրության վերջին երկու տառերը համընկնում են, ինչը (հաճախ, սա միակ բանն է) դրանք դարձնում է հանգ: Օրինակ, վարդերը ցրտաշունչ են; անվադող - ավտոմեքենա. Քառակուսիների օգտագործումը ժամանակակից վերափոխման մեջ առանձնապես հավանության չի արժանանում մարդկանց կողմից՝ դրանց պարզունակության պատճառով։

որոշում


Ինձ թվում էր, որ ամենապարզ լուծումը Bash-ով սցենար գրելն է, որն օգտագործում է արդեն գոյություն ունեցող հանգերի գեներատոր՝ HOST, որը հիմնականում ընտրում է դրանք համահունչ, այլ ոչ թե ուղղագրությամբ: Ինչպիսի՞ HOST: Որովհետեւ եթե նշեք կայքի իրական անունը, կասեն, որ դա գովազդ է։ Ինչու չշարունակել օգտագործել այն: Նախ, չնայած բաղաձայնների վրա հիմնված հանգեր ընտրելու իր առավելությունին, նա դեռ հաճախ քառակուսիներ է արտադրում: Երկրորդ, դուք դեռ պետք է մտածեք ձեր ուղեղով, ժամանակ հատկացնեք ներդիրների միջև փոխարկվելուն և էներգիայի՝ անգիր անելով ցուցակներում կրկնվող բառերը՝ երկու բառի համար հանգ գտնելու համար:

Ուժեղ ոտանավորներ ստանալը

Ի՞նչ իմանամ։ Ես գիտեմ կոմունալ ծառայության մասին wget, որը ներբեռնում է էջը նշված URL-ով: Լավ, եկեք կատարենք հարցումը. մենք ստանում ենք HTML էջ հանգավոր բառով անվանվող ֆայլում: Օրինակ, եկեք որոնենք «այստեղ» բառը.

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

Բայց ինձ միայն բառերի ցանկ է պետք, մնացած ամեն ինչից ինչպե՞ս ազատվեմ։ Նայում ենք և տեսնում, որ բառերի ցանկը ձևաչափված է, որքան էլ տարօրինակ լինի, ցուցակի տեսքով, իսկ բառերը պիտակներում են. . Դե, մենք ունենք մեծ օգտակարություն: Sed - գրենք այսպես.

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

Նախ, word ֆայլից ընտրեք այն տողերը, որոնք պարունակում են պիտակ — մենք ստանում ենք մի փունջ դատարկ պիտակներ և բառերով տողեր: Մենք հեռացնում ենք ինքնին պիտակը և դրա փակումը. այստեղ կտրվածքի փոխարեն օգտագործվում են տոկոսային նշաններ, քանի որ հենց պիտակի մեջ արդեն կտրվածք կա, ինչո՞ւ: Sed քեզ մի քիչ չի հասկանում. Իսկ տոկոսով ամեն ինչ լավ է։ Մենք հեռացնում ենք բոլոր բացատները ֆայլից, հեռացնում դատարկ տողերը: Voila - բառերի պատրաստի ցանկ:

Վերջին տառերով հանգավորվող բառերը հեռացնելու համար սկզբնական բառից ընտրեք վերջին երկու տառերը և մաքրեք ցուցակը.

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

Նայում ենք, փորձում ենք, ամեն ինչ աշխատում է... Այսպիսով, որտե՞ղ է «խաղ» բառի ցանկը: Իսկ «ես գնում եմ» բառի համար. Ֆայլը դատարկ է: Եվ սա այն պատճառով, որ այս բառերը բայեր են, և մենք գիտենք, թե ինչ են անում նրանք, ովքեր հանգավորում են բայերի հետ: Բայի հանգը նույնիսկ քառակուսի հանգից ավելի վատն է, քանի որ ռուսերենում ամենաշատ բայերն են, և բոլորն ունեն նույն վերջավորությունները, ինչի պատճառով վերջավորությունները ստուգելուց հետո դրանք վերջնական ֆայլում չեն եղել:

Այնուամենայնիվ, մենք չենք շտապում։ Յուրաքանչյուր բառի համար կան ոչ միայն ոտանավորներ, այլև ասոնանսներ, որոնք երբեմն շատ ավելի լավ են հնչում, քան հանգը, այդ իսկ պատճառով դրանք ասոնանսներ են (ֆրանսիական ասոնանս, լատիներեն assono - Ես հնչում եմ համահունչ):

Ասոնանսներ ենք ստանում

Այստեղից է սկսվում զվարճանքը՝ ասոնանսները հայտնվում են առանձին URL-ում և նույն էջում՝ սկրիպտ կատարելով, HTTP հարցում ուղարկելով և պատասխան ստանալով։ Ինչպես կարող եմ ասել wget― Սեղմո՞ւմ եք կոճակը։ Բայց ոչ մի կերպ: Ցավոք սրտի.

Նկատելով, որ տողում URL-ն ինչ-որ կերպ փոխվում է, ես պատճենեցի այն, ինչ կար ասոնանսներին անցնելուց հետո և տեղադրեցի զննարկիչի նոր ներդիրում. բացվեցին ուժեղ ոտանավորներ: Ոչ դա:

Ըստ էության, ես մտածեցի, որ սերվերի համար նշանակություն չպետք է ունենա՝ արդյոք հարցումն ուղարկող սկրիպտը կատարված է, թե անձը ձեռքով մուտքագրում է այն։ Այսպիսով. Ով գիտի, գնանք ստուգենք:

Որտեղ ուղարկել: Ի՞նչ ուղարկել: HTTP հարցում սերվերի IP-ին, GET-ի նման մի բան կա... հետո ինչ-որ HTTP/1.1 կա... Պետք է տեսնենք, թե ինչ է ուղարկում բրաուզերը և որտեղ: Տեղադրեք wireshark, նայեք երթեւեկությանը.

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Ó.

Հըմ... ինչ? Այո, մենք ունենք HTTPS: Ինչ անել? Սկսե՞լ MITM հարձակումը ձեր վրա: Իդեալում, զոհն ինքը կօգնի մեզ։

Ընդհանուր առմամբ, որոշելով ճամփորդել բրաուզերում, ես վերջապես գտա խնդրանքը և հասցեատիրոջը: Գնալ:

Երկխոսություն տերմինալի հետ

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.

Հեյ Հեհե. Իսկապես, դա այն էր, ինչ ես սպասում էի, երբ մերկ HTTP հարցումն ուղարկում էի HTTPS պորտին: Հիմա պե՞տք է գաղտնագրենք: Այս ամբողջ աղմուկը RSA ստեղներով, հետո SHA256-ով: Ինչու, կա OpenSSL նման բաների համար. Դե, մենք արդեն գիտենք, թե ինչ պետք է անենք, մենք պարզապես նախ կհեռացնենք Referer և Cookie դաշտերը, կարծում եմ, որ դրանք շատ չեն ազդի հարցի վրա.

Երկխոսություն տերմինալի հետ

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

Ինչի՞ է ընդունակ համակարգչային աշխարհի մասին սովորող ուսանողի ուղեղը:

Սա ի՞նչ է՝ սերվերի վրա հայհոյանք։ Լավ, գոնե ինձ 200 OK պատասխանեն, ինչը նշանակում է, որ թխուկներն ու ուղղորդողը ոչ մի բանի վրա չեն ազդում։ Կոմպրեսիան gzip է, բայց պատճենելիս ASCII նիշերը պատճենվում են: Ճիշտ է, դուք կարող եք հեռացնել գիծը Ընդունել-կոդավորում. Ամեն ինչ լավ է. մենք ստանում ենք HTML փաստաթուղթ, այժմ ասոնանսներով: Բայց այստեղ երկու հարց կա՝ ինչպե՞ս գործարկել OpenSSL-ը և տվյալներ փոխանցել դրան՝ օգտագործելով սցենար: Իսկ ինչպե՞ս կարդալ ելքը, եթե պատասխանը ստանալուց հետո մենք մնում ենք, այսպես ասած, OpenSSL «կեղևում»: Եթե ​​դուք կարող եք ինչ-որ բան մտածել երկրորդի հետ, բայց առաջինի հետ...

Լավ է, որ կա Հաբրորտեղ ես կարդացել եմ օգտակար ծառայության մասին սպասել, որն ավտոմատացնում է մարդկային փոխազդեցություն ակնկալող ծրագրերի հետ փոխգործակցության գործընթացը: Թիմ ունենալն էլ ավելի գրավիչ է ինքնասպասել, առաջացնելով սպասել սցենար՝ հիմնված ձեր գործողությունների վրա: Դե, մենք գործարկում ենք այն, արեք այս ամենը և ահա ավարտված սցենարը: Միայն նա շատ հսկայական է, և բոլորը, քանի որ OpenSSL ցուցադրում է վկայականներ, բանալիներ և սպասել սպասում է այս ամենի արդյունքին: Սա մեզ պե՞տք է: Ոչ Մենք հեռացնում ենք ամբողջ առաջին հուշումը, թողնելով միայն վերջին տողի ընդմիջումը «r»: Մենք նաև հեռացնում ենք «Օգտատեր-Գործակալ» և «Ընդունել» դաշտերը մեր հարցումից. դրանք ոչ մի բանի վրա չեն ազդում: Այսպիսով, եկեք գործարկենք: Սցենարն իրականացվել է, բայց որտե՞ղ է թանկարժեք HTML փաստաթուղթը: Սպասել կերավ այն։ Որպեսզի նրան թքեն այն, դուք պետք է դնեք.

set results $expect_out(buffer)

սցենարի ավարտից առաջ - այսպես կգրվի գործարկվողի ելքը սպասել'om հրամանը և ցուցադրվում է էկրանին: Ամփոփելով, այսպիսի մի բան.

ակնկալում է սցենար

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

Բայց սա դեռ ամենը չէ։ Ինչպես տեսնում եք, բոլոր օրինակներում հարցումի URL-ը ստատիկ էր, բայց այն URL-ն է, որը պատասխանատու է այն բառի համար, թե որ բառը կապվելու է ասոնանսների հետ: Եվ այսպես, ստացվում է, որ մենք անընդհատ որոնելու ենք «%d0%b7%d0%b4%d0%b5%d1%81%d1%8c» բառը ASCII-ում կամ «այստեղ» UTF-8-ում։ Ինչ անել? Իհարկե, պարզապես ամեն անգամ նոր սցենար ստեղծեք, ընկերներ: Այլեւս ոչ ինքնասպասել― Օ, և օգնությամբ կարոտել, որովհետեւ Մեր նորում ոչինչ չի փոխվում, բացի բառից։ Եվ կեցցե նոր խնդիրը. ինչպե՞ս կարող ենք կիրիլիցայից բառը խելամտորեն թարգմանել URL ձևաչափի: Տերմինալի համար էլ առանձնահատուկ բան չկա։ Դե, լավ է, մենք կարող ենք դա անել, չէ՞: Կարող է:

Տեսեք, թե ինչ կարող եմ անել:

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

Ընդհանուր առմամբ, մենք ունենք մի սկրիպտ, որը բառը փոխակերպում է ASCII տեքստի՝ ստեղծելով մեկ այլ սկրիպտ, որը OpenSSL-ի միջոցով սերվերից պահանջում է կայքի էջ ասոնանսներով: Եվ այնուհետև մենք վերահղում ենք վերջին սցենարի ելքը դեպի ֆայլ և, հին ձևով, փոխանցում ենք այն «ֆիլտրեր» լրացուցիչ քառակուսիներ և գրեք դրանք ֆայլում:

Շատերի խաչմերուկ. Ներքեւի գիծ

Իրականում հենց դա է ամենաքիչ խնդիրներն առաջացնում։ Երկու բառի համար կատարում ենք վերը նշված ընթացակարգերը, այնուհետև երկու ցուցակներից յուրաքանչյուր բառը համեմատում ենք յուրաքանչյուրի հետ և եթե համընկնում է, դուրս ենք բերում այն։ Այժմ մենք ունենք սցենար, որը ընդունում է երկու բառ որպես մուտքագրում և ցուցադրում է բառերի ցանկ, որոնք հանգավորվում են երկուսի հետ, և նույնիսկ հաշվի առնելով ասոնանսները, և այս ամենը առանց ձեռքով անցնելու չորս ներդիրների միջև և հիշելով բառերը «աչքով»՝ բոլորը հավաքված, հաշվառված: համար և ինքնաբերաբար հեռացվում է: Հրաշալի։

Այս հրապարակման նպատակն էր ցույց տալ, որ եթե մարդուն ինչ-որ բան պետք է, նա, այնուամենայնիվ, կանի դա։ Շատ անարդյունավետ, ծուռ, սողացող, բայց կստացվի։

Source: www.habr.com

Добавить комментарий