1.
2. Santa prototipagem Tux-man!
3.
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.