Bộ não của một học sinh học về thế giới máy tính có khả năng làm gì?

Xin chào buổi ngày.

Sau khi viết xong một kịch bản khác ở Bash, tôi nhận ra rằng mọi thứ lẽ ra phải hoàn toàn khác, nhưng mọi thứ đều hoạt động. Tôi muốn cho bạn thấy những lời tục tĩu và chống nạng mà tôi đã viết để giải quyết vấn đề nhưng vẫn chưa có một khối kiến ​​​​thức. Nói cách khác, một bức tranh biếm họa về lập trình.

Nhiệm vụ


Một cái gì đó trở nên cần thiết để:

  • Hiển thị nhiều vần cho từ, ngoại trừ hình vuông
  • Vượt qua nhiều vần điệu của hai từ

Để làm gì? Chà, thế thôi - và thế thôi.
Ai mà không biết, vần vuông (theo cách nói thông thường - hình vuông) là hai từ có hai chữ cái cuối cùng trong cách đánh vần trùng nhau, điều này (thường là điều duy nhất) khiến chúng trở thành một vần. Ví dụ như hoa hồng có sương giá; lốp - ô tô. Việc sử dụng các hình vuông trong sự linh hoạt hiện đại không được mọi người đặc biệt chấp thuận do tính nguyên thủy của chúng.

phán quyết


Đối với tôi, có vẻ như giải pháp đơn giản nhất là viết một tập lệnh bằng Bash sử dụng một trình tạo vần đã có sẵn - HOST, công cụ này chủ yếu chọn chúng theo phụ âm chứ không phải theo chính tả. Loại máy chủ nào? Vì nếu bạn cho biết tên thật của trang web thì họ sẽ nói đó là quảng cáo. Tại sao không tiếp tục sử dụng nó? Thứ nhất, tuy có ưu điểm chọn vần dựa trên phụ âm nhưng ông vẫn thường tạo ra các vần. Thứ hai, bạn vẫn phải suy nghĩ bằng trí óc, dành thời gian chuyển đổi giữa các tab và tốn sức ghi nhớ các từ lặp lại trong danh sách để tìm vần cho hai từ.

Bắt được những vần điệu mạnh mẽ

Tôi biết gì? Tôi biết về tiện ích wget, tải xuống trang tại URL được chỉ định. Được rồi, hãy thực hiện yêu cầu - chúng tôi nhận được một trang HTML trong một tệp có tên bằng một từ có vần điệu. Ví dụ: hãy tìm kiếm từ “ở đây”:

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

Nhưng tôi chỉ cần một danh sách các từ, làm sao tôi có thể loại bỏ mọi thứ khác? Chúng ta nhìn và thấy rằng danh sách các từ được định dạng, dù lạ đến đâu, dưới dạng danh sách, và các từ nằm trong thẻ . Vâng, chúng tôi có một tiện ích tuyệt vời. khát - hãy viết nó ra như thế này:

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

Đầu tiên từ file word chọn các dòng có chứa tag - chúng tôi nhận được một loạt các thẻ trống và dòng có từ. Chúng tôi xóa chính thẻ đó và thẻ đóng của nó - ở đây ký hiệu phần trăm được sử dụng thay vì dấu gạch chéo vì trong chính thẻ đó đã có dấu gạch chéo rồi, tại sao? khát không hiểu bạn chút nào Và mọi thứ đều ổn với lãi suất. Chúng tôi xóa tất cả khoảng trắng khỏi tệp, xóa các dòng trống. Thì đấy - một danh sách các từ làm sẵn.

Để xóa các từ có vần sử dụng các chữ cái cuối cùng, hãy chọn hai chữ cái cuối cùng trong từ gốc và xóa danh sách:

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

Chúng tôi xem xét, chúng tôi thử - mọi thứ đều hoạt động... vậy, danh sách từ “chơi” ở đâu? Và đối với từ “Tôi sẽ đi”? Tệp trống! Và tất cả là do những từ này là động từ, và chúng ta biết chúng có tác dụng gì với những người gieo vần với động từ. Vần động từ còn tệ hơn cả vần vuông, bởi vì tiếng Nga có nhiều động từ nhất và tất cả chúng đều có phần cuối giống nhau, đó là lý do tại sao chúng không có trong tệp cuối cùng sau khi kiểm tra phần cuối.

Tuy nhiên, chúng tôi không vội vàng. Đối với mỗi từ không chỉ có vần mà còn có cả phụ âm, đôi khi nghe hay hơn nhiều so với vần - đó là lý do tại sao chúng là phụ âm (phụ âm tiếng Pháp, từ tiếng Latin assono - tôi nghe có vẻ hòa âm).

Chúng tôi nhận được sự đồng âm

Đây là lúc điều thú vị bắt đầu: các từ đồng âm xuất hiện tại một URL riêng biệt và trên cùng một trang bằng cách thực thi tập lệnh, gửi yêu cầu HTTP và nhận phản hồi. Tôi có thể nói như thế nào wget'Bạn có nhấn nút không? Nhưng không thể nào. Thật đáng buồn.

Nhận thấy rằng URL trong dòng đã thay đổi bằng cách nào đó, tôi đã sao chép những gì ở đó sau khi chuyển sang phụ âm và dán nó vào tab trình duyệt mới - những vần điệu mạnh mẽ đã mở ra. Không phải cái đó.

Trên thực tế, tôi nghĩ, việc máy chủ gửi yêu cầu có được thực thi hay không hay người đó gõ nó bằng tay cũng không thành vấn đề. Vì thế? Ai biết thì cùng đi xem nhé.

Gửi ở đâu? Gửi gì? Yêu cầu HTTP tới IP máy chủ, có cái gì đó như GET... sau đó có cái gì đó HTTP/1.1... Chúng ta cần xem trình duyệt gửi gì và gửi ở đâu. Cài đặt Wireshark, nhìn vào giao thông:

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

Ừm... cái gì? Ồ vâng, chúng tôi có HTTPS. Phải làm gì? Tự mình tiến hành một cuộc tấn công MITM? Lý tưởng nhất là chính nạn nhân sẽ giúp đỡ chúng ta.

Nói chung, sau khi quyết định lướt trình duyệt, cuối cùng tôi đã tìm thấy chính yêu cầu và người nhận. Đi:

Đối thoại với thiết bị đầu cuối

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.

Chào. Hehehe. Thật vậy, đó là những gì tôi mong đợi khi gửi yêu cầu HTTP đơn giản tới cổng HTTPS. Chúng ta có nên mã hóa bây giờ không? Tất cả những điều rắc rối này xảy ra với khóa RSA, sau đó là với SHA256. Tại sao, có OpenSSL cho những điều như vậy. Chà, chúng tôi đã biết phải làm gì, trước tiên chúng tôi sẽ xóa trường Người giới thiệu và Cookie - Tôi nghĩ chúng sẽ không ảnh hưởng nhiều đến vấn đề:

Đối thoại với thiết bị đầu cuối

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

Bộ não của một học sinh học về thế giới máy tính có khả năng làm gì?

Cái gì thế này, chửi thề trên máy chủ à? Chà, ít nhất họ đã trả lời tôi 200 OK, điều đó có nghĩa là cookie và người giới thiệu không ảnh hưởng gì cả. Nén là gzip nhưng khi sao chép thì ký tự ASCII cũng được sao chép. Chính xác, bạn có thể xóa dòng Chấp nhận mã hóa. Mọi thứ đều ổn - chúng tôi nhận được một tài liệu HTML, hiện có các phụ âm. Nhưng đây là hai câu hỏi: làm cách nào để chạy OpenSSL và truyền dữ liệu sang nó bằng tập lệnh? Và làm thế nào để đọc kết quả đầu ra nếu sau khi nhận được phản hồi, chúng ta vẫn ở trong "vỏ" OpenSSL? Nếu bạn có thể nghĩ ra điều gì đó với điều thứ hai, nhưng với điều thứ nhất...

Thật tốt khi có Habrnơi tôi đọc về tiện ích mong đợi, tự động hóa quá trình tương tác với các chương trình mong đợi sự tương tác của con người. Có team còn hấp dẫn hơn nữa tự động, tạo ra mong đợi kịch bản dựa trên hành động của bạn. Chà, chúng tôi khởi chạy nó, thực hiện tất cả những điều này và đây là kịch bản đã hoàn thành. Chỉ có điều anh ấy rất to lớn, và tất cả là vì OpenSSL hiển thị chứng chỉ, khóa và mong đợi đang chờ đợi đầu ra của tất cả điều này. Chúng ta có cần điều này không? KHÔNG. Chúng tôi xóa toàn bộ dấu nhắc đầu tiên, chỉ để lại dấu ngắt dòng cuối cùng 'r'. Chúng tôi cũng xóa các trường Tác nhân người dùng và Chấp nhận khỏi yêu cầu của mình - chúng không ảnh hưởng gì cả. Vì vậy, hãy khởi động. Tập lệnh đã được thực thi, nhưng tài liệu HTML quý giá ở đâu? Mong đợi đã ăn nó. Để làm cho anh ta nhổ nó ra, bạn cần phải đặt:

set results $expect_out(buffer)

trước khi kết thúc tập lệnh - đây là cách đầu ra của tệp thực thi sẽ được viết mong đợi'om lệnh và hiển thị trên màn hình. Tóm lại, một cái gì đó như thế này:

mong đợi một kịch bản

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

Nhưng đó không phải là tất cả! Như bạn có thể thấy, trong tất cả các ví dụ, URL yêu cầu là tĩnh nhưng chính URL đó chịu trách nhiệm về từ nào sẽ được liên kết với các phụ âm. Và do đó, hóa ra là chúng ta sẽ liên tục tìm kiếm từ “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” trong ASCII hoặc “here” trong UTF-8. Phải làm gì? Tất nhiên, bạn chỉ cần tạo một tập lệnh mới mỗi lần thôi nhé các bạn! Không còn nữa tự động'ồ, và với sự giúp đỡ bỏ lỡ, bởi vì Trong cái mới của chúng tôi, không có gì thay đổi ngoại trừ từ này. Và vấn đề mới tồn tại lâu dài: làm thế nào chúng ta có thể dịch một từ từ Cyrillic sang định dạng URL một cách thông minh? Không có gì đặc biệt cho thiết bị đầu cuối. Được rồi, không sao đâu, chúng ta có thể làm được mà, phải không? Có thể:

Hãy xem tôi có thể làm được gì này!

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

Tổng cộng, chúng tôi có một tập lệnh chuyển đổi một từ thành văn bản ASCII, tạo ra một tập lệnh khác yêu cầu một trang web có phụ âm từ máy chủ thông qua OpenSSL. Và sau đó chúng tôi chuyển hướng đầu ra của tập lệnh cuối cùng sang một tệp và theo cách cũ, chuyển nó qua "bộ lọc" các ô vuông thừa và ghi chúng vào tập tin.

Giao lộ của nhiều người. Điểm mấu chốt

Trên thực tế, đây chính xác là nguyên nhân gây ra ít vấn đề nhất. Chúng tôi thực hiện các quy trình trên cho hai từ, sau đó từ hai danh sách, chúng tôi so sánh từng từ với nhau và nếu tìm thấy kết quả khớp, chúng tôi sẽ xuất nó. Bây giờ chúng tôi có một tập lệnh lấy hai từ làm đầu vào và hiển thị danh sách các từ có vần với cả hai và thậm chí có tính đến các phụ âm và tất cả điều này mà không cần chuyển đổi thủ công giữa bốn tab và ghi nhớ các từ “bằng mắt” - tất cả đều được thu thập, tính toán for và bị loại bỏ tự động. Tuyệt vời.

Mục đích của ấn phẩm này là để chứng tỏ rằng nếu một người cần điều gì đó thì anh ta sẽ làm bằng mọi cách. Rất không hiệu quả, quanh co, đáng sợ, nhưng nó sẽ có tác dụng.

Nguồn: www.habr.com

Thêm một lời nhận xét