Do que é capaz o cérebro de um aluno que está aprendendo sobre o mundo da informática?

Bom dia.

Depois de terminar de escrever outro script em Bash, percebi que tudo deveria ser completamente diferente, mas tudo funcionou. Quero mostrar a vocês quais obscenidades e muletas escrevi para resolver o problema, mas ainda não tenho conhecimento. Em outras palavras, uma caricatura de programação.

Tarefa


Algo se tornou necessário para:

  • Exibiu muitas rimas para a palavra, exceto quadrados
  • Cruzou as muitas rimas de duas palavras

Para que? Bem, é isso - e é isso.
Quem não sabe, uma rima quadrada (na linguagem comum - um quadrado) são duas palavras cujas duas últimas letras coincidem na grafia, o que (muitas vezes é a única coisa) as torna uma rima. Por exemplo, as rosas são geladas; pneu - carro. O uso de quadrados na versificação moderna não é particularmente aprovado pelas pessoas, devido ao seu primitivismo.

Solução


Pareceu-me que a solução mais simples seria escrever um script em Bash que usasse um gerador de rimas já existente - HOST, que as seleciona principalmente por consonância e não por ortografia. Que tipo de HOST? Porque se você indicar o nome real do site, dirão que é uma propaganda. Por que não continuar usando? Em primeiro lugar, apesar da vantagem de selecionar rimas com base em consonâncias, ele ainda produz frequentemente quadrados. Em segundo lugar, você ainda precisa pensar com o cérebro, gastar tempo alternando entre guias e memorizar palavras repetidas em listas para encontrar uma rima para duas palavras.

Obtendo rimas fortes

O que eu sei? Eu sei sobre o utilitário wget, que baixa a página no URL especificado. Ok, vamos executar a solicitação - obtemos uma página HTML em um arquivo nomeado com uma palavra que rima. Por exemplo, vamos pesquisar a palavra “aqui”:

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

Mas eu só preciso de uma lista de palavras, como posso me livrar de todo o resto? Olhamos e vemos que a lista de palavras está formatada, por mais estranho que seja, em forma de lista, e as palavras estão em tags . Bem, temos uma grande utilidade. sede - vamos escrever assim:

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

Primeiro, no arquivo word, selecione as linhas que contêm a tag - obtemos um monte de tags vazias e linhas com palavras. Removemos a tag em si e sua de fechamento - aqui são usados ​​símbolos de porcentagem em vez de barras porque na própria tag já existe uma barra, por quê? sede não te entende nem um pouco. E está tudo bem com juros. Removemos todos os espaços do arquivo, removemos as linhas vazias. Voila - uma lista pronta de palavras.

Para remover palavras que rimam com as últimas letras, selecione as duas últimas letras da palavra original e limpe a lista:

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

Olhamos, tentamos - tudo funciona... então, onde está a lista da palavra “brincar”? E para a palavra “eu vou”? O arquivo está vazio! E tudo isso porque essas palavras são verbos, e sabemos o que fazem com quem rima com verbos. A rima verbal é pior do que a rima quadrada, porque a língua russa tem mais verbos, e todos eles têm as mesmas terminações, por isso não estavam no arquivo final após a verificação das terminações.

No entanto, não temos pressa. Para cada palavra não existem apenas rimas, mas também assonâncias, que às vezes soam muito melhor que rima - por isso são assonâncias (assonância francesa, do latim assono - soo em harmonia).

Temos assonâncias

É aqui que a diversão começa: as assonâncias aparecem em uma URL separada e na mesma página, executando um script, enviando uma solicitação HTTP e recebendo uma resposta. Como posso dizer wget'Você aperta o botão? Mas de jeito nenhum. Tristemente.

Percebendo que o URL na linha estava mudando de alguma forma, copiei o que estava lá depois de mudar para assonâncias e colei em uma nova aba do navegador - rimas fortes se abriram. Isso não.

Essencialmente, pensei, não deveria importar para o servidor se o script que envia a solicitação é executado ou se a pessoa o digita manualmente. Então? Quem sabe, vamos dar uma olhada.

Onde enviar? O que enviar? Solicitação HTTP para o IP do servidor, existe algo como GET... então existe algo HTTP/1.1... Precisamos ver o que o navegador envia e para onde. Instalar wireshark, observe o trânsito:

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

Hum... o quê? Ah, sim, temos HTTPS. O que fazer? Lançar um ataque MITM contra você mesmo? Idealmente, a própria vítima nos ajudará.

Em geral, tendo decidido navegar no navegador, finalmente encontrei o próprio pedido e o destinatário. Ir:

Diálogo com o terminal

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.

Ei. Hehehe. Na verdade, era isso que eu esperava ao enviar uma solicitação HTTP simples para uma porta HTTPS. Devemos criptografar agora? Toda essa confusão com chaves RSA e depois com SHA256. Por que, há OpenSSL para essas coisas. Bem, já sabemos o que fazer, vamos apenas remover primeiro os campos Referer e Cookie - acho que eles não afetarão muito o assunto:

Diálogo com o terminal

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

Do que é capaz o cérebro de um aluno que está aprendendo sobre o mundo da informática?

O que é isso, xingar o servidor? Bem, pelo menos me responderam 200 OK, o que significa que os cookies e o referenciador não afetam nada. A compactação é gzip, mas ao copiar, os caracteres ASCII são copiados. Exatamente, você pode remover a linha Aceitar codificação. Está tudo bem - obtemos um documento HTML, agora com assonâncias. Mas aqui estão duas questões: como executar o OpenSSL e transferir dados para ele usando um script? E como ler a saída se depois de receber a resposta permanecemos, por assim dizer, em um “shell” OpenSSL? Se você conseguir inventar algo com o segundo, mas com o primeiro...

É bom que exista Habronde li sobre o utilitário esperar, que automatiza o processo de interação com programas que esperam interação humana. Ter uma equipe é ainda mais atrativo auto-esperar, gerando esperar script baseado em suas ações. Bem, lançamos, fazemos tudo isso e aqui está o script finalizado. Só que ele é muito grande, e tudo porque OpenSSL exibe certificados, chaves e esperar aguarda o resultado de tudo isso. Precisamos disso? Não. Removemos todo o primeiro prompt, deixando apenas a última quebra de linha 'r'. Também removemos os campos User-Agent e Accept da nossa solicitação - eles não afetam nada. Então, vamos lançar. O script foi executado, mas onde está o precioso documento HTML? Esperar comi. Para fazê-lo cuspir, você precisa colocar:

set results $expect_out(buffer)

antes do final do script - é assim que a saída do executável será escrita esperar'om comando e exibido na tela. Em resumo, algo assim:

espere um roteiro

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

Mas isso não é tudo! Como você pode ver, em todos os exemplos a URL da solicitação era estática, mas é a URL a responsável por qual palavra as assonâncias serão exibidas. E acontece que procuraremos constantemente a palavra “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” em ASCII ou “aqui” em UTF-8. O que fazer? Claro, basta gerar um novo script a cada vez, amigos! Não mais auto-esperar'ah, e com a ajuda eco, porque No nosso novo, nada muda, exceto a palavra. E viva o novo problema: como podemos traduzir de forma inteligente uma palavra do cirílico para o formato URL? Também não há nada de especial para o terminal. Bem, está tudo bem, podemos fazer isso, certo? Pode:

Olha o que eu sei fazer!

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

No total, temos um script que converte uma palavra em texto ASCII, gerando outro script que solicita uma página do site com assonâncias do servidor via OpenSSL. E então redirecionamos a saída do último script para um arquivo e, à moda antiga, passamos por ele "filtros" quadrados extras e grave-os no arquivo.

Intersecção de muitos. Resultado final

Na verdade, é exatamente isso que causa menos problemas. Realizamos os procedimentos acima para duas palavras, depois, a partir das duas listas, comparamos cada palavra com cada uma e, se for encontrada uma correspondência, produzimos a saída. Agora temos um script que pega duas palavras como entrada e exibe uma lista de palavras que rimam com ambas, e até mesmo levando em consideração assonâncias, e tudo isso sem alternar manualmente entre quatro abas e lembrar as palavras “a olho nu” - isso é tudo coletado, contabilizados e descartados automaticamente. Maravilhoso.

O objetivo desta publicação foi mostrar que se uma pessoa precisa de algo, ela o fará de qualquer maneira. Muito ineficaz, torto, assustador, mas vai funcionar.

Fonte: habr.com

Adicionar um comentário