Olá Lista !
Seguinte, o termo bad chars, realmente quer dizer que não podem haver
aqueles caracteres, ou que seja bom evita-los. Porém, para elimina-los
do shellcode não se deve apaga-los, parece meio estranho, mas em
resumo é isso.
Aquele null (0x00) pode ser parte de alguma instrução, como "mov
eax,0" ou algo assim, se você remover isso, irá quebrar a instrução
pela metade, e digamos que tenha o seguinte código:
XX 00 mov eax,0
90 nop
Aonde XX é o opcode do move que eu não lembro. Imagina que a instrução
mov, tenha dois bytes, um pra identificar a instrução (o XX ali) e o
outro pra simbolizar o seu valor (0). Se você apagasse o 0x00 logo
após o XX, você teria um mov eax,90. Assim, quebraria a instrução,
alterando a lógica do shellcode, e que realmente só funcionará por um
milagre :)
Para se retirar os bad chars o bom mesmo, não é remover todas as
possibilidades de bad chars na hora da criação do shellcode, mas
somente os mais comuns, como o 0x00 null. O bom é codifica-lo
(encoders do metasploit) dependendo da situação (e dos bad chars) como
o metasploit já faz, assim terás um shellcode mais flexível e que
poderá ser utilizado em mais situações.
Exemplo bem ficticio, existe um servidor http vulneravel a buffer
overflow (veio IIS em suas cabeças agora ? hehehe), quando se faz uma
requisição a uma pagina e um nome de arquivo (não da pasta) é muito
grande ele estoura a memória.
Pseudo código da função vulneravel :
// buff contém a string GET /PASTA/ARQUIVO
char *buff;
// Pega a posição da ultima "/" barra da string da requisição para
saber aonde está
// escrito o nome do arquivo
int index = lastIndexOfChar(buff,"/");
// Cria um array de char e copia a string para ele, sem checar o
tamanho nem nada.
char[1024] tmp;
strcopy(tmp, buff[index+1]);
...
Acho que vocês sacaram ali em cima, se mandar um GET
/PASTA/AAAAAAAAA....... para o server ele irá copiar para dentro de
uma variavel de tamanho fixo (tmp) e se o nome do arquivo tiver mais
de 1024, começaremos a ter um bufferoverlow :)
Ou seja, para chegarmos numa situação que seja possível explorar essa
falha, nosso buffer não pode conter os caracteres de controle, ou que
tenham algum efeito sobre o buffer para que ele não seja completamente
copiado para dentro de tmp. São esses caracteres :
Barra "/" - Pois irá quebrar nosso buffer e nosso shellcode não irá
por completo no strcopy.
Nullos (0x00) - Pois no C, as strings são null-terminateds, ou seja,
um 0x00 no meio do shellcode irá fazer o strcopy para a cópia dele
para a memória quando encontrar esse caracteres (afinal, a string
terminou certo ?)
Quebras de linha (0x0A ou outras quebras de linha que não lembro se
tem) - Pois no http, as headers são quebradas por quebras de linha
(redundância), ou seja, se tiver uma quebra de linha no shellcode, o
servidor exemplo ali iria iria cortar a outra parte do shellcode antes
de colocar na variavel buff.
Com isso espero ter sido claro quanto aos bad chars :) em resumo, são
todo e qualquer caractere que possa interferir para o mal
funcionamento do exploit. Para isso, deve-se analisar o código
vulneravel (e o código de antes de chegar lá) para ver oque se pode ou
não.
Deve-se tirar caracteres de controle de protocolo (Exemplo a quebra de
linha ali do http). Caracteres que podem influênciar em funções como o
strcopy (nulo), etc. Não vi o código desse bof server, mas para
adiantar, olhe como ele lê os dados (se lê uma linha, um tamanho fixo
de bytes de um socket), e como os dados são passados para a função
vulneravel ao buffer overflow (se ela joga para a memória através de
um memcopy, strcopy, etc...).
-cya
2009/8/31 A.A. <
dec...@gmail.com>: