පරිගණක ලෝකය ගැන ඉගෙන ගන්නා සිසුවෙකුගේ මොළයේ හැකියාව කුමක්ද?

සුභ දවසක්.

Bash හි තවත් පිටපතක් ලිවීම අවසන් වූ පසු, සියල්ල සම්පූර්ණයෙන්ම වෙනස් විය යුතු බව මට වැටහුණි, නමුත් සියල්ල සාර්ථක විය. ගැටලුව විසඳීම සඳහා මා ලිවූ අසභ්‍ය හා කිහිලිකරු මොනවාදැයි ඔබට පෙන්වීමට මට අවශ්‍යය, නමුත් තවමත් දැනුමේ කරත්තයක් නොමැත. වෙනත් වචන වලින් කිවහොත්, වැඩසටහන්කරණයේ විකට රූපයකි.

අරමුණු


යමක් අවශ්‍ය විය:

  • කොටු හැර, වචනය සඳහා බොහෝ රිද්ම පෙන්වයි
  • වචන දෙකක බොහෝ රයිම් තරණය කළා

කුමක් සඳහා ද? හොඳයි, එයයි - සහ එයයි.
කවුද නොදන්නේ, හතරැස් රයිම් (පොදු ව්‍යවහාරයෙන් - චතුරස්‍රයක්) යනු අක්ෂර වින්‍යාසයේ අවසාන අකුරු දෙක සමපාත වන වචන දෙකකි, එය (බොහෝ විට, මෙය එකම දෙය) ඒවා රිද්මයක් බවට පත් කරයි. උදාහරණයක් ලෙස, රෝස මල් තුහීන වේ; ටයර් - කාර්. නූතන අනුවාදවල වර්ග භාවිතා කිරීම ඔවුන්ගේ ප්‍රාථමික බව නිසා මිනිසුන් විසින් විශේෂයෙන් අනුමත නොකෙරේ.

තීරණය


මට පෙනුනේ සරලම විසඳුම Bash හි දැනටමත් පවතින රයිම් උත්පාදකයක් භාවිතා කරන පිටපතක් ලිවීම බවයි - HOST, එය මූලික වශයෙන් ඒවා තෝරා ගන්නේ ව්‍යාංජනාක්ෂරයෙන් මිස අක්ෂර වින්‍යාසයෙන් නොවේ. කුමන ආකාරයේ HOST ද? මොකද සයිට් එකේ ඇත්ත නම දැම්මොත් ඒ අය කියයි දැන්වීමක් කියලා. එය දිගටම භාවිතා නොකරන්නේ ඇයි? පළමුව, ව්‍යාංජනාක්ෂර මත පදනම්ව රිද්ම තෝරා ගැනීමේ ඔහුගේ වාසිය නොතකා, ඔහු තවමත් බොහෝ විට වර්ග නිෂ්පාදනය කරයි. දෙවනුව, ඔබට තවමත් ඔබේ මොළයෙන් සිතිය යුතුය, ටැබ් අතර මාරු වීමට කාලය ගත කළ යුතුය, සහ වචන දෙකක් සඳහා රිද්මයක් සොයා ගැනීමට ලැයිස්තු තුළ නැවත නැවත වචන කටපාඩම් කිරීමට ශක්තියක් ඇත.

ශක්තිමත් රයිම් ලබා ගැනීම

මම මොනවද දන්නේ? මම උපයෝගිතා ගැන දන්නවා ඩී, නිශ්චිත 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

පළමුව, වචන ගොනුවෙන්, ටැගය අඩංගු රේඛා තෝරන්න - අපට හිස් ටැග් සහ වචන සහිත රේඛා පොකුරක් ලැබේ. අපි ටැගයම සහ එහි අවසන් එක ඉවත් කරන්නෙමු - මෙහි ටැගය තුළම නිසා කප්පාදුව වෙනුවට සියයට සංකේත භාවිතා වේ. දැනටමත් කප්පාදුවක් තිබේ, ඇයි? sed ඔයාට ටිකක් තේරෙන්නේ නැහැ. සහ උනන්දුව සමඟ සෑම දෙයක්ම හොඳයි. අපි ගොනුවෙන් සියලුම අවකාශයන් ඉවත් කරමු, හිස් රේඛා ඉවත් කරන්න. Voila - සූදානම් කළ වචන ලැයිස්තුවක්.

අවසාන අකුරු භාවිතයෙන් රයිම් කරන වචන ඉවත් කිරීම සඳහා, මුල් වචනයෙන් අවසාන අකුරු දෙක තෝරා ලැයිස්තුව ඉවත් කරන්න:

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

අපි බලනවා, අපි උත්සාහ කරනවා - හැම දෙයක්ම වැඩ කරනවා ... ඉතින්, "සෙල්ලම්" යන වචනය සඳහා ලැයිස්තුව කොහෙද? සහ "මම යනවා" යන වචනය සඳහා? ගොනුව හිස්! මේ සියල්ල සිදුවන්නේ මෙම වචන ක්‍රියා පද වන අතර ක්‍රියා පද සමඟ රිද්ම කරන අයට ඔවුන් කරන්නේ කුමක්දැයි අපි දනිමු. ක්‍රියා පද රචනය හතරැස් රයිම් වලටත් වඩා නරක ය, මන්ද රුසියානු භාෂාවේ වැඩිපුරම ක්‍රියා පද ඇති අතර ඒ සියල්ලටම එකම අවසානයන් ඇති බැවිනි, එබැවින් ඒවා අවසන් කිරීම් පරීක්ෂා කිරීමෙන් පසු අවසාන ගොනුවේ නොතිබුණි.

කෙසේ වෙතත්, අපි ඉක්මන් නොවෙමු. සෑම වචනයක් සඳහාම රයිම් පමණක් නොව, සමහර විට රිද්මයට වඩා හොඳ ශබ්ද ද ඇත - ඒ නිසා ඒවා ඇසෝනන්ස් වේ (ප්‍රංශ ඇසෝනන්ස්, ලතින් අසෝනෝ වෙතින් - මම එකඟතාවයෙන් ශබ්ද කරමි).

අපට අනුශාසනා ලැබේ

විනෝදය ආරම්භ වන්නේ මෙතැනින් ය: ස්ක්‍රිප්ට් එකක් ක්‍රියාත්මක කිරීමෙන්, HTTP ඉල්ලීමක් යැවීමෙන් සහ ප්‍රතිචාරයක් ලැබීමෙන් අසනස් වෙනම URL එකක සහ එම පිටුවේම දිස් වේ. කොහොමද මං කියන්නේ ඩී'ඔබ බොත්තම ඔබනවාද? ඒත් විදියක් නෑ. කණගාටුදායකයි.

පේළියේ ඇති URL එක කෙසේ හෝ වෙනස් වන බව දුටු මම, assonances වෙත මාරු වූ පසු එහි තිබූ දේ පිටපත් කර නව බ්‍රව්සර් ටැබ් එකක ඇලවූවෙමි - ශක්තිමත් රයිම් විවෘත විය. එහෙම නෙවෙයි.

අත්‍යවශ්‍යයෙන්ම, මම සිතුවෙමි, ඉල්ලීම යවන ස්ක්‍රිප්ට් එක ක්‍රියාත්මක වන්නේද, නැතහොත් පුද්ගලයා එය අතින් ටයිප් කරන්නේද යන්න සේවාදායකයට වැදගත් නොවේ. ඒ නිසා? කවුද දන්නේ, අපි එය පරීක්ෂා කර බලමු.

යැවිය යුත්තේ කොතැනටද? කුමක් යැවිය යුතුද? HTTP request එක server IP එකට, GET වගේ එකක් තියෙනවා... එතකොට HTTP/1.1 වගේ දෙයක් තියෙනවා... Browser එක යවන්නේ මොනවද කොහෙද කියලා බලන්න ඕනේ. ස්ථාපනය කරන්න රැහැන් රහිත ය, තදබදය දෙස බලන්න:

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.

හේයි. හෙහෙහේ. ඇත්ත වශයෙන්ම, HTTPS වරායකට හිස් HTTP ඉල්ලීමක් යැවීමේදී මා බලාපොරොත්තු වූයේ එයයි. අපි දැන් සංකේතනය කළ යුතුද? මේ සියල්ල RSA යතුරු සමඟ, පසුව SHA256 සමඟ. ඇයි, තියෙනවා OpenSSL එවැනි දේවල් සඳහා. හොඳයි, අපි දැනටමත් කුමක් කළ යුතු දැයි දනිමු, අපි පළමුව යොමු කරන්නා සහ කුකී ක්ෂේත්‍ර ඉවත් කරන්නෙමු - මම හිතන්නේ ඒවා කාරණයට එතරම් බලපාන්නේ නැත:

ටර්මිනලය සමඟ සංවාදය

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 හරි පිළිතුරු දුන්නා, එයින් අදහස් කරන්නේ කුකීස් සහ යොමු කරන්නා කිසිම දෙයකට බලපාන්නේ නැති බවයි. සම්පීඩනය gzip වේ, නමුත් පිටපත් කිරීමේදී, ASCII අක්ෂර පිටපත් කරනු ලැබේ. හරියටම, ඔබට රේඛාව ඉවත් කළ හැකිය පිළිගන්න-කේතනය. හැම දෙයක්ම හොඳයි - අපිට HTML ලේඛනයක් ලැබෙනවා, දැන් assonances සමඟ. නමුත් මෙහි ප්‍රශ්න දෙකක් තිබේ: OpenSSL ධාවනය කර ස්ක්‍රිප්ට් භාවිතයෙන් දත්ත මාරු කරන්නේ කෙසේද? ප්‍රතිචාරය ලැබීමෙන් පසු අපි OpenSSL “shell” එකක පවතිනවා නම් ප්‍රතිදානය කියවන්නේ කෙසේද? දෙවැන්නෙන් යමක් ඉදිරිපත් කළ හැකි නම්, නමුත් පළමු ...

තියෙන එක හොඳයි හබ්ර්මම උපයෝගීතාව ගැන කියවන තැන බලාපොරොත්තු වෙනවා, මානව අන්තර්ක්‍රියා අපේක්ෂා කරන වැඩසටහන් සමඟ අන්තර්ක්‍රියා කිරීමේ ක්‍රියාවලිය ස්වයංක්‍රීය කරයි. කණ්ඩායමක් සිටීම වඩාත් ආකර්ෂණීයයි autoexpect, උත්පාදනය කිරීම බලාපොරොත්තු වෙනවා ඔබගේ ක්‍රියාවන් මත පදනම් වූ ස්ක්‍රිප්ට්. හොඳයි, අපි එය දියත් කරමු, මේ සියල්ල කරන්න, මෙන්න නිමි පිටපත. ඔහු පමණක් ඉතා විශාල වන අතර ඒ සියල්ල නිසාය 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 එක ස්ථිතික විය, නමුත් එය assonances සමඟ සම්බන්ධ වන්නේ කුමන වචනය සඳහාද යන්න වගකිව යුතු URL වේ. එබැවින් අපි ASCII හි “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” හෝ UTF-8 හි “මෙහි” යන වචනය නිරන්තරයෙන් සොයන බව පෙනේ. කුමක් කරන්න ද? ඇත්ත වශයෙන්ම, සෑම විටම නව පිටපතක් ජනනය කරන්න, මිත්‍රවරුනි! තවදුරටත් නැහැ autoexpect'ඔහ්, සහ උදව්වෙන් ප්රතිමාවේ, නිසා අපගේ නව, වචනය හැර කිසිවක් වෙනස් නොවේ. නව ගැටලුවට දීර්ඝායු වේවා: සිරිලික් භාෂාවෙන් වචනයක් 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 හරහා සේවාදායකයෙන් සහන සහිත අඩවි පිටුවක් ඉල්ලා සිටින වෙනත් ස්ක්‍රිප්ට් එකක් ජනනය කරයි. ඉන්පසුව අපි අවසාන ස්ක්‍රිප්ටයේ ප්‍රතිදානය ගොනුවකට හරවා යවා පැරණි ආකාරයෙන් එය හරහා යන්නෙමු. "පෙරහන්" අමතර කොටු සහ ඒවා ගොනුවට ලියන්න.

බොහෝ ඡේදනය. පහළ රේඛාව

ඇත්ත වශයෙන්ම, අවම ගැටළු ඇති කරන්නේ මෙයයි. අපි ඉහත ක්‍රියා පටිපාටි වචන දෙකක් සඳහා සිදු කරන්නෙමු, පසුව ලැයිස්තු දෙකෙන් අපි එක් එක් වචනය එක් එක් වචනය සමඟ සංසන්දනය කර ගැළපීමක් සොයාගතහොත් අපි එය ප්‍රතිදානය කරමු. දැන් අප සතුව වචන දෙකක් ආදානයක් ලෙස ගෙන යන ස්ක්‍රිප්ට් එකක් ඇති අතර දෙකම සමඟ රිද්ම වන වචන ලැයිස්තුවක් පෙන්වයි, සහ ඇසෝනන්ස් පවා සැලකිල්ලට ගනිමින්, මේ සියල්ල ටැබ් හතරක් අතර අතින් මාරු නොවී “ඇසින්” වචන මතක තබා නොගෙන - සියල්ල එකතු කර, ගිණුම්ගත කර ඇත. සඳහා සහ ස්වයංක්රීයව ඉවතලනු ලැබේ. පුදුමයි.

මෙම ප්‍රකාශනයේ අරමුණ වූයේ පුද්ගලයෙකුට යමක් අවශ්‍ය නම්, ඔහු එය කෙසේ හෝ කරන බව පෙන්වීමයි. ඉතා අකාර්යක්ෂම, වංක, බඩගා යන, නමුත් එය වැඩ කරනු ඇත.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න