Introduzindo um pouco mais a fundo o shell script (revisado)

Shell Script é a linguagem de programação de alto nível interpretada pelo shell. Se você não entendeu o significado da frase anterior, é bem provável que este artigo possa lhe ser útil.

[ Hits: 25.350 ]

Por: Perfil removido em 31/03/2009


Cara, cadê a tal da prototipagem?



Calma, neo. Irei apenas lhe mostrar a porta, mas quem decide atravessá-la é você. Então observe um minúsculo porém eficaz exemplo que usa outras linguagens além do Shell Script.

Neste exemplo temos uma consulta em um banco de dados MySQL diretamente na bash sem que fiquemos permanentemente conectados a "CLI", onde, usamos:

mysql -u nome-usuario_do banco_de_dados -psenha -d base_de_dados -e 'SELECT * FROM minha_tabela;'

Isso gera um resultado como se você tivesse acessado diretamente o mysql através da sua shell e depois se conectado a base de dados para logo depois de executar a query sair imediatamente mostrando o resultado da consulta que pode ser colocado dentro de um Shell Script e seu resultado, caso você queira, guardado dentro de uma variável. Como no exemplo abaixo:

VAR=$(mysql -u usuario_do_banco de dados -pssenha -D base_de_dados -e 'SELECT * FROM minha_tabela;')

Deu certo! Beleza!!!

Agora eu sei que esse trecho dará muito certo também em outra linguagem como a C, já que ele foi prototipado em Shell Script.

Shell Script + C para todos...

Uma dica diferente de compilar um script sem o uso do shc (shell compiler), que também evita "espertinhos" que tem acesso a conta de root e modificam o código de um shell script só para zoar com você, é usar a função system do C que chama os comandos que estão no path do sistema.

#include <stdio.h>
main()
{
system("\
  clear;\
  mysql -u root -p123456 -D testes -e '\
  SELECT * FROM minha_tabela' | \
  less \
");
}

Para compilá-lo, use o dificílimo comando dentro da pasta onde esta o código fonte:

gcc ./nome_do_codigo_fonte.c -o nome_do_executavel

Para executar seu programinha, use a linha seguir dentro do diretório onde foi gerado o executável.

./nome_do_executavel

E seja um GNU/Linuxer feliz 8)

Página anterior    

Páginas do artigo
   1. Obviamente desconfiado
   2. Santa prototipagem Tux-man!
   3. Cara, cadê a tal da prototipagem?
Outros artigos deste autor

Sistemas de arquivos para GNU/Linux

Instale/Reinstale/Recupere seu sistema sem perder seus arquivos

Instalação e configuração do gdesklets no Slackware 10

SparkleShare - Uma alternativa livre do Dropbox

Emuladores para seu sistema operacional

Leitura recomendada

Backup automático em Shell Script

Trabalhar com array no Bash

Cobrando com o SQUID

Programando em Shell Script para iniciantes

Dialog em GTK

  
Comentários
[1] Comentário enviado por fabioarnoni em 31/03/2009 - 22:55h

Legal !!! gostei dos exemplos !! Estou estudando shell Script + python, também acho uma combinação poderosa heheheh Shell é utilidade total pra nós !

[2] Comentário enviado por removido em 01/04/2009 - 09:11h

Em breve! Como colocar este tipo de shell script em uma interface kommander... Ié?

[3] Comentário enviado por rikatz em 01/04/2009 - 18:42h

Só um comentário (nao eh critica nem sugestao, comentario mesmo :P )
Se alguém está pensando em fazer um Shell Script e embuti-lo em um código C para esconder suas instruções, como eu já vi ser feito, pensem que o compilador C trata aquelas instruções como exemplo.
Peguemos a string utilizada pelo autor, e após compilado o fonte, execute o comando "strings programa_compilado":
Um dos trechos expostos é exatamente:

clear; mysql -u root -p123456 -D testes -e ' SELECT * FROM minha_tabela' | less

Ou seja, se alguém tiver algum modo de ocultar essas strings, não é compilando o programa ;P

Sugestoes?

[4] Comentário enviado por stremer em 01/04/2009 - 18:57h

ae...
para esconder as strings de qualquer executavel (binario) é preciso encriptar o arquivo!
No caso do linux o executavel criado pelo C é um binário ELF.
Existe uma ferramente chamada Shiva que faz este trabalho. Infelizmente nunca a usei nem sei se funciona!

Quem tiver tempo de fazer um teste seria bem legal!

[5] Comentário enviado por mslomp em 01/04/2009 - 23:11h

um método braçal para esconder a string:

tomando a string do exemplo:
char comando[] = "clear; mysql -u root -p123456 -D testes -e ' SELECT * FROM minha_tabela' | less";

podemos declará-la no formato hexa, como no exemplo (reparem que adicionei o null (0x00) ao final):

==========================================
#include <stdio.h>

char comando[] = \
{0x63,0x6C,0x65,0x61,0x72,0x3B,0x20,0x6D,0x79,0x73, \
0x71,0x6C,0x20,0x2D,0x75,0x20,0x72,0x6F,0x6F,0x74, \
0x20,0x2D,0x70,0x31,0x32,0x33,0x34,0x35,0x36,0x20, \
0x2D,0x44,0x20,0x74,0x65,0x73,0x74,0x65,0x73,0x20, \
0x2D,0x65,0x20,0x27,0x20,0x53,0x45,0x4C,0x45,0x43, \
0x54,0x20,0x2A,0x20,0x46,0x52,0x4F,0x4D,0x20,0x6D, \
0x69,0x6E,0x68,0x61,0x5F,0x74,0x61,0x62,0x65,0x6C, \
0x61,0x27,0x20,0x7C,0x20,0x6C,0x65,0x73,0x73,0x00};

int main(void)
{
printf("%s\n",comando);
return 0;
}
==========================================

porém, ainda assim é possível enxergarmos a string através de um simples dump, inclusive através do comando strings citado pelo colega acima.
precisamos então que os valores de cada caractere "se percam" do universo de caracteres imprimíveis (que caracterizam uma string literal). ou seja, se nem todos estiverem contidos nesse universo, já não teremos mais uma string, e sim uma "zona".
para obter isso, tomei o menor valor - 0x20 (correspondente ao espaço) - e então peguei um valor arbitrário abaixo* desse (nesse caso, 0x19 - não é 0x20 -1!), e subtraí cada valor hexa desse índice. depois, para reverter, basta somar dinamicamente** 0x19 para cada elemento da cadeia.
* o índice deve ser inferior ao menor valor hexa da string para evitarmos valores negativos.
** para evitar que o gcc por si só otimize a coisa e reconstrua a string, o que estragaria a festa :D

resultado:

==========================================
#include <stdio.h>
#include <string.h>

char comando[] = \
{0x4A,0x53,0x4C,0x48,0x59,0x22,0x07,0x54,0x60,0x5A, \
0x58,0x53,0x07,0x14,0x5C,0x07,0x59,0x56,0x56,0x5B, \
0x07,0x14,0x57,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x07, \
0x14,0x2B,0x07,0x5B,0x4C,0x5A,0x5B,0x4C,0x5A,0x07, \
0x14,0x4C,0x07,0x0E,0x07,0x3A,0x2C,0x33,0x2C,0x2A, \
0x3B,0x07,0x11,0x07,0x2D,0x39,0x36,0x34,0x07,0x54, \
0x50,0x55,0x4F,0x48,0x46,0x5B,0x48,0x49,0x4C,0x53, \
0x48,0x0E,0x07,0x63,0x07,0x53,0x4C,0x5A,0x5A,0x00};

int main(void)
{
int i;
for(i=0;i<strlen(comando);i++)
comando[i] += 0x19;
printf("%s\n",comando);
return 0;
}
==========================================

e então, mesmo em um hex editor, a string não estará tão evidente - o que não é válido para um cracker bem treinado.
pode-se ainda utilizar algo como __attribute__ ((section ("blablabla"))) em nossa variável, a fim de evitarmos que nossa string vá para lugares óbvios no executável, como .bss e .data. isso daria um (pequeno, mas chato) trabalho extra para alguém mal intencionado.

[6] Comentário enviado por removido em 02/04/2009 - 06:14h

;P

[7] Comentário enviado por buruno em 09/04/2009 - 12:18h

|Boa dica mslomp :D


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts