Kompüter dünyası haqqında öyrənən şagirdin beyni nəyə qadirdir?

Yaxşı gün.

Bash-da başqa bir ssenari yazmağı bitirdikdən sonra başa düşdüm ki, hər şey tamamilə fərqli olmalıdır, amma hər şey işlədi. Problemi həll etmək üçün hansı nalayiq sözlər və qoltuqaltılar yazdığımı göstərmək istəyirəm, amma hələ bir vaqon bilgim yoxdur. Başqa sözlə, proqramlaşdırmanın karikaturasıdır.

Tapşırıq


Bir şey lazım oldu:

  • Kvadratlar istisna olmaqla, söz üçün çoxlu qafiyələr göstərilir
  • İki sözün çoxlu qafiyələrini keçdi

Nə üçün? Bax, budur - vəssalam.
Kim bilmir, kvadrat qafiyə (ümumi dildə - kvadrat) orfoqrafiyadakı son iki hərf üst-üstə düşən iki sözdür (çox vaxt bu yeganə şeydir) onları qafiyə edir. Məsələn, qızılgüllər şaxtalıdır; təkər - avtomobil. Müasir versifikasiyada kvadratların istifadəsi primitivliyinə görə insanlar tərəfindən xüsusilə bəyənilmir.

qərar


Mənə elə gəldi ki, ən sadə həll Bash dilində artıq mövcud olan qafiyə generatorundan - HOST-dan istifadə edən skript yazmaqdır, hansı ki, onları ilk növbədə orfoqrafiya ilə deyil, ahənglə seçir. Hansı HOST? Çünki saytın əsl adını qeyd etsəniz, deyəcəklər ki, reklamdır. Niyə istifadə etməyə davam etmirsiniz? Birincisi, samitlərə əsaslanan qafiyələri seçmək üstünlüyünə baxmayaraq, o, yenə də tez-tez kvadratlar yaradır. İkincisi, iki söz üçün qafiyə tapmaq üçün hələ də beyninizlə düşünməli, nişanlar arasında keçidə vaxt sərf etməli və siyahılarda təkrarlanan sözləri yadda saxlamağa enerji sərf etməlisiniz.

Güclü qafiyələr əldə etmək

Mən nə bilirəm? Kommunal haqqında bilirəm wget, göstərilən URL-də səhifəni endirir. Tamam, sorğunu yerinə yetirək - qafiyəli sözlə adlandırılan faylda HTML səhifəsi alırıq. Məsələn, “burada” sözünü axtaraq:

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

Amma mənə sadəcə söz siyahısı lazımdır, qalan hər şeydən necə qurtula bilərəm? Baxıb görürük ki, sözlərin siyahısı nə qədər qəribə olsa da, siyahı şəklində formatlanıb və sözlər teqlərindədir. Yaxşı, bizim əla yardımımız var. sed - bunu belə yazaq:

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

Əvvəlcə söz faylından teqini ehtiva edən sətirləri seçirik - bir dəstə boş teq və sözləri olan sətirlər alırıq. Teqin özünü və onun bağlanmasını silirik - burada kəsik işarələri əvəzinə faiz simvollarından istifadə olunur, çünki teqinin özündə artıq slash var, buna görə də sed səni bir az başa düşmür. Və maraqla hər şey yaxşıdır. Fayldan bütün boşluqları çıxarırıq, boş sətirləri çıxarırıq. Voila - sözlərin hazır siyahısı.

Son hərflərdən istifadə edərək qafiyəli sözləri silmək üçün orijinal sözdən son iki hərfi seçin və siyahını silin:

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

Baxırıq, çalışırıq - hər şey işləyir... bəs “oynamaq” sözünün siyahısı haradadır? Bəs "gedirəm" sözünə görə? Fayl boşdur! Bütün bunlar ona görədir ki, bu sözlər feldir və biz onların fellərlə qafiyələnənlərə nə etdiyini bilirik. Felin qafiyəsi hətta kvadrat qafiyədən də pisdir, çünki rus dilində ən çox fel var və onların hamısının sonluğu eynidir, ona görə də sonluqları yoxlayandan sonra son faylda olmayıblar.

Bununla belə, tələsmirik. Hər bir söz üçün təkcə qafiyələr deyil, həm də bəzən qafiyədən daha yaxşı səslənən assonanslar var - buna görə də onlar assonanslardır (fransızca assonans, latınca assono - mən harmoniyada səslənirəm).

Assonanslar alırıq

Əyləncə burada başlayır: assonanslar ayrı bir URL-də və eyni səhifədə skript icra etməklə, HTTP sorğusu göndərməklə və cavab almaqla görünür. Necə deyim wget'Bir düyməni basırsınız? Amma heç cür. Təəssüf ki.

Sətirdəki URL-nin bir növ dəyişdiyini görən mən assonanslara keçdikdən sonra orada olanları kopyaladım və yeni brauzer tabına yapışdırdım - güclü qafiyələr açıldı. Bu deyil.

Əslində, mən düşündüm ki, server üçün sorğunu göndərən skriptin icra edilib-edilməməsi və ya şəxsin onu əl ilə yazması fərq etməməlidir. Belə ki? Kim bilir, gedək bunu yoxlayaq.

Hara göndərmək olar? Nə göndərmək lazımdır? Server IP-yə HTTP sorğusu, GET kimi bir şey var... sonra HTTP/1.1 bir şey var... Brauzerin nəyi və hara göndərdiyini görməliyik. Yüklemek wireshark, trafikə baxın:

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... nə? Bəli, bizdə HTTPS var. Nə etməli? Özünüzə MITM hücumu həyata keçirin? İdeal olaraq, qurbanın özü bizə kömək edəcəkdir.

Ümumiyyətlə, brauzerdə sörf etmək qərarına gələrək nəhayət sorğunun özünü və ünvanı tapdım. Get:

Terminal ilə dialoq

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. Həqiqətən, HTTPS portuna açıq HTTP sorğusu göndərərkən gözlədiyim budur. İndi şifrələməliyik? Bütün bunlar RSA düymələri ilə, sonra SHA256 ilə təlaş. Niyə, var OpenSSL belə şeylər üçün. Yaxşı, biz nə edəcəyimizi artıq bilirik, əvvəlcə Referer və Kuki sahələrini siləcəyik - düşünürəm ki, onlar məsələyə çox təsir etməyəcək:

Terminal ilə dialoq

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

Kompüter dünyası haqqında öyrənən şagirdin beyni nəyə qadirdir?

Bu nədir, serverdə söyüş söymək? Yaxşı, heç olmasa mənə 200 OK cavab verdilər, bu o deməkdir ki, kukilər və yönləndirici heç bir şeyə təsir etmir. Sıxılma gzip-dir, lakin kopyalanarkən ASCII simvolları kopyalanır. Daha doğrusu, xətti silə bilərsiniz Qəbul-kodlaşdırma. Hər şey qaydasındadır - biz indi assonanslarla HTML sənədi alırıq. Ancaq burada iki sual var: OpenSSL-i necə işə salmaq və skriptdən istifadə edərək ona məlumat ötürmək olar? Cavab aldıqdan sonra OpenSSL "qabığında" qalsaq, çıxışı necə oxumaq olar? Əgər ikinci ilə bir şey tapa bilsəniz, amma birinci ilə...

Yaxşı ki, var Habrkommunal haqqında oxuduğum yer gözləmək, insanların qarşılıqlı əlaqəsini gözləyən proqramlarla qarşılıqlı əlaqə prosesini avtomatlaşdıran. Komandanın olması daha cəlbedicidir avtomatik gözləmə, yaradan gözləmək hərəkətlərinizə əsaslanan skript. Yaxşı, biz onu işə salırıq, bütün bunları edirik və işdə hazır skript. Yalnız o, çox böyük və bütün çünki OpenSSL sertifikatları, açarları və göstərilir gözləmək bütün bunların nəticəsini gözləyir. Bu bizə lazımdırmı? Yox. Biz yalnız sonuncu sətir fasiləsini 'r' qoyaraq, bütün ilk əmri çıxarırıq. Biz həmçinin İstifadəçi-Agent və Qəbul sahələrini sorğumuzdan silirik - onlar heç nəyə təsir etmir. Beləliklə, başlayaq. Skript yerinə yetirildi, lakin dəyərli HTML sənədi haradadır? Gözləyin yedi. Onu tüpürmək üçün aşağıdakıları etməlisiniz:

set results $expect_out(buffer)

skriptin sonuna qədər - icra olunanın çıxışı belə yazılacaq gözləmək'om əmri verilir və ekranda göstərilir. Xülasə, belə bir şey:

bir skript gözləyirik

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

Ancaq bu, hamısı deyil! Gördüyünüz kimi, bütün nümunələrdə sorğu URL-i statik idi, lakin hansı sözün assonanslarla əlaqələndiriləcəyinə cavabdeh olan URL-dir. Beləliklə, belə çıxır ki, biz daim ASCII-də “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” və ya UTF-8-də “burada” sözünü axtaracağıq. Nə etməli? Əlbəttə, sadəcə olaraq hər dəfə yeni skript yaradın, dostlar! Artıq yox avtomatik gözləmə'om, və köməyi ilə miss, çünki Yenimizdə sözdən başqa heç nə dəyişmir. Yaşasın yeni problem: kiril əlifbasından bir sözü necə ağıllı şəkildə URL formatına çevirə bilərik? Terminal üçün də xüsusi bir şey yoxdur. Yaxşı, yaxşı, biz bunu edə bilərik, elə deyilmi? Bacarmaq:

Gör nə edə bilərəm!

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

Ümumilikdə, bir sözü ASCII mətninə çevirən, OpenSSL vasitəsilə serverdən assonanslarla sayt səhifəsini tələb edən başqa bir skript yaradan skriptimiz var. Və sonra biz sonuncu skriptin çıxışını fayla yönləndiririk və köhnə üsulla onu keçirik. "filtrlər" əlavə kvadratlar və onları fayla yazın.

Çoxlarının kəsişməsi. Alt xətt

Əslində ən az problem yaradan da məhz budur. Yuxarıdakı prosedurları iki söz üçün həyata keçiririk, sonra iki siyahıdan hər sözü hər biri ilə müqayisə edirik və uyğunluq aşkar edilərsə, onu çıxarırıq. İndi giriş kimi iki sözü qəbul edən və hər ikisi ilə qafiyələnən, hətta assonansları nəzərə alan sözlərin siyahısını göstərən bir skriptimiz var və bütün bunlar dörd nişan arasında əllə keçmədən və "gözlə" sözlərini xatırlamadan - hamısı toplanmış, hesablanmışdır. üçün və avtomatik olaraq atılır. Möhtəşəm.

Bu nəşrin məqsədi göstərmək idi ki, insan nəyəsə ehtiyac duyarsa, onsuz da bunu edəcək. Çox təsirsiz, əyri, ürpertici, amma işləyəcək.

Mənbə: www.habr.com

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