Τι μπορεί να κάνει ο εγκέφαλος ενός μαθητή που μαθαίνει για τον κόσμο των υπολογιστών;

Καλημέρα.

Έχοντας ολοκληρώσει τη συγγραφή ενός άλλου σεναρίου στο Bash, συνειδητοποίησα ότι όλα θα έπρεπε να είναι τελείως διαφορετικά, αλλά όλα λειτούργησαν. Θέλω να σας δείξω τι χυδαιότητες και δεκανίκια έγραψα για να λύσω το πρόβλημα, χωρίς όμως να έχω ακόμα ένα βαγόνι γνώσης. Με άλλα λόγια, μια καρικατούρα προγραμματισμού.

Έργο


Κάτι έγινε απαραίτητο για:

  • Εμφανίζονται πολλές ομοιοκαταληξίες για τη λέξη, εκτός από τετράγωνα
  • Διασταύρωσε τις πολλές ρίμες δύο λέξεων

Για τι? Λοιπόν, αυτό είναι - και αυτό είναι.
Ποιος δεν ξέρει, μια τετράγωνη ομοιοκαταληξία (στην κοινή γλώσσα - ένα τετράγωνο) είναι δύο λέξεις των οποίων τα δύο τελευταία γράμματα στην ορθογραφία συμπίπτουν, κάτι που (συχνά, αυτό είναι το μόνο πράγμα) τις κάνει ομοιοκαταληξία. Για παράδειγμα, τα τριαντάφυλλα είναι παγωμένα. ελαστικό - αυτοκίνητο. Η χρήση των τετραγώνων στη σύγχρονη στιχουργική δεν είναι ιδιαίτερα εγκεκριμένη από τους ανθρώπους, λόγω της πρωτογονικότητάς τους.

Λύση


Μου φάνηκε ότι η απλούστερη λύση ήταν να γράψω ένα σενάριο στο Bash που χρησιμοποιεί μια ήδη υπάρχουσα γεννήτρια ομοιοκαταληξίας - HOST, η οποία τα επιλέγει κυρίως με συναινετικό τρόπο και όχι με ορθογραφία. Τι είδους HOST; Γιατί αν υποδείξεις το πραγματικό όνομα του site θα πουν ότι είναι διαφήμιση. Γιατί να μην συνεχίσετε να το χρησιμοποιείτε; Πρώτον, παρά το πλεονέκτημά του να επιλέγει ομοιοκαταληξίες με βάση τους συμφώνους, εξακολουθεί να παράγει συχνά τετράγωνα. Δεύτερον, πρέπει ακόμα να σκέφτεστε με τον εγκέφαλό σας, να ξοδεύετε χρόνο εναλλάσσοντας καρτέλες και ενέργεια απομνημονεύοντας επαναλαμβανόμενες λέξεις σε λίστες για να βρείτε μια ομοιοκαταληξία για δύο λέξεις.

Παίρνοντας δυνατές ομοιοκαταληξίες

Τι ξέρω εγώ? Ξέρω για το βοηθητικό πρόγραμμα wget, το οποίο κατεβάζει τη σελίδα στην καθορισμένη διεύθυνση 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

Αρχικά, από το αρχείο word, επιλέξτε τις γραμμές που περιέχουν την ετικέτα — παίρνουμε ένα σωρό κενές ετικέτες και γραμμές με λέξεις. Αφαιρούμε την ίδια την ετικέτα και το κλείσιμό της - εδώ χρησιμοποιούνται σύμβολα τοις εκατό αντί για κάθετες, επειδή στην ίδια την ετικέτα υπάρχει ήδη μια κάθετο, γιατί; δίψα δεν σε καταλαβαινει λιγο. Και όλα καλά με τόκο. Αφαιρούμε όλα τα κενά από το αρχείο, αφαιρούμε τις κενές γραμμές. 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 για τέτοια πράγματα. Λοιπόν, ξέρουμε ήδη τι πρέπει να κάνουμε, απλώς θα καταργήσουμε πρώτα τα πεδία Παραπομπή και 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, που σημαίνει ότι τα cookies και το referrer δεν επηρεάζουν τίποτα. Η συμπίεση είναι gzip, αλλά κατά την αντιγραφή, αντιγράφονται χαρακτήρες ASCII. Ακριβώς, μπορείτε να αφαιρέσετε τη γραμμή Αποδοχή-κωδικοποίηση. Όλα είναι καλά - λαμβάνουμε ένα έγγραφο HTML, τώρα με συνειρμούς. Αλλά εδώ υπάρχουν δύο ερωτήσεις: πώς να εκτελέσετε το OpenSSL και να μεταφέρετε δεδομένα σε αυτό χρησιμοποιώντας ένα σενάριο; Και πώς να διαβάσετε την έξοδο εάν μετά τη λήψη της απάντησης παραμείνουμε, σαν να λέγαμε, σε ένα "κέλυφος" OpenSSL; Αν μπορείς να βρεις κάτι με το δεύτερο, αλλά με το πρώτο...

Είναι καλό που υπάρχει Habrόπου διάβασα για το βοηθητικό πρόγραμμα αναμένω, που αυτοματοποιεί τη διαδικασία αλληλεπίδρασης με προγράμματα που αναμένουν ανθρώπινη αλληλεπίδραση. Το να έχεις ομάδα είναι ακόμα πιο ελκυστικό αυτόματη αναμονή, δημιουργώντας αναμένω σενάριο βασισμένο στις ενέργειές σας. Λοιπόν, το εκκινούμε, κάντε όλα αυτά και εδώ είναι το τελικό σενάριο. Μόνο που είναι πολύ τεράστιος, και όλα αυτά γιατί OpenSSL εμφανίζει πιστοποιητικά, κλειδιά και αναμένω περιμένει το αποτέλεσμα όλων αυτών. Το χρειαζόμαστε αυτό; Οχι. Αφαιρούμε ολόκληρη την πρώτη προτροπή, αφήνοντας μόνο την τελευταία αλλαγή γραμμής 'r'. Επίσης, αφαιρούμε τα πεδία User-Agent και Accept από το αίτημά μας - δεν επηρεάζουν τίποτα. Λοιπόν, ας ξεκινήσουμε. Το σενάριο εκτελέστηκε, αλλά πού βρίσκεται το πολύτιμο έγγραφο 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. Και μετά ανακατευθύνουμε την έξοδο του τελευταίου σεναρίου σε ένα αρχείο και, με τον παλιό τρόπο, το περνάμε "φίλτρα" επιπλέον τετράγωνα και γράψτε τα στο αρχείο.

Διασταύρωση πολλών. Συμπέρασμα

Στην πραγματικότητα, αυτό ακριβώς είναι που προκαλεί τα λιγότερα προβλήματα. Πραγματοποιούμε τις παραπάνω διαδικασίες για δύο λέξεις, στη συνέχεια από τις δύο λίστες συγκρίνουμε κάθε λέξη με την καθεμία και αν βρεθεί αντιστοιχία την βγάζουμε. Τώρα έχουμε ένα σενάριο που λαμβάνει δύο λέξεις ως είσοδο και εμφανίζει μια λίστα λέξεων που έχουν ομοιοκαταληξία και με τις δύο, ακόμη και λαμβάνοντας υπόψη τους συνειρμούς, και όλα αυτά χωρίς χειροκίνητη εναλλαγή μεταξύ τεσσάρων καρτελών και απομνημόνευση λέξεων "με το μάτι" - όλα αυτά συλλέγονται, λογίζονται και απορρίπτονται αυτόματα. Εκπληκτικός.

Σκοπός αυτής της δημοσίευσης ήταν να δείξει ότι αν κάποιος χρειάζεται κάτι, θα το κάνει ούτως ή άλλως. Πολύ αναποτελεσματικό, στραβό, ανατριχιαστικό, αλλά θα λειτουργήσει.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο