د کمپیوټر نړۍ په اړه د زده کونکي دماغ څه وړتیا لري؟

ښه ورځ.

په باش کې د بل سکریپټ لیکلو پای ته رسولو سره، ما پوهیده چې هرڅه باید په بشپړ ډول توپیر ولري، مګر هرڅه کار وکړ. زه غواړم تاسو ته وښیم چې ما د ستونزې د حل لپاره کوم فحاشي او خیانتونه لیکلي دي، مګر تر اوسه د پوهې واګون نه لري. په بل عبارت، د پروګرام کولو کاریکچر.

موخه


یو څه اړین وو چې:

  • د کلمې لپاره ډیری نظمونه ښودل شوي، پرته له چوکونو
  • د دوو کلمو ډیری نظمونه تیر کړل

د څه لپاره؟ ښه، دا دی - او دا دی.
څوک نه پوهیږي، مربع نظم (په عام ډول - یو مربع) دوه کلمې دي چې په املا کې وروستي دوه توري سره یو ځای کیږي، کوم چې (اکثرا، دا یوازینی شی دی) دوی ته نظم جوړوي. د مثال په توګه، ګلاب یخ دی؛ ټایر - موټر. په عصري تایید کې د چوکونو کارول په ځانګړې توګه د خلکو لخوا د دوی د ابتداييتوب له امله تصویب شوي ندي.

پریکړه


ما ته داسې بریښي چې ترټولو ساده حل په باش کې د سکریپټ لیکل و چې د دمخه موجود نظم جنریټر - HOST کاروي ، کوم چې په ابتدايي ډول دوی د ترکیب له مخې غوره کوي ، نه د املا په واسطه. کوم ډول HOST؟ ځکه که تاسو د سایټ اصلي نوم په ګوته کړئ، دوی به ووایي چې دا یو اعلان دی. ولې یې کارولو ته دوام نه ورکوو؟ لومړی، سره له دې چې د کنسونانس پر بنسټ د نظمونو په ټاکلو کې د هغه ګټې سره سره، هغه لاهم ډیری وختونه مربع جوړوي. دوهم، تاسو باید لاهم د خپل دماغ سره فکر وکړئ، د ټبونو تر مینځ وخت بدل کړئ، او په لیست کې د تکرار کلمو په یادولو کې انرژي مصرف کړئ ترڅو د دوو کلمو لپاره نظم ومومئ.

قوي نظمونه ترلاسه کول

زه څه پوهیږم؟ زه د کارونې په اړه پوهیږم ویزه، کوم چې په ټاکل شوي URL کې پاڼه ډاونلوډ کوي. سمه ده، اجازه راکړئ غوښتنه اجرا کړو - موږ په یوه فایل کې یو HTML پاڼه ترلاسه کوو چې نوم یې د ریمینګ کلمې سره دی. د مثال په توګه، راځئ چې د "دلته" کلمه ولټوو:

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

مګر زه یوازې د کلمو لیست ته اړتیا لرم، زه څنګه کولی شم چې نور هرڅه لرې کړم؟ موږ ګورو او ګورو چې د کلمو لیست فارمیټ شوی، مهمه نده چې دا څومره عجیب وي، د لیست په بڼه، او کلمې په ټګونو کې دي. ښه، موږ یو لوی افادیت لرو. سل - راځئ چې دا په لاندې ډول ولیکئ:

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

لومړی، موږ د کلمې فایل څخه کرښې غوره کوو چې د ټګ لري - موږ د کلمو سره د خالي ټاګونو او لینونو یوه ډله ترلاسه کوو. موږ پخپله ټاګ لرې کوو او د هغې بندول - دلته د سلیشونو پر ځای سلنه سمبولونه کارول کیږي ځکه چې د ټګ پخپله دمخه سلیش لري، له همدې امله سل تاسو یو څه نه پوهیږئ. او هر څه د ګټو سره سم دي. موږ د فایل څخه ټول ځایونه لرې کوو، خالي کرښې لرې کوو. Voila - د کلمو یو چمتو شوی لیست.

د هغو کلمو د لرې کولو لپاره چې د وروستي تورو په کارولو سره نظم کوي، د اصلي کلمې څخه وروستي دوه توري غوره کړئ او لیست پاک کړئ:

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

موږ ګورو، موږ هڅه کوو - هرڅه کار کوي ... نو، د "لوبې" کلمې لیست چیرته دی؟ او د "زه ځم" کلمې لپاره؟ دوتنه خالي ده! او دا ټول د دې لپاره دي چې دا کلمې فعلونه دي، او موږ پوهیږو چې دوی د هغه چا سره څه کوي چې د فعل سره سمون لري. فعلي نظم د حتا مربع نظم څخه بدتر دی، ځکه چې په روسي ژبه کې ډیری فعلونه شتون لري، او ټول یې یو شان پایونه لري، له همدې امله دوی د پایونو چک کولو وروسته په وروستي فایل کې نه و.

په هرصورت، موږ په بیړه کې نه یو. د هرې کلمې لپاره نه یوازې نظمونه شتون لري، بلکې غږونه هم شتون لري، کوم چې ځینې وختونه د نظم په پرتله خورا ښه غږ کوي - له همدې امله دوی تسلط دي (فرانسوي غږ، د لاتین اسونو څخه - زه په همغږي کې غږ کوم).

موږ تسلط ترلاسه کوو

دا هغه ځای دی چې تفریح ​​​​پیل کیږي: په جلا URL کې همغږي ښکاري، او په ورته پاڼه کې، د سکریپټ په اجرا کولو سره، د HTTP غوښتنه لیږل او ځواب ترلاسه کول. زه څنګه کولی شم ووایم ویزه'ایا تاسو یوه تڼۍ فشاروئ؟ مګر هیڅ لاره. په خواشینۍ سره.

د دې په پام کې نیولو سره چې په کرښه کې URL یو څه بدل شوی و، ما هغه څه کاپي کړل چې هلته یې د اسانتیاو بدلولو وروسته شتون درلود او په نوي براوزر ټب کې یې پیسټ کړ - قوي نظمونه خلاص شول. هغه نه.

په حقیقت کې، ما فکر کاوه، دا باید سرور ته مهمه نده چې آیا هغه سکریپټ چې غوښتنه یې لیږل کیږي اجرا کیږي، یا ایا دا کس د لاس په واسطه ټایپ کوي. نو؟ څوک پوهیږي، راځئ چې دا وګورو.

چیرته لیږل؟ څه شی ولیږو؟ د سرور IP ته HTTP غوښتنه، د GET په څیر یو څه شتون لري ... بیا یو څه HTTP/1.1 شتون لري ... موږ اړتیا لرو چې وګورو چې براوزر څه لیږي او چیرې. نصب کړئ ویسټشیرترافیک ته وګورئ:

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.

اې. Hehehe په حقیقت کې ، دا هغه څه دي چې ما تمه درلوده کله چې د 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 OK ځواب ورکړ، دا پدې مانا ده چې کوکیز او ریفرر هیڅ شی اغیزه نه کوي. کمپریشن gzip دی، مګر کله چې کاپي کیږي، د ASCII حروف کاپي کیږي. په سمه توګه، تاسو کولی شئ کرښه لرې کړئ Accept-encoding. هرڅه سم دي - موږ د 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 جامد و، مګر دا یو آر ایل دی چې مسؤلیت لري د کومې کلمې لپاره چې د موافقت سره تړاو لري. او نو دا معلومه شوه چې موږ به په دوامداره توګه د ASCII یا "دلته" په UTF-0 کې د "%d7%b0%d4%b0%d5%b1%d81%1%d8%8c" کلمه ولټوو. چې څه کول پکار دي؟ البته، هر وخت په ساده ډول یو نوی سکریپټ جوړ کړئ، ملګري! نور نه اتومات تمهاوم، او په مرسته خوشې کړئځکه زموږ په نوي کې، د کلمې پرته هیڅ شی نه بدلیږي. او نوې ستونزه اوږده ژوند وکړئ: موږ څنګه کولی شو په هوښیارۍ سره د سیریلیک څخه یوه کلمه د URL ب formatه کې وژباړو؟ د ترمینل لپاره هم کوم ځانګړی ندی. ښه، دا سمه ده، موږ دا کولی شو، سمه ده؟ کولی شي:

وګوره چې زه څه کولی شم!

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

Add a comment