<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4996807388995088672</id><updated>2011-07-30T15:09:45.691-07:00</updated><category term='Da física à informática tuto 1'/><category term='ShellCoding tuto1'/><category term='Automação com CLP tuto1'/><category term='criptografia'/><category term='Windows&apos; underground'/><category term='Cracking'/><title type='text'>Peripécias programáticas</title><subtitle type='html'>Beyond just programming... thinking!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-2426539863390910938</id><published>2009-06-12T10:43:00.000-07:00</published><updated>2009-06-12T10:47:34.231-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows&apos; underground'/><title type='text'>Por baixo dos panos: O Windows e Você!</title><content type='html'>Eu novamente com mais uma série de tutos, mas dessa vez explorando o windows completamente.&lt;br /&gt;Você vai traçar APIs nativas, aventurar-se no ring 0 e eu prometo.. que se uma tela azul aparecer no seu computador por conta de qualquer erro, no final desse tuto você vai depura-la e saber o que causou esse erro.&lt;br /&gt;&lt;br /&gt;Você pra ler esse tuto precisa de conhecimentos intermediário de C e se possível conhecimentos básicos de assembly.&lt;br /&gt;Não tem?&lt;br /&gt;Não leia.&lt;br /&gt;Preguiça de ler?&lt;br /&gt;Não leia pois eu acredito que o tuto todo possa formar mais de 2 ou 3 mil páginas de livro.&lt;br /&gt;&lt;br /&gt;Avisos dados então..&lt;br /&gt;Let's rock! =]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;\---(BASEADO NO WINDOWS XP)---/&lt;/b&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;A primeira parte é sempre teórica.. vo mandar braza.. mora?&lt;br /&gt;Então ta supimpa.&lt;br /&gt;&lt;br /&gt;Um micro-processador possui básicamente quatro estágios.&lt;br /&gt;O windows se aproveita de dois desses estágios.&lt;br /&gt;O primeiro chamado de ring 0(zero) e o quarto chamado de ring 3.&lt;br /&gt;Ao ring0 damos o nome de kernel-mode.&lt;br /&gt;Ao ring3 damos o nome de user-mode.&lt;br /&gt;O windows é um kernel-sided operational system, ou seja, o seu "código principal" está todo em kernel-mode(ring0).&lt;br /&gt;O kernel do windows é o seu núcleo e ele é o dito "código principal" do sistema operacional.&lt;br /&gt;&lt;br /&gt;O que está em user-mode não pode tocar nem ver o que está em kernel mode.&lt;br /&gt;É um conceito bem antigo chamado de sand-box que impede que aplicações usuário danifiquem qualquer componente vital para o funcionamento do sistema. Por isso, se o seu programa der um erro, parar de responder ou qualquer outra coisa.. o sistema operacional será capaz de se recuperar e fechá-lo.&lt;br /&gt;&lt;br /&gt;O micro-processador mantém-se alterando de tempo em tempo entre user-mode e kernel-mode.&lt;br /&gt;Hora executa um trexinho de código daqui e hora executa um trecho de código dali.&lt;br /&gt;O windows usa uma interrupção especial que força o processador a entrar no ciclo de kernel-mode.(ela é usada nas APIs por exemplo)&lt;br /&gt;&lt;br /&gt;Mas o que são APIs?&lt;br /&gt;Vamos voltar ao mundo real um pouquinho e deixar o ring0 e o ring3 de lado por um instante.&lt;br /&gt;&lt;br /&gt;Você tem seu programa codado em C.&lt;br /&gt;O compilador já passou pelos três estágios e gerou seu executável e vamos imaginar que ele só exiba a string "ola mundo!" na tela.&lt;br /&gt;Mas me diga.. como seu programa sabe mostrar na tela as letras que você escreve?&lt;br /&gt;Qual a resolução do seu monitor?&lt;br /&gt;Quais pixels devem ser ascesos?(finjamos que pixels sejam mini-lampadas que ficam na tela do seu pc e que tudo seja tão simples assim)&lt;br /&gt;&lt;br /&gt;É ai que entra o sistema operacional.&lt;br /&gt;Ele faz todo o trabalho de se comunicar com o hardware por você.&lt;br /&gt;&lt;br /&gt;VOCÊ --&gt; HARDWARE --&gt; WINDOWS -&gt; SEU PROGRAMA&lt;br /&gt;&lt;br /&gt;Você não precisa saber qual tipo de monitor está instalado e nem como "ligar" os pixels certos.&lt;br /&gt;Você só diz o que quer escrever e manda o windows fazer o trabalho sujo por você.&lt;br /&gt;Pros oriundos da programação orientada à objetos(POO), isso chama-se encapsulamento.&lt;br /&gt;É a capacidade que um certo componente te dá de trabalhar com ele e com outros meios através dele, sem necessáriamente saber o funcionamento dele ou dos outros meios.&lt;br /&gt;&lt;br /&gt;Pra quem já programou na IDE delphi sabe muito bem que você não precisa saber como a TForm aparece la ou aqueles componentes de envio de email.&lt;br /&gt;Você só envia e ele encapsula toda a forma como as smtp requests são geradas e etc.&lt;br /&gt;&lt;br /&gt;Mas apartir de agora, o que vai nos interessar, é justamente saber o que acontece por baixo dos panos do windows.&lt;br /&gt;&lt;br /&gt;Então, como o printf do seu programa em C chega no hardware de vídeo?&lt;br /&gt;Existem duas metades que se unem para isso acontecer.&lt;br /&gt;O user-mode e o kernel-mode.&lt;br /&gt;Vamos começar entendendo o user-mode.&lt;br /&gt;&lt;br /&gt;O windows disponibiliza essas tais APIs.&lt;br /&gt;Elas fazem várias operações e muitas vezes terminam levando as informações que você passa pra elas pra outras APIs que tratam as informações e por final, levam pra uma ultima API nativa da ntdll que chamará por fim a interrupção que fará o processador passar para ring0(kernel-mode).&lt;br /&gt;&lt;br /&gt;Existem no entanto, algumas APIs que realizam todas as suas operações em user-mode mesmo.(que não acessam o hardware)&lt;br /&gt;Nós conheceremos algumas delas no decorrer do tuto.&lt;br /&gt;&lt;br /&gt;Então, levando em consideração o diagrama anterior, podemos muda-lo mais um pouco para:&lt;br /&gt;&lt;br /&gt;VOCÊ &lt;--&gt; HARDWARE &lt;--&gt; WINDOWS &lt;---&gt; APIs &lt;---&gt; SEU PROGRAMA&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;Bem, eu vou ficar por aqui porque se não o pessoal fica com preguiça de ler..&lt;br /&gt;&lt;br /&gt;O windows possui muitas coisas interessantes que poucas pessoas sabem, como um sub-sistema que por exemplo, é feito para permitir a compatibilidade com programas nix like.(interoperabilidade)&lt;br /&gt;&lt;br /&gt;Vamos com o tempo conhecer isso tudo e entender porque no meu ponto de vista, o windows ainda é o sistema operacional mais completo existente.&lt;br /&gt;&lt;br /&gt;Cya'round. =]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-2426539863390910938?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/2426539863390910938/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2009/06/por-baixo-dos-panos-o-windows-e-voce.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/2426539863390910938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/2426539863390910938'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2009/06/por-baixo-dos-panos-o-windows-e-voce.html' title='Por baixo dos panos: O Windows e Você!'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-1904201446057378452</id><published>2009-04-15T19:31:00.000-07:00</published><updated>2009-04-15T19:34:31.756-07:00</updated><title type='text'>A enganação do décimo terceiro salário</title><content type='html'>Contudo, a mais escandalosa de todas as mentiras nacionais e justamente aquela que burramente os trabalhadores mais acreditam, é a safada invenção do Décimo Terceiro salário. Para os meus 38 leitores, que certamente foram muito além do curso primário, eis aqui uma modesta demonstração aritmética de como é fácil novamente enganar os trabalhadores.&lt;br /&gt;&lt;br /&gt;Suponhamos que você ganha 400 Reais por mês. Multiplicando-se esse salário por doze meses, temos ao fim do ano R$4.800.00. Quando chega o Natal, o generoso e cristão patrão manda então pagar-lhe o conhecido Décimo Terceiro Salário ( de mais R$400.00 que somados ao que você recebeu no ano inteiro somam R$5.200.00) e você vai para casa todo feliz com o saboroso sorriso matreiro do patrão. Agora veja bem o que acontece quando o empregado, ao invés de ouvir as catilinárias dos Lulas e dos Vicentinhos, procura um simples professor de aritmética do Primeiro Grau e que lhe ensina que você sabiamente faça o seguinte :&lt;br /&gt;&lt;br /&gt;Você vai ao seu patrão e lhe diz : Patrão, lamentavelmente meu salário é pequeno e como eu tenho que pagar contas de luz e gás durante esse período e não posso esperar até o fim desse mês para pagar contas atrasadas, rogo-lhe que, como meu salário é de R$400.00 mensais, pague-me R$100.00 por semana (o que dá na mesma coisa – 4 semanas a R$100.00 somam R$400.00 ). O distraído patrão concorda ( concorda porque por vezes ele também pode ser burro) e assim fica tudo acertado e você volta para casa tranquilo, porque afinal de contas seu patrão fez-lhe apenas um modesto favor que não lhe custa nada.&lt;br /&gt;&lt;br /&gt;Mas aí é que está o engano. E eu pergunto aos meus 38 leitores: Quantas semanas tem um ano ? Resposta inteligente : 52 semanas! Já percebeu a jogada ? Ora, se o patrão lhe paga R$100.00 por semana ( ou seja R$400.00 por mês conforme vimos) multiplicando-se esse valor por 52 semanas, temos – voilá ! – R$5.200.00 ! Surpresa surpresa ? Onde está portanto o 13 Salário ? A explicação é simples, embora os nossos conhecidos líderes trabalhistas nunca se tenham dado conta desse fato simples.&lt;br /&gt;&lt;br /&gt;A resposta é que o patrão lhe rouba uma parte do salário durante todo o ano, pela simples razão de que há meses com 30 dias, outros com 31 e também meses com cinco semanas. Pagando-lhe mensalmente, portanto, esse patrão sabido se apodera de um dinheiro que não lhe pertence e isso porque o salário é o mesmo tenha o mês cinco semanas, trinta ou trinta e um dias e depois, com um sorriso de crocodilo lhe presenteia um décimo terceiro, dinheiro que saiu do próprio bolso do trabalhador. Por outro lado, não tenham meus 38 leitores nenhuma dúvida da precisão da informação que explico nesta matéria, pela razão elementar de que, em 1945 acompanhei de perto a habilidade política e matreira do meu falecido e simpático amigo, o deputado Aarão Steinbruck de Niteroi, que com essa gloriosa mentira conseguiu se eleger várias vezes. Daí que, como palavra final para meus inteligentes 38 leitores, ai estão as duas maravilhosas mentiras nacionais. Não caiam no conto do vigário. Não existe nenhum Décimo Terceiro. O patrão apenas lhe devolve o que sorrateiramente lhe surrupiou do salário anual. Que é o que explica porque, quando da votação do projeto Steinbruck, a lei foi aprovada rapidamente pelos patrióticos deputados a serviço da classe dirigente de então, que é a mesma que hoje comanda nosso delicioso Brasil.&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;Texto escrito por: Mario GiuDicelli&lt;br /&gt;Publicado &lt;a href="http://www.englishexperts.com.br/2007/03/05/a-incrivel-safadagem-do-decimo-terceiro-salario/"&gt;aqui.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-1904201446057378452?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/1904201446057378452/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2009/04/enganacao-do-decimo-terceiro-salario.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/1904201446057378452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/1904201446057378452'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2009/04/enganacao-do-decimo-terceiro-salario.html' title='A enganação do décimo terceiro salário'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-7672221570546818707</id><published>2009-01-11T12:20:00.000-08:00</published><updated>2009-01-11T12:59:32.385-08:00</updated><title type='text'>Da física à informática! parte 3</title><content type='html'>&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Rutherford_atom.svg/250px-Rutherford_atom.svg.png"&gt;&lt;br /&gt;ps: elétrons são os vermelhos e o núcleo está em preto&lt;br /&gt;&lt;br /&gt;A descoberta dos protons e eletrons(que ocorreu primeiro), foi uma revolução para a estrutura atômica.&lt;br /&gt;E atualmente diz-se que os elétrons ficam do lado de fora do núcleo do âtomo, e os protons do lado de entro.&lt;br /&gt;&lt;br /&gt;Os eletrons orbitam(giram em torno de) o núcleo do átomo em uma alta velocidade.&lt;br /&gt;&lt;br /&gt;Bem, qualquer coisa que gira cria uma certa força sobre si que parte do centro do circulo imáginário formado pela rotação, para fora em direção ao objeto.&lt;br /&gt;&lt;br /&gt;Essa força se chama força centrífuga... é a mesma força que empurra você contra os bancos do carrinho em uma montanha-russa quando está dentro de um loop.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_OnbIHP6cgQ8/SWpdjn0B2LI/AAAAAAAAAA0/Uhyy1shX5Qs/s1600-h/DFAI3_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 289px;" src="http://4.bp.blogspot.com/_OnbIHP6cgQ8/SWpdjn0B2LI/AAAAAAAAAA0/Uhyy1shX5Qs/s400/DFAI3_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290143578864081074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A física é aplicada à todos os seres e objetos, inclusive aos elétrons.&lt;br /&gt;Então se eles se mantém girando em uma órbita infinita.. o que os mantém dentro da orbita de um átomo?&lt;br /&gt;&lt;br /&gt;Os prótons!&lt;br /&gt;&lt;br /&gt;Os prótons dentro do núcleo "seguram" os elétrons dentro da sua órbita semi-constante.&lt;br /&gt;Que não são completamente puxados para uma colisão com o núcleo por conta da força centrífuga.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mas calma ae, protóns seguram os elétrons como?&lt;br /&gt;&lt;br /&gt;Vamos entender isso, mas como a informação é bem chatinha mesmo, vou ficar por aqui..&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Clique aqui para ler a continuação&lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-7672221570546818707?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/7672221570546818707/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2009/01/da-fsica-informtica-parte-3.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/7672221570546818707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/7672221570546818707'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2009/01/da-fsica-informtica-parte-3.html' title='Da física à informática! parte 3'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_OnbIHP6cgQ8/SWpdjn0B2LI/AAAAAAAAAA0/Uhyy1shX5Qs/s72-c/DFAI3_1.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-3996175188883192149</id><published>2009-01-05T18:22:00.000-08:00</published><updated>2009-01-05T18:45:16.418-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Automação com CLP tuto1'/><title type='text'>Automação com CLP(controle lógico programável)</title><content type='html'>Eu acredito que o CLP seja o dispositivo mais odiado da história industrial.&lt;br /&gt;Sabe quando aquele chefe tem milhares de funcionários para colocar tampas em canetas, embalá-las e depois mada-las para à venda?&lt;br /&gt;&lt;br /&gt;Bem, acontece que um dia, a procura aumenta.. o que significa que a oferta também precisa fazer o mesmo.&lt;br /&gt;Mas como se os funcionários são limitados?&lt;br /&gt;Contratar mais funcionários?&lt;br /&gt;&lt;br /&gt;Contratar mais funcionários é uma tarefa delicada, porque não são só os funcionários que precisam ser contratados.&lt;br /&gt;Você precisa calcular despesas, você precisa contratar chefes e supervisores para essa gente toda e além de tudo, mais funcionários significam, maiores riscos de acidentes de trabalho.&lt;br /&gt;&lt;br /&gt;Nesse ponto, ele resolve trocar homens por máquina.. e é ai que muitos perdem seus empregos.&lt;br /&gt;&lt;br /&gt;Uma máquina faz mais rápido, mais precisamente e com menores custos, qualquer coisa que um homem faça.&lt;br /&gt;Isso é, qualquer trabalho físico.&lt;br /&gt;&lt;br /&gt;Cabe então à nós; pensar, e à elas; fazer.&lt;br /&gt;&lt;br /&gt;Quando chefe de uma empresa resolve trocar seus milhares de homens por uma única máquina automatizada, essa decisão tende à afetar muitas pessoas.&lt;br /&gt;Mas também não é culpa d'ele que seus funcionários não se atualizem.&lt;br /&gt;&lt;br /&gt;O fato é, quando não se pode vencê-las.. Junte se a elas.&lt;br /&gt;Então, para quê batalhar com as máquinas em uma luta já perdida?&lt;br /&gt;Apenas aprenda à controlá-las.&lt;br /&gt;&lt;br /&gt;E é isso que você aprenderá nessa série.&lt;br /&gt;&lt;br /&gt;Você não precisa só automatizar máquinas enormes, você pode automatizar qualquer circuito elétrico.&lt;br /&gt;Até mesmo, os aparelhos eletrônicos da sua casa.&lt;br /&gt;Rádios, televisões, tudo!&lt;br /&gt;&lt;br /&gt;E aqui, você vai entender como.&lt;br /&gt;Let's have some fun..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-3996175188883192149?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/3996175188883192149/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2009/01/automao-com-clpcontrole-lgico.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/3996175188883192149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/3996175188883192149'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2009/01/automao-com-clpcontrole-lgico.html' title='Automação com CLP(controle lógico programável)'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-4704608039929938337</id><published>2008-12-30T04:15:00.000-08:00</published><updated>2009-01-11T12:51:09.179-08:00</updated><title type='text'>Da física à informática! parte 2, Conceitos Básicos.</title><content type='html'>É, agora a parte pesada começa.&lt;br /&gt;Nós vamos começar revendo alguns conceitos básicos que você deve ter aprendido na quinta ou sexta série do ensino fundamental.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;Uma característica muito importante de qualquer animal, é a curiosidade.&lt;br /&gt;Ela tem nos levado a lugares e descobertas.&lt;br /&gt;&lt;br /&gt;Bem, uma das maiores curiosidades do homem, sempre foi saber do que algo é feito.&lt;br /&gt;Se nós temos um muro, e o quebramos, nós descobrimos que ele é feito de tijolos.&lt;br /&gt;Se quebrarmos os tijolos, descobriremos que eles são feitos de argila.&lt;br /&gt;&lt;img src="http://www.conscienciacosmica.com.br/images/aquarela-muro.gif"&gt;&lt;br /&gt;&lt;br /&gt;Mas a grande pergunta é, até onde podemos quebrar algo para encontrar sua matéria prima?&lt;br /&gt;Será que existe um fim para esse processo?&lt;br /&gt;Será que existe um ponto em que não se possa mais quebrar algo?&lt;br /&gt;&lt;br /&gt;A resposta é sim e não.(?!)&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt; O ÁTOMO&lt;/b&gt;&lt;br /&gt;&lt;img src="http://www.adorofisica.com.br/trabalhos/alkimia/atomo.gif"&gt;&lt;br /&gt;&lt;br /&gt;Os gregos foram os primeiros a admitir que existia um fim para esse ciclo.&lt;br /&gt;Um ponto aonde um determinado objeto não poderia ser mais quebrado.&lt;br /&gt;Uma particula única, indivisível(não quebrável) que seria a matéria prima de todas as matérias primas.(o0)&lt;br /&gt;A partícula única comum a todos os seres.&lt;br /&gt;Essa partícula(estrutura?) recebeu o nome de átomo.&lt;br /&gt;&lt;br /&gt;O que eles propuseram foi que, tudo, absolutamente tudo, fosse feito de átomos.&lt;br /&gt;Da lã daquela camisa feia que você ganhou de natal ao plástico do copo descartável cheio de cana-de-açúcar("caldo de cana") que você compra todo dia naquela pastelaria dos "chinas".&lt;br /&gt;Até mesmo você!&lt;br /&gt;&lt;br /&gt;"Leitor: Mas espera ai!&lt;br /&gt;Leitor: Se tudo é feito de átomos, como tudo parece tão diferente?"&lt;br /&gt;&lt;br /&gt;É ai que a química entra.&lt;br /&gt;&lt;br /&gt;Vê aquela imagem ali em cima?&lt;br /&gt;O átomo é teoricamente, a esfera central.&lt;br /&gt;&lt;br /&gt;E as outras, o que são?&lt;br /&gt;Para os gregos, naquela época, elas não existiam, somente o átomo central existia.&lt;br /&gt;De fato, até meados do século 19, esse conceito perdurou até que admitiu-se a existencia de partículas menores ainda que o próprio átomo.&lt;br /&gt;&lt;br /&gt;Essas partículas seriam entituladas: elétrons, neutrons e prótons..&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt; &lt;a href="http://sergaralho.blogspot.com/2009/01/da-fsica-informtica-parte-3.html"&gt;Clique aqui para ler a continuação&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-4704608039929938337?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/4704608039929938337/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/12/da-fsica-informtica-parte-2-conceitos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/4704608039929938337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/4704608039929938337'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/12/da-fsica-informtica-parte-2-conceitos.html' title='Da física à informática! parte 2, Conceitos Básicos.'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-1022056380652640231</id><published>2008-10-20T09:00:00.000-07:00</published><updated>2008-12-30T04:50:25.513-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Da física à informática tuto 1'/><title type='text'>Da física à informática! parte 1 - introdução</title><content type='html'>&lt;p&gt;Você já parou para olhar em volta?&lt;/p&gt;&lt;p&gt;O mundo muda e não é mais o que já foi.&lt;/p&gt;&lt;p&gt;Não, isso não é filosofia, é a realidade.&lt;/p&gt;&lt;p&gt;Uma realidade que se torna cada vez mais comum em nossas vidas, a tecnologia!&lt;/p&gt;&lt;p&gt;Neste momento eu mesmo estou escrevendo de um notebook.&lt;/p&gt;&lt;p&gt;Talvez você não tenha um notebook, mas deve ter uma televisão, um aparelho de dvd.. um celular?&lt;/p&gt;&lt;p&gt;Se sim, então você já faz parte do novo mundo em que as máquinas realizam e os homens pensam.&lt;/p&gt;&lt;p&gt;Mas você nunca parou para se perguntar como tudo isso pôde acontecer?&lt;/p&gt;&lt;p&gt;Como será que seu televisor funciona?&lt;/p&gt;&lt;p&gt;Como aquele programa em C++ que você codifica todo dia pode existir de verdade?&lt;/p&gt;&lt;p&gt;Não estou falando sobre kerneis de sistemas operacionais, nem tipos de memória.&lt;/p&gt;&lt;p&gt;Eu estou falando de algo mais profundo e antigo que a própria informática, que a tecnologia que nos rodeia... a física!&lt;/p&gt;&lt;p&gt;Sim, ela é a mãe de todas as ciências e nessa série você poderá aprender como a física gera a eletrônica, como a eletrônica gera a micro-eletrônica e como a micro-eletrônica gerou os primeiros computadores.&lt;/p&gt;&lt;p&gt;Você vai conhecer aonde tudo a sua volta se liga, de que forma sua televisão pode existir, de que forma você pode usar radio frequencias.&lt;/p&gt;&lt;p&gt;Mais do que aprender sobre a estrutura de um micro-processador é saber como ele é construído.&lt;/p&gt;&lt;p&gt;Já pensou em fazer robôs?&lt;/p&gt;&lt;p&gt;Nunca se perguntou como são feitos?&lt;/p&gt;&lt;p&gt;Eles também possuem micro-processadores, alguns bem parecidos com o que você tem em seu computador caseiro!&lt;/p&gt;&lt;p&gt;Nessa série, nós vamos quebrar as barreiras dos softwares e partir para um ponto em que tudo é possível.&lt;/p&gt;&lt;p&gt;Partiremos da física, exemplos eletrônicos, montar placas de circuitos, montar nossos mini-robos, manutenção de eletro-domésticos e por fim chegaremos na informática e então, você saberá como tudo isso foi possível, graças a pessoas capacitadas e autruístas.&lt;/p&gt;&lt;p&gt;Nós, como seres pensantes não precisamos ser subjulgados por nenhuma máquina, porque nós às criamos.&lt;/p&gt;&lt;p&gt;Saberemos o que um computador faz desde à sua essencia até o nosso software programado em uma IDE.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt; &lt;a href="http://sergaralho.blogspot.com/2008/12/da-fsica-informtica-parte-2-conceitos.html"&gt;Clique aqui para ler a continuação&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-1022056380652640231?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/1022056380652640231/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/10/da-fsica-informtica-parte-1-introduo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/1022056380652640231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/1022056380652640231'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/10/da-fsica-informtica-parte-1-introduo.html' title='Da física à informática! parte 1 - introdução'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-8482514467008856046</id><published>2008-10-19T10:15:00.000-07:00</published><updated>2008-10-20T04:50:47.389-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cracking'/><title type='text'>ShellCoding parte 3 &gt; 3.2 Um novo debugger, um novo ponto de vista... o mesmo programa. &gt; 3.3 A base dos Shellcodes</title><content type='html'>O que me levou ao ollydbg foi a sua simplicidade... eu sou mais familiarizado com outro debugger, o windbg.&lt;br /&gt;Apesar dele ser “mais complexo”, foi o primeiro que eu aprendi a mexer por influencia de alguns amigos, uma ótima influência.&lt;br /&gt;&lt;br /&gt;O ollydbg é bem simples, mas nós somos machos certo?*coça o saco*&lt;br /&gt;Então vamos mostrar como somos machos e que não temos medo de cara/interface feia e vamos aprender a mexer um pouco no windbg =]&lt;br /&gt;Eu não me sentiria bem se passasse esse tutorial todo sem pelo menos fazer um “overview” do windbg... e aqui está ele. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O windbg é muito poderoso e é usado pelo próprio time de programadores da Microsoft entre outras coisas, para desenvolver o Windows!&lt;br /&gt;&lt;br /&gt;Sim, ele permite a depuração de drivers e afins.&lt;br /&gt;&lt;br /&gt;Algumas afirmações que eu fiz para vocês, foram bem mastigadas, muito mesmo.&lt;br /&gt;Agora vamos usar esse debugger poderoso para complementar essas informações.&lt;br /&gt;&lt;br /&gt;Ele é gratuito e você não terá que gastar nenhum centavo, apenas alguns minutos fazendo o download do pacote de debugging da Microsoft.&lt;br /&gt;Onde encontrá-lo?&lt;br /&gt;Aqui:&lt;br /&gt;http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx&lt;br /&gt;&lt;br /&gt;Escolha a instalação com base na versão do SO que você tem(32 ou 64 bits).&lt;br /&gt;Instale.&lt;br /&gt;&lt;br /&gt;O pacote vem com entre outros aplicativos, o logger que é usado para identificar quais APIs um programa está usando, logview utilizado para visualizar os logs gerados pelo logger.exe ,KD que é um kernel debbuger e etc... por último mas não menos importante o windbg, o pacote também vem com outros debuggers user-mode application como o CDB mas não entraremos em detalhes. &lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Agora, abra o windbg na pasta que você instalou o pacote de debugging tools for Windows.&lt;br /&gt;Você vai ter uma tela meio feinha de começo com somente a command bar à mostra.&lt;br /&gt;&lt;br /&gt;O que você vai fazer é pressionar “CTRL + E” e abrir aquele assembly program que nós debugamos com o olly, se lembra?&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Imediatamente ele nos mostra os módulos carregados e o estado dos registradores.(módulo é de certa forma só um outro nome para image file names(nome das “imagens” de arquivos /carregados/)&lt;/p&gt;&lt;p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img169.imageshack.us/img169/6260/windbg1lm9.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Existe um módulo em especial que sempre será carregado, é a DLL Kernel32.&lt;br /&gt;Todos os programas que você tentar debuggar verá que essa DLL está presente.&lt;br /&gt;&lt;br /&gt;Você quer saber por que isso te interessa?&lt;br /&gt;&lt;br /&gt;Quando um processo é iniciado, o Windows cria um tipo de “header” para o processo.&lt;br /&gt;Esse header se chama PEB(process enviroment block)¹.&lt;br /&gt;Nele estão contidas todas as informações de um processo, inclusive os módulos carregados por ordem de loading.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Para nós, o conhecimento desse bloco é importante pois no Windows, nossos exploits precisam chamar APIs diferentemente de sistemas nix like que podemos chamar diretamente sys calls que estão sempre paradinhas la esperando por você, no entanto nós nem sempre sabemos o endereço em que uma DLL foi carregada e queremos que nosso exploit chame uma função da user32 por exemplo, o que fazemos?!&lt;/p&gt;&lt;p&gt;Bem como o kernel32 é sempre carregado e é um dos primeiros módulos carregados, ele está sempre no mesmo lugar dentro do PEB de um processo.&lt;br /&gt;&lt;/p&gt;E esse módulo tem duas APIs importantíssimas para podermos usar qualquer uma que quisermos... São as LoadLibrary* e GetProcessAdress* que respectivamente carregam um módulo e pegam o endereço de uma API contida nele.&lt;br /&gt;&lt;br /&gt;Mas você ainda não vai construir um exploit agora... só que a partir de agora, as informações que antes eu disse que foram “filtradas/mastigadas” não serão mais tão mastigadas, então se prepare para uma enxurrada controlada de nomes estranhos aparecendo na sua tela. =P&lt;br /&gt;&lt;br /&gt;¹:http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img169.imageshack.us/img169/6260/windbg1lm9.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;Voltemos ao Windbg com nosso tuto.exe carregado, aperte “ALT + F7” para ver o disassembly.&lt;br /&gt;E repare em uma coisa, nós estamos antes mesmo do programa começar, esse não é o código do nosso processo!&lt;br /&gt;Então cadê ele?&lt;br /&gt;&lt;br /&gt;O Windows ainda está por chamar o nosso programa mas se quisermos encontrar aonde começa o código dele é simples... vamos encontrar o entry point do módulo tuto.exe.&lt;br /&gt;&lt;br /&gt;Entry point é basicamente aonde o código do programa começa, ele denota a parte do image file para o qual nós iremos dar um long jump, ou seja, a primeira função executada de um determinado processo.&lt;br /&gt;Hoje em dia é normal que os programas só tenham um entry point, por exemplo o int WinMain() que nós vemos todo dia em nossos programas win app C++/C.&lt;br /&gt;&lt;br /&gt;Image File ou imagem do arquivo, é a imagem que é criada na memória de um determinado arquivo.&lt;br /&gt;Quando você executa um determinado programa, por exemplo, o nosso tuto.exe, o Windows copia ele todo para a memória, essa cópia ganha o nome de image file.&lt;br /&gt;&lt;br /&gt;Mas não para por ai, não pense que memória é sinônimo de memória RAM física não.&lt;br /&gt;&lt;br /&gt;Cada processo tem uma determinada quantidade de memória que é chamada de memória virtual.&lt;br /&gt;Essa memória virtual é endereçável(lógico) mas o seu endereço é relativo, ou seja, nem sempre corresponde ao endereço REAL na memória física.&lt;br /&gt;Isso quer dizer que uma variável de um programa pode estar claramente no endereço 0x0012ffaa, outro programa ter uma variável no mesmo endereço e no entanto, elas podem sim ter valores diferentes... isso porque os processos(normalmente) não compartilham sua memória virtual com outros, eles podem ter claramente o mesmo endereço virtual, sendo que o endereço virtual é mapeado(transformado) para um físico no momento de execução do processo.&lt;br /&gt;Cada processo pode ter até 2GB de memória virtual, mas nem toda ela é alocável, parte é reservada pelo sistema e os endereços vão de 0x00000000e16 à 0x7FFFFFFFe16.(‘e16’ é notação científica)&lt;br /&gt;&lt;br /&gt;Lembra-se que eu disse que a stack poderia chegar ao endereço 0x00 e o sistema falaria que falta memória?&lt;br /&gt; Aquilo ajudou a entender que a memória cresce do maior endereço para o menor, mas eu coloquei aquele “hipoteticamente falando” justamente porque isso não é possível, o endereço virtual 0x00 é reservado para o sistema e se sobrescrito possivelmente quebra o programa.&lt;br /&gt;E sim, no win32 a stack faz parte da memória virtual de um processo e hoje em dia tem fronteiras bem definidas ao contrário das suas antigas versões.&lt;br /&gt;&lt;br /&gt;O mundo era mais bonito quando o céu só podia ser azul não é?&lt;br /&gt;&lt;br /&gt;Mas a vida real não é assim e as coisas são mais complicadas do que isso, então se concentre e não perca o foco porque eu ainda não comecei a parte mais complicada.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Aprendemos o que é o entry point, então vamos achá-lo?&lt;br /&gt;&lt;br /&gt;O windbg vem com várias extensões muito úteis e vamos usar uma delas.&lt;br /&gt;Na command bar digite “!dlls”.&lt;br /&gt;Pronto!&lt;br /&gt;Agora você está vendo informações específicas dos módulos carregados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img169.imageshack.us/img169/6919/windbg2cd1.jpg" border="0" alt="" /&gt;&lt;br /&gt;E está ai também o entry point do tuto.exe certo?&lt;br /&gt;Então já sabemos seu endereço(401000), vamos colocar um breakpoint nesse endereço e mandar o windbg deixar o programa correr livre leve e solto até encontrar o que nós queremos.&lt;br /&gt;&lt;br /&gt;Digite .cls para limpar a tela(so fresco mesmo =P)&lt;br /&gt;Agora digite:&lt;br /&gt; &lt;br /&gt;BP /1 401000 “.echo =============|| ENTRY POINT ||=================” [enter]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BP, seta um breakpoint.&lt;br /&gt;/1 diz que assim que esse break point for executado uma vez, ele será deletado.&lt;br /&gt;401000 é o endereço.&lt;br /&gt;O que segue entre aspas é o comando que será executado quando esse breakpoint for encontrado.&lt;br /&gt;No nosso caso, o echo vai exibir a string “...ENTRY P...” na tela.&lt;br /&gt;&lt;br /&gt;Se aparecer o status “busy” ao lado da command bar, espere até o status voltar ao normal.&lt;br /&gt;&lt;br /&gt;Agora digite ‘g’(sem aspas) que  significa “oh baby, let’s Go” ou  só “GO” se você preferir. =P&lt;br /&gt;&lt;br /&gt;Ele vai rodar e vai para justamente aonde começa o nosso código tão conhecido. =]&lt;br /&gt;&lt;p&gt;(posteriormente você poderá substituir essa ação toda por "g @$exentry")&lt;/p&gt;&lt;p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img363.imageshack.us/img363/1680/windbg3am3.jpg" border="0" alt="" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.3 A base dos Shellcodes.&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Novo capítulo, mas nós vamos continuar com aquele nosso debugger(windbg) e no ponto aonde paramos, mas desta vez, a idéia não é explicar o que vai acontecer com o programa e sim entender talvez o último ponto necessário para começarmos a construir nossos exploits.&lt;br /&gt;&lt;br /&gt;Só para recapitular:&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img363.imageshack.us/img363/1680/windbg3am3.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A primeira coisa que quero que você faça após encontrar o entry point de tuto.exe é apertar f10, o debugger vai dar uma “passo” a frente colocando 00000008 na stack.&lt;br /&gt;Ok, isso nós já sabemos.&lt;br /&gt;O windbg já mostra o estado dos registradores, a próxima instrução a ser executada e etc, normal.&lt;br /&gt;&lt;br /&gt;Vamos agora fazer um dump ou seja, ver o valor que está em certo local da memória virtual do nosso processo.&lt;br /&gt;&lt;br /&gt;A função ‘d’ do windbg é responsável por fazer o dump da memória virtual de um processo.&lt;br /&gt;Ela funciona com diferentes tamanhos.&lt;br /&gt;Por exemplo, se você escrever ‘db *endereço*’ ela vai te mostrar o dump hexadecimal em bytes(8 bits) do endereço desejado.&lt;br /&gt;&lt;br /&gt;Bem, nós sabemos que esp aponta para o topo da stack certo?&lt;br /&gt;Então como nós já sabemos que o 0~8 já deve estar na stack, vamos ver essa função em ação passando para ela o endereço que está em esp.&lt;br /&gt;&lt;br /&gt;Digite ‘dd esp’ e logo você verá isso:&lt;br /&gt;0012ffa0  00000008 76373833 7ffdd000 0012ffec&lt;br /&gt;0012ffb0  77a5a9bd 7ffdd000 00129e72 00000000&lt;br /&gt;0012ffc0  00000000 7ffdd000 00000000 00000000&lt;br /&gt;0012ffd0  00000000 0012ffb8 00000000 ffffffff&lt;br /&gt;0012ffe0  77a28bf2 77a69096 00000000 00000000&lt;br /&gt;0012fff0  00000000 00401000 7ffdd000 00000000&lt;br /&gt;00130000  78746341 00000020 00000001 00003008&lt;br /&gt;00130010  000000dc 00000000 00000020 00000000&lt;br /&gt;&lt;br /&gt;Percebe o 8 no topo?&lt;br /&gt;Repare que dd faz ele exibir em Double words ou seja, de 32 em 32 bits ou 8 caracteres hexadecimais/4 bytes.&lt;br /&gt;&lt;br /&gt;Repare também que ele exibe 5 colunas, a primeria é o endereço do valor da segunda coluna na memória vitual do processo.&lt;br /&gt;&lt;br /&gt;Nós podemos obrigá-la a exibir apenas uma coluna, assim:&lt;br /&gt;&lt;br /&gt;‘dd /c 1 esp’&lt;br /&gt;Assim nós visualizaremos como se estivéssemos no ollydbg, de quatro em quatro bytes e seus respectivos endereços ao lado.&lt;br /&gt;&lt;br /&gt;0012ffa0  00000008&lt;br /&gt;0012ffa4  76373833&lt;br /&gt;0012ffa8  7ffdd000&lt;br /&gt;0012ffac  0012ffec&lt;br /&gt;0012ffb0  77a5a9bd&lt;br /&gt;0012ffb4  7ffdd000&lt;br /&gt;0012ffb8  00129e72&lt;br /&gt;0012ffbc  00000000&lt;br /&gt;0012ffc0  00000000&lt;br /&gt;0012ffc4  7ffdd000&lt;br /&gt;0012ffc8  00000000&lt;br /&gt;0012ffcc  00000000&lt;br /&gt;0012ffd0  00000000&lt;br /&gt;0012ffd4  0012ffb8&lt;br /&gt;0012ffd8  00000000&lt;br /&gt;0012ffdc  ffffffff&lt;br /&gt;0012ffe0  77a28bf2&lt;br /&gt;0012ffe4  77a69096&lt;br /&gt;0012ffe8  00000000&lt;br /&gt;0012ffec  00000000&lt;br /&gt;0012fff0  00000000&lt;br /&gt;0012fff4  00401000&lt;br /&gt;0012fff8  7ffdd000&lt;br /&gt;0012fffc  00000000&lt;br /&gt;00130000  78746341&lt;br /&gt;00130004  00000020&lt;br /&gt;00130008  00000001&lt;br /&gt;0013000c  00003008&lt;br /&gt;00130010  000000dc&lt;br /&gt;00130014  00000000&lt;br /&gt;00130018  00000020&lt;br /&gt;0013001c  00000000&lt;br /&gt;&lt;br /&gt;Nós podemos visualizar de byte em byte ao invés de 4 em 4 como antes.&lt;br /&gt;Usando o db como foi dito antes e podemos ainda mais, podemos dizer apartir de qual endereço da memória nós queremos ver e até qual.&lt;br /&gt;Assim:&lt;br /&gt;‘db esp esp+3’&lt;br /&gt;0:000&gt; db esp esp+3&lt;br /&gt;0012ffa0  08 00 00 00&lt;br /&gt;&lt;br /&gt;Ou seja, ele vai exibir esp(12ffa0) até esp+3(12ffa43) em outras palavras ele vai exibir o &lt;br /&gt;12ffa0&lt;br /&gt;12ffa1&lt;br /&gt;12ffa2&lt;br /&gt;12ffa3&lt;br /&gt;&lt;br /&gt;Ou seja, um double Word(4 bytes) só que de byte em byte.&lt;br /&gt;&lt;br /&gt;Agora, se lembra que eu falei que as instruções asm são representações para os opcodes¹ e que esses sim é que rodam e fazem algo?&lt;br /&gt;Bem, o programa já foi compilado e esses opcodes já estão na memória virtual do processo,  o disassembly só reconverte esses opcodes para código asm novamente o que não é nada difícil.&lt;br /&gt;&lt;br /&gt;¹: tem um tuto mto bom que explica como são feitos, ele foi feito pelo alucard e está aqui&gt;http://alucard.dxs.googlepages.com/Tutorial_OpCode.html&lt;br /&gt;&lt;br /&gt;Bem, se esses opcodes estão no endereço em que vemos o disassembly, então nós podemos “ripalos”.&lt;br /&gt;Ou seja, nós podemos ver quais são esses opcodes e colocar em outro programa.&lt;br /&gt;&lt;br /&gt;Vamos dumpar todo o código do nosso tuto.exe.&lt;br /&gt;&lt;br /&gt;Digite ‘dd 401000 40100b’&lt;br /&gt;&lt;br /&gt;401000 é o endereço do entry point do nosso módulo como já vimos, e 40100b é o endereço da sua última instrução(ret).&lt;br /&gt;A saída desse dump é:&lt;br /&gt;00401000  ffb9086a 49ffffff c358fd75&lt;br /&gt;&lt;br /&gt;A primeira coluna é um endereço como já sabemos e as 3 seguintes são o dump dessa área da memória.&lt;br /&gt;&lt;br /&gt;Se lembra que nosso programa põe o 8 na stack e depois o coloca em eax?&lt;br /&gt;Se lembra que eu também disse que eax é usado para retornar valores de funções.&lt;br /&gt;&lt;br /&gt;Logo, imagine esse código:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int soma()&lt;br /&gt;{&lt;br /&gt; int eax = 8, ecx = 0xFFFFFFFF;&lt;br /&gt; for(;ecx&gt;0;ecx--);&lt;br /&gt; return eax;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Pois bem, o nosso programa é a completa representação desse código C.&lt;br /&gt;&lt;br /&gt;Ele põe 8 na stack, cria um loop de 0xFFFFFFFF até 0x00(uma espécie de delay hardcoded) põe 8 em eax e ret retorna para o ponto aonde o processo chamador parou tirando da stack o endereço pra próxima instrução e colocando em eip, como eax é usado para retornar valores e resultados de funções então logo a nossa função retorna um número, o 8.&lt;br /&gt;&lt;br /&gt;Bem, nós já temos os opcodes, que tal colocarmos ele em um programa e ver se roda? &lt;br /&gt;&lt;br /&gt;Bem, vamos primeiro visualizá-lo como um programa C completo:&lt;br /&gt;&lt;br /&gt;#include  stdio.h&lt;stdio h=""&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int soma()&lt;br /&gt;{&lt;br /&gt;    int eax = 8, ecx = 0xFFFFFFFF;&lt;br /&gt;&lt;br /&gt;    for (;ecx &gt; 0; ecx--);&lt;br /&gt;&lt;br /&gt;    return eax;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    printf("Valor: %d", soma() );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Isso nós já sabemos né?&lt;br /&gt;&lt;br /&gt;Então que tal colocarmos aqueles opcodes e ver se tem o mesmo resultado?&lt;br /&gt;&lt;br /&gt;Vamos fazer isso, repare que temos 3 colunas de 4 bytes de dados.&lt;br /&gt;4 bytes = int&lt;br /&gt;&lt;br /&gt;Então vamos criar um array de 3 int’s e vamos forçar o nosso programa C a chamá-lo como se fosse uma função...&lt;br /&gt;&lt;br /&gt;Primeiro vamos copiar essas 3 colunas de opcodes e transformar em um array de ints.&lt;br /&gt;&lt;br /&gt;int OpCodes[] = {0xffb9086a, 0x49ffffff, 0xc358fd75};&lt;br /&gt;&lt;br /&gt;Veja que eu coloco o ‘0x’ na frente para o compilador saber que são valores hexadecimais.&lt;br /&gt;&lt;br /&gt;Agora que nós temos o tal array vamos forçar o compilador a chamá-lo como uma função que retornar um inteiro:&lt;br /&gt;&lt;/stdio&gt;&lt;p&gt;&lt;stdio h=""&gt;((int (*) ())OpCodes)() &lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt; &lt;br /&gt;&lt;/p&gt;&lt;stdio h=""&gt;Não se assuste, olhe por um lado, nós temos o array OpCodes.&lt;br /&gt;&lt;/stdio&gt;&lt;p&gt;&lt;stdio h=""&gt;Vamos usar um cast de uma função que retorna um inteiro n’ele:&lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;&lt;br /&gt;&lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;( int (*)() ) &lt;- esse é o cast  &lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;Envolvemos o cast e o endereço do primeiro elemento de Opcodes entre parênteses: &lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;((int) (*) ()) OpCodes)  &lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;E agora que já o transformamos em uma função que retorna um inteiro, vamos chamar essa função: &lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;((int) (*) ()) OpCodes) ()    &lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;Bem, vamos colocar isso tudo num printf para que ele exiba o valor 8:  &lt;/stdio&gt;&lt;/p&gt;&lt;p&gt;&lt;stdio h=""&gt;#include stdio.h &lt;stdio h=""&gt;&lt;br /&gt;&lt;/p&gt;&lt;/stdio&gt;&lt;stdio h=""&gt;&lt;stdio h=""&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  int OpCodes[] = {0xffb9086a, 0x49ffffff, 0xc358fd75};&lt;br /&gt;&lt;br /&gt;  printf("Valor: %d", ((int (*) ())OpCodes)() );&lt;br /&gt;&lt;br /&gt;}  &lt;br /&gt;&lt;br /&gt;Vê?!&lt;br /&gt;&lt;br /&gt;Alguns preferem fazer a mesma coisa só que com uma string.&lt;br /&gt;&lt;br /&gt;Strings em C são simples arrays de bytes... isso significa que nós iremos ter que colocar um ‘\x’¹ para cada byte(2 dígitos hex), no final o resultado é o mesmo, a diferença é quem escreve mais:&lt;br /&gt;&lt;br /&gt;#include &lt;stdio h=""&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  int OpCodes[] = {0xffb9086a, 0x49ffffff, 0xc358fd75};&lt;br /&gt;&lt;br /&gt;  char szOpCodes[] =&lt;br /&gt;                    "\x6a\x08\xb9\xff"&lt;br /&gt;                    "\xff\xff\xff\x49"&lt;br /&gt;                    "\x75\xfd\x58\xc3";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  printf("Valor: %d", ((int (*) ())szOpCodes)() );&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Repare que eu só adicionei um ‘sz’² e troquei a ordem dos bytes.&lt;br /&gt;&lt;br /&gt;Você já vai saber o porque dessa ordem trocada... mas por hoje é só, cya. =]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¹: indica que o próximo byte não deve ser interpretado como caracter&lt;br /&gt;²: notação húngara indicando uma string terminada em zero.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/stdio&gt;&lt;/stdio&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-8482514467008856046?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/8482514467008856046/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-3-32-um-novo-debugger.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/8482514467008856046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/8482514467008856046'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-3-32-um-novo-debugger.html' title='ShellCoding parte 3 &gt; 3.2 Um novo debugger, um novo ponto de vista... o mesmo programa. &gt; 3.3 A base dos Shellcodes'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-5521992280900398655</id><published>2008-10-19T08:27:00.000-07:00</published><updated>2008-12-05T03:40:27.728-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cracking'/><title type='text'>ShellCoding parte 3 - Primeiros passos rumo ao shellcoding &gt; 3.1 primeiro programa assembly</title><content type='html'>Essa seção apresenta duas ferramentas importantíssimas para quem quer encontrar vulnerabilidades; o assembler e o debugger. &lt;br /&gt;&lt;br /&gt;Nessa seção também, nós aprofundaremos o conhecimento que você adquiriu da linguagem assembly, só que dessa vez, usando a prática para entender como, por exemplo, a stack funciona.&lt;br /&gt;&lt;br /&gt;De começo, usaremos o MASM32 como assembler.&lt;br /&gt;&lt;br /&gt;O MASM32 pode ser encontrado em:&lt;br /&gt;http://www.masm32.com/&lt;br /&gt;E o ollydbg é o primeiro debugger que vamos usar e pode ser encontrado em:&lt;br /&gt;http://www.ollydbg.de/download.htm&lt;br /&gt;&lt;br /&gt;Um assembler é uma espécie de compilador da linguagem assembly que passa as instruções asm para o código de máquina enquanto que um debugger também chamado de depurador, roda um programa deixando-o ver cada instrução executada pelo programa passo-a-passo.&lt;br /&gt; &lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.1 Primeiro programa assembly&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A partir de agora, as práticas serão mescladas com a teoria e a primeira parte da prática é bem simples e nos ensinará o funcionamento da stack.&lt;br /&gt;&lt;br /&gt;Para começar, abra seu MASM32, e insira o seguinte código:&lt;br /&gt;.386&lt;br /&gt;.model flat, stdcall&lt;br /&gt;option casemap:none&lt;br /&gt;&lt;br /&gt;.code&lt;br /&gt;start:&lt;br /&gt;&lt;br /&gt; push 8&lt;br /&gt;&lt;br /&gt; mov ECX, 0FFFFFFFFh&lt;br /&gt; &lt;br /&gt; lg:&lt;br /&gt;  dec ECX&lt;br /&gt; jnz lg&lt;br /&gt;&lt;br /&gt; pop EAX&lt;br /&gt; &lt;br /&gt; ret &lt;br /&gt;end start&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos entende-lo por partes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;.386&lt;/b&gt; indica qual intruction set¹ iremos usar, nesse caso, o do 80386 mesmo.&lt;br /&gt;&lt;br /&gt;¹: podemos encontrar o instruction set da família x86 em:&lt;br /&gt;http://en.wikipedia.org/wiki/X86_instruction_listings &lt;br /&gt;http://home.comcast.net/~fbui/intel.html &lt;br /&gt;http://www.x86.org/intel.doc/386manuals.htm&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;.model flat, stdcall:&lt;/b&gt; você entenderá mais tarde...&lt;br /&gt;&lt;br /&gt; &lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;.code:&lt;/b&gt; indica o início do código do programa...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;start:&lt;/b&gt; é a label que indica todo o corpo do programa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;end start:&lt;/b&gt; é aonde ele termina, tudo o que iremos escrever ficará entre esses dois.&lt;br /&gt;&lt;br /&gt;Na verdade, todas as funções que chamamos, são labels que indicam o offset(deslocamento) da próxima instrução a ser executada..&lt;br /&gt;&lt;br /&gt;Agora clique em assemble &amp;amp; link como na imagem-&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img110.imageshack.us/img110/4767/tuto1jq5.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Agora o que nós vamos fazer, é abrir o ollydbg, clicar em File&gt;Open e no binário gerado(tuto.exe no meu caso) e poderemos ver o código gerado por ele em ação passo a passo.(apesar de estar usando ele, eu recomendo o SoftIce, Windbg ¹ e o IDA Pro como disassembler no entanto não vou ter tempo de lhes ensinar como usar todos... na verdade, em breve mostrarei como criar suas próprias ferramentas, o que é bem melhor do que contar com softwares que quase sempre deixam a desejar diante das suas necessidades e tem bugs que são largamente explorados por aplicações cujos donos não querem que sejam ‘debugadas’)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¹: Recomendo a leitura desse blog&gt; http://www.1bit.com.br/content.1bit/windbg1&lt;br /&gt;O que termos é uma imagem parecida com a seguinte:&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img511.imageshack.us/img511/1304/tuto2yq2.jpg" border="0" alt="" /&gt;&lt;/p&gt;A área marcada com o número um contém o disassembly do programa, que é o código assembly gerado por um compilador comum ou assembler, como nós fizemos o programa em assembly o código é igual ao que nós fizemos, no entanto se fosse outra linguagem de programação, nós veríamos um código assembly gerado muito maior, principalmente depois do processo de “linkagem”.&lt;br /&gt;A coluna “address” indica o endereço virtual de cada instrução asm.&lt;br /&gt;A coluna hex dump nada mais é do que a coluna disassembly traduzida para os códigos operacionais que são o que o compilador realmente entende.&lt;br /&gt;&lt;br /&gt;Comment, é a coluna aonde os comentários ficam, muitas vezes o próprio olly vai lhe fornecer comentários  para dizer por exemplo, que certa operação é a passagem de parâmetros para uma função determinada.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A área 2 é basicamente a janela da CPU aonde você pode ver o estado de diferentes registradores.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A área 3 é a stack.&lt;br /&gt;A stack é basicamente uma área da memória para acesso rápido.&lt;br /&gt;O processador é otimizado para acesso à pilha, portanto ela não é como o resto da memória virtual de um processo.&lt;br /&gt;Ela cresce de 32 bits em 32 bits.&lt;br /&gt;No Windows ela tem a peculiaridade de estar armazenada em endereços baixos o que é prejudicial(não tanto) para construirmos nossos shellcodes.&lt;br /&gt;&lt;br /&gt;Ela tem outra peculiaridade que é crescer de cima para baixo e quando removemos algo dela, removemos primeiro o que está em cima.&lt;br /&gt;&lt;br /&gt;Veremos isso daqui a pouco na prática.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;A área 4 é a RAM do processo, nesse tuto não veremos muito sobre essa janela.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Agora voltemos ao nosso ollydbg.&lt;br /&gt;Ele é um debugger o que significa que podemos executar cada instrução de um determinado programa e ver o que acontece na íntegra com os registradores, a stack e etc.&lt;br /&gt;&lt;br /&gt;Então o que vamos fazer é apertar F7 para que a primeira instrução seja executada.(push 8 )&lt;br /&gt;O que essa instrução faz, é colocar um valor na stack, no nosso caso o 8.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img186.imageshack.us/img186/6559/tuto3wp3.jpg" border="0" alt="" /&gt;&lt;br /&gt;A stack cresce de cima para baixo como eu disse, um novo valor é sempre posto no topo dela e o que vemos em vermelho, é que em primeiro lugar, o valor antigo da stack ficou abaixo do novo que nós colocamos(00000008) e em segundo lugar, ainda em vermelho, podemos notar que o endereço do valor da stack desce 4 bytes(de 0012FFA4 para 0012FFA0), isso se deve pelo fato de que o maior endereço que a stack pode alcançar, é zero.(na verdade não é assim, mas vamos adotar o topo como sendo o zero para que seja mais fácil de entender como os maiores valores positivos sempre estão em baixo) &lt;br /&gt;&lt;br /&gt;Ou seja, ela crescerá para baixo e seu topo será o zero.. quando você usar o suficiente dela para chegar no 0, seria hipoteticamente falando, a hora que o Windows diria que falta memória.(na verdade, o que acontecia nos tempos do 9x é que se podia ultrapassar os limites da stack e o que acontecia realmente era que o windows normalmente "quebrava" por corrupção de memória) &lt;br /&gt;&lt;p&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://img300.imageshack.us/img300/8989/tuto4ks6.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Vemos em roxo também(voltando para a figura anterior), que os registradores que sofrem alguma mudança, o olly os realça em uma cor vermelha(pode mudar de acordo com suas configurações).&lt;br /&gt;Os registradores que mudaram com a instrução ‘push 8’, foram o EIP e o ESP.&lt;br /&gt;&lt;br /&gt;O ESP nós sabemos que aponta para o local aonde nós queremos que seja o topo da stack.&lt;br /&gt;E como podemos ver, o seu valor na janela da CPU é 0012FFA0, exatamente o endereço da área onde está o nosso 00000008.&lt;br /&gt;Quando PUSHamos um valor para a stack, o ESP é decrementado em 4.&lt;br /&gt;&lt;br /&gt;O outro registrador que mudou de valor, foi o EIP.&lt;br /&gt;EIP é o registrador que aponta para a próxima instrução a ser executada.&lt;br /&gt;Como podemos ver, a próxima instrução está em abóbora e seu endereço é o mesmo que o do EIP.&lt;br /&gt;O EIP é automaticamente atualizado pela CPU para apontar para a próxima instrução e ele não pode ser mudado por instruções como mov.&lt;br /&gt;EX:&lt;br /&gt;mov EIP, 00401002h  -&gt; errado&lt;br /&gt;(reparem também que quando eu quero escrever algum número hexadecimal, eu coloco o terminador ‘h’, caso o número já comece com alguma letra, eu tenho que por um zero antes para que o assembler possa distingui-lo de uma variável.(ex: 0DEADBEEFh)&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;O que vamos fazer é apertar f7 novamente para seguirmos um passo à frente.&lt;br /&gt;Vemos que ele move o valor 0FFFFFFFFh para ECX(como nós já vimos, -1 corresponde ao maior número hexadecimal que uma variável pode alcançar)&lt;br /&gt;Podemos ver que ECX e EIP são realçados por terem sido mudados, ECX com o valor movido e EIP com o endereço da próxima instrução.&lt;br /&gt;&lt;p&gt;Se você também olhar para o hexdump da instrução mov ECX, -1... poderá ver o valor 0FFFFFFFFh sendo movido para ECX(B9 &lt;- código operacional, FFFFFFFF &lt;- valor) &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;A próxima instrução, “DEC ECX” decrementa ECX em um. Não tem nenhum mistério nisso.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Mais um passo e damos de cara com um JNZ. JNZ significa jump if not zero, ou seja, pule se não for zero. &lt;/p&gt;&lt;p&gt;Ele vai pular para um determinado endereço se a operação anterior não resultou em zero.  &lt;/p&gt;&lt;p&gt;Ou seja, o que esse bloco vai fazer(DEC ECX &amp;amp;&amp;amp; JNZ 401007), é decrementar ECX até ele chegar a zero.&lt;/p&gt;&lt;p&gt;Quando ele chegar, o jnz não será executado e poderemos passar para a próxima instrução.  &lt;/p&gt;&lt;p&gt;Bem, você pode segurar o F7 até ECX chegar a zero e ficar olhando o EIP mudar freneticamente... ou pode simplesmente clicar duas vezes no ECX, mudar seu valor para zero, dar enter e seguir para a penúltima das nossas instruções.(faça isso quando estiver para executar o jnz, não antes ou o valor voltará para -1) &lt;/p&gt;&lt;hr /&gt;&lt;p&gt;A penúltima das nossas instruções é a pop EAX. POP simplesmente pega o valor para o qual ESP está apontando(valor da stack), e põe no registrador indicado.  Se lembra que nós tínhamos posto o valor 8 na stack com push? &lt;/p&gt;&lt;p&gt;Push decrementou ESP 4 bytes e colocou o 8 na pilha(stack). Pop vai realizar justamente o contrário... ele incrementará ESP em 4 bytes e vai colocar o valor 8 em EAX. Aperte F7 e veja isso acontecer... EAX passa a conter o valor 8. &lt;/p&gt;&lt;p&gt;No entanto, o valor 8 não é apagado da stack, ele continua lá muito embora ESP não aponte mais para ele... isso se deve ao fato de que pop não grava na stack, ele simplesmente à lê.  &lt;/p&gt;&lt;hr /&gt;  &lt;p&gt;E finalmente chegamos a nossa última instrução... Retn. &lt;/p&gt;&lt;p&gt;Lembra-se que eu falei que EIP não pode ser modificado diretamente? Mas nós já vimos uma instrução que modifica EIP, a JNZ. &lt;/p&gt;&lt;p&gt;Retn/ret é outra instrução que modifica EIP. O que acontece, é que sempre que uma função é chamada, o valor da próxima instrução após essa função é guardado na stack. &lt;/p&gt;&lt;p&gt;Retn funciona como um pop só que específico para EIP, ele pega o valor apontado por ESP e o põe em EIP. É assim que o programa sabe para onde voltar de uma determinada função.  Imagine essa situação:   &lt;/p&gt;&lt;p&gt;void Func() { } &lt;/p&gt;&lt;p&gt;Int main() { &lt;/p&gt;&lt;p&gt; Func();  &lt;/p&gt;&lt;p&gt; return 0; &lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nesse caso, quando Func é chamada, a endereço de “return 0” é guardado na stack, assim o programa sabe para onde deve seguir após a função interna ser executada por completo.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt; &lt;a href="http://sergaralho.blogspot.com/2008/10/shellcoding-parte-3-32-um-novo-debugger.html"&gt;Clique aqui para ler a continuação&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-5521992280900398655?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/5521992280900398655/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-3-primeiros-passos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/5521992280900398655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/5521992280900398655'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-3-primeiros-passos.html' title='ShellCoding parte 3 - Primeiros passos rumo ao shellcoding &gt; 3.1 primeiro programa assembly'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-5483488501838689158</id><published>2008-10-18T08:54:00.000-07:00</published><updated>2008-12-05T03:40:06.389-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cracking'/><title type='text'>ShellCoding parte 2 - asm básico &gt; 2.2 Introdução ao assembly &gt; 2.3 instruções ASM</title><content type='html'>&lt;p&gt;Muitas linguagens nascem e morrem.&lt;br /&gt;&lt;/p&gt;Object pascal há um tempo, era uma linguagem exemplarmente fácil e perfeita para o ambiente industrial o que a disseminou pelos quatro cantos do mundo.&lt;br /&gt;Hoje ela se torna ofuscada por linguagens relativamente novas como o JAVA.&lt;br /&gt;Isso se dá, porque a facilidade de programar em alto nível aumenta de forma vertiginosa... obj pascal perde para esse novo tipo de linguagem na facilidade, na portabilidade e até na segurança(já que o tipo do qual estamos falando, são os type safe)... e se Java não puder fazer algo que o pascal possa, certamente o C Sharp poderá com a vantagem de também ser type safe.&lt;br /&gt;No entanto, a dificuldade de se programar em baixo nível nunca mudou e nós sempre iremos precisar nos comunicar com a máquina na linguagem dela.(depois do ASM, é claro que antes era de outra forma)&lt;br /&gt;Sempre precisarão de alguém que ponha a “mão na massa” e “faça acontecer”.(duas figuras de linguagem em uma única frase curta o0 )&lt;br /&gt;As linguagens de alto nível vão morrer, talvez nem todas, mas sofrerão mudanças... no entanto nosso bom e velho assembly continua ai, com seus 58 anos de idade e eu realmente duvido que seja um dia substituído simplesmente porque “panela velha é que faz comida boa”... Boa e rápida, diga-se de passagem.&lt;br /&gt;Assembly é a linguagem mais rápida e não é à toa... &lt;br /&gt;Assembly é uma simples representação dos códigos operacionais.&lt;br /&gt;&lt;p&gt;Esses opcode’s(códigos operacionais) são a verdadeira linguagem dos microprocessadores.. no entanto como programar usando números seria algo desumano o assembly foi criado para suprir nossas necessidades.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Bem, para aprender assembly , existem alguns conceitos básicos pelos quais devemos passar.&lt;br /&gt;O primeiro deles é o tamanho básico que alguns dados ocupam na memória.&lt;br /&gt;O computador sabidamente trabalha com o sistema binário, o sistema binário varia de 1 a 0.&lt;br /&gt;Essa comunicação dá-se pela tensão(força que impulsiona os elétrons).&lt;br /&gt;Como eu não consegui achar o esquema na internet; os dados que eu irei passar são imprecisos já que se baseiam na minha memória. (ela só armazena 12kb =P)&lt;br /&gt;De 0 volts a 1,4 é a zona morta e seu valor lógico é zero.&lt;br /&gt;De 1,5 a 3,0 é a “zona de indecisão” em que basicamente o valor lógico pode ser um ou zero dependendo de que parte do circuito nós estamos.&lt;br /&gt;E de 3,0 a 5,0 é a zona ativa aonde o valor lógico é um.&lt;br /&gt;Para definir um padrão, nós adotamos que o valor da zona morta é sempre com a tensão zero e o da zona ativa sempre com a tensão em 5,0 v.(a zona de indecisão não é importante para nós)&lt;br /&gt;O importante é perceber que apesar da tensão poder ter pequenas variações, o importante é o valor lógico ao qual ela está atrelada.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Bit significa binary digit ou dígito binário e por ser binário pode variar entre um ou zero.&lt;br /&gt;Quando nós temos quatro bits juntos, nós temos um nibble.( de 0000 a 1111 )&lt;br /&gt;Oito bits juntos são um byte.(de 00000000 a 11111111)&lt;br /&gt;Dezesseis bits juntos ou 2 bytes são um Word(de 0000000000000000 a 1111111111111111)&lt;br /&gt;E um Double Word são 32 bits ou 4 bytes.(não me peça pra escrever 64 bits aqui ¬¬)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O segundo conceito básico são as operações lógicas.&lt;br /&gt;A maioria das operações lógicas tem dois operandos como as matemáticas(1 + 1)&lt;br /&gt;A diferença fica por conta do resultado gerado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A primeira operação lógica que nós iremos ver é a operação denominada AND.&lt;br /&gt;And na língua portuguesa significa ‘E’, e ela compara o primeiro operando com o segundo... se ambos forem 1 logo sua saída/resposta será um, qualquer coisa diferente disse recebe o valor zero.&lt;br /&gt;Vejamos sua utilização:&lt;br /&gt;AND 1, 1 ; saída 1&lt;br /&gt;AND  1, 0 ; saída 0&lt;br /&gt;AND  0, 1 ; saída 0&lt;br /&gt;AND  0, 0 ;saída 0&lt;br /&gt;No mundo da eletrônica em geral(obviamente incluindo a informática), existe o que chamamos de tabela lógica, nada mais é do que uma representação do que vimos aqui mais arrumado e graficamente.&lt;br /&gt;&lt;br /&gt;|  B   |   A  | S |&lt;br /&gt;  0    |  0   | 0&lt;br /&gt;  0    |  1   | 0&lt;br /&gt;  1    |  0   | 0&lt;br /&gt;  1    |  1   | 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nós temos os operandos( A &amp;amp; B ) e o resultado da operação/saída( S ) e abaixo, todas as possibilidades de valores que esses operandos podem assumir e as saídas que eles irão produzir.&lt;br /&gt;&lt;br /&gt;Apesar das portas lógicas físicamente poderem ter mais do que duas variáveis, no assembly nós quase sempre as veremos com dois operandos.(pelo fato de quase sempre estarmos trabalhando com 4 bytes de informação)&lt;br /&gt;&lt;br /&gt;A operação lógica OR, tem a saída 1 se uma das variáveis for também um.&lt;br /&gt;|  B   |   A  | S |&lt;br /&gt;  0    |  0   | 0&lt;br /&gt;  0    |  1   | 1&lt;br /&gt;  1    |  0   | 1&lt;br /&gt;  1    |  1   | 1&lt;br /&gt;&lt;br /&gt;A operação lógica XOR opera como a OR com a exceção de que ela só retorna um na saída se apenas uma das variáveis for um.&lt;br /&gt;&lt;br /&gt;|  B   |   A  | S |&lt;br /&gt;  0    |  0   | 0&lt;br /&gt;  0    |  1   | 1&lt;br /&gt;  1    |  0   | 1&lt;br /&gt;  1    |  1   | 0  &lt;- reparem no zero quando as duas variáveis são um   Agora vamos entender o complemento de dois, muito usado em flip-flop’s  pra que vem da eletrônica.   Nós já aprendemos como os números decimais podem ser representados na base binária. Agora vamos entender como máquinas representam números decimais negativos binariamente(já que não existe – 0001 e + 0001)  Imaginemos um nibble, ele pode representar até o número 15(1111) em decimal. No entanto, para que ele represente negativos e positivos, ele deverá ser dividido ao meio. Como temos um nibble, números de 0000 a 0111(7) serão positivos... Os números negativos possuem o último bit como o valor 1. Fazendo uma tabela: Dec  |Bin -8   &gt; 1000&lt;br /&gt;-7  &gt;  1001&lt;br /&gt;-6  &gt;  1010&lt;br /&gt;-5 &gt;  1011&lt;br /&gt;-4 &gt;  1100&lt;br /&gt;-3  &gt; 1101&lt;br /&gt;-2  &gt; 1110&lt;br /&gt;-1 &gt; 1111&lt;br /&gt;0 &gt;   0000&lt;br /&gt;1 &gt;   0001&lt;br /&gt;2 &gt;  0010&lt;br /&gt;Isso segue até o sete(0111).&lt;br /&gt;Para se adquirir um número negativo correspondente ao seu positivo, usa-se o complemento de dois, ele possui uma fórmula mas na verdade tudo o que você tem que fazer é inverter todos os bits de um número e somar 1 à ele.&lt;br /&gt;Ex:&lt;br /&gt;0111(sete)&lt;br /&gt;1000(-8) + 1&lt;br /&gt;1001(-7)&lt;br /&gt;&lt;p&gt;Como um nibble só tem 4 bits, então:&lt;br /&gt;&lt;/p&gt;0111 (7)&lt;br /&gt;+&lt;br /&gt;1001(-7)&lt;br /&gt;____&lt;br /&gt; 10000&lt;br /&gt;&lt;br /&gt;Repare que 1+1 = 10(dois em binário) e você faz aquela velha operação do “vai um” decimal.&lt;br /&gt;A resposta é 10000, mas como tem 5 bits a resposta e estamos falando de uma variável que só possui quatro, o último bit é descartado e ficamos com a resposta 0000 que é o resultado correto.&lt;br /&gt;Simples né? =]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Como eu estou correndo MESMO, vou pular alguns temas muito importantes para que você aprenda definitivamente essa linguagem tão impressionante.&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;A CPU trabalha através de certos registradores, esse registradores são como as variáveis que nós usamos nos nossos exemplos de portas lógicas, eles armazenam uma certa quantidade de bits(8, 16, 32 e 64).. &lt;br /&gt;Vamos conhecer os registradores que nós mais veremos durante a vida útil desse tutorial.&lt;br /&gt;A maioria dos registradores podem ser divididos em 4 partes.&lt;br /&gt;Por exemplo o EAX(o nome do registrador é AX, o ‘E’ antes dele significa ‘extended’)&lt;br /&gt;Um registrador Extended tem 32 bits no entanto ele também pode ser acessado como um registrador de 16 e 8 bits.&lt;br /&gt;Veja por esse lado, EAX tem 32 bits&lt;br /&gt;EAX pode ser dividido em EAL(‘L’ de LOW/Baixo) 16 bits e EAH(‘H’ de high/alto).&lt;br /&gt;Ou seja, os 16 bits mais baixos e os 16 mais altos.&lt;br /&gt;Eles ainda fazem parte de EAX, mas você pode acessar as partes de EAX separadamente se quiser.&lt;br /&gt;Por sua vez, EAX pode ser acessado como AX como um registrador de 16 bits que também pode ser dividido em AL e AH cada um tendo 8 bits.(note que EAL é igual a AX)&lt;br /&gt;&lt;p&gt;EAX é um registrador de propósito geral o que quer dizer que ele logicamente pode ser usado de diversas maneiras para guardar qualquer tipo de dado... No entanto a prática não é assim. (devido á certas leis que não são imutáveis mas que são seguidas a risca por muitos assemblers)&lt;/p&gt;&lt;p&gt; &lt;br /&gt;&lt;/p&gt;EAX é um registrador importante, ele é usado para passar dados para uma função ou retornar esses dados de certa função, as APIs do Windows retornam HANDLES, ponteiros, estruturas e etc.&lt;br /&gt;Tudo por ele.&lt;br /&gt;Ele também é usado para ler e receber dados da memória(por ser um pouco mais rápido para isso que os outros)&lt;br /&gt;&lt;br /&gt;EBX é muito usado para endereços de memória.&lt;br /&gt;&lt;br /&gt;ECX como contador para instruções de loop.(não é regra e ás vezes é até usado como auxiliar do EAX o0)&lt;br /&gt;&lt;br /&gt;EDX é o auxiliar do EAX oficial, se o EAX estiver em uso, então esse registrador armazenará o os dados por EAX.&lt;br /&gt;&lt;br /&gt;Um resumão&gt;&lt;br /&gt;AX- acumulador&lt;br /&gt;BX- Base&lt;br /&gt;CX- contador&lt;br /&gt;DX- dados&lt;br /&gt;Todos esses apresentados podem ser divididos como registradores de 8, 16 e 32 bits... &lt;br /&gt;Os próximos registradores que vou lhes apresentar,  também são de uso geral no entanto como esses, vocês irão perceber que não são de uso “tão geral assim”.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;ESI &amp;amp; EDI: esses dois registradores são quase sempre usados como source e index(fonte e destino) para operações envolvendo strings mas também são usados sempre que se precisa ler e escrever em uma área da memória.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ESP: Mantém o endereço do topo da stack(mais tarde veremos um pouco sobre ela)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EBP: Normalmente armazena o endereço da base de um stack frame, nós o veremos muito em prólogos e epílogos de funções.(não se assuste, o nome é estranho mas logo não será mais)&lt;br /&gt;&lt;br /&gt;Esses registradores podem ser divididos entre 16 e 32 bits, sendo os de 32 bits os que possuem o prefixo “E”(ESP) e sem o prefixo os de 16(SP).&lt;br /&gt;&lt;hr /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt; 2.3 Instruções ASM&lt;br /&gt;&lt;p&gt;Todas as operações do assembly são processor-dependent¹... não importa se você está programando para um micro-controlador ou em um pc comum, o set de instruções que um micro-processador aceita é designado de fábrica e você pode ler o “instruction set”² no site do fabricante.&lt;br /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;¹: dependem diretamente do processador&lt;br /&gt;²:Também referido como instructions table e por ai vai&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;A primeira função que veremos é a mov.&lt;br /&gt;Mov, movimenta dados da origem(primeiro operador) para o destino(segundo operador).(isso muda na sintaxe AT&amp;amp;T, mais tarde eu farei um pequeno tuto sobre ela, no momento, nos focaremos na intel)&lt;br /&gt;&lt;br /&gt;É como se fizéssemos isso:&lt;br /&gt;“int EDX, EAX = 1;&lt;br /&gt; EDX = EAX;”&lt;br /&gt;&lt;br /&gt;Por exemplo, vamos usá-la com os registradores edx e eax.&lt;br /&gt; &lt;br /&gt;mov EAX, 1  ;EAX = 1&lt;br /&gt;&lt;p&gt;mov EDX, EAX  ; EDX = EAX&lt;/p&gt;&lt;p&gt;Reparem que tudo depois do caracter ‘;’ é uma linha de comentário diferentemente do C que usa os caracteres “/*” e “*/” ou “//”&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Outro conjunto de instruções, são as portas lógicas que lhes ensinei.&lt;br /&gt;&lt;br /&gt;XOR, faz a operação XOR(exclusive or, ou exclusivo) bit a bit em dois operandos e o resultado é guardado no primeiro operando.&lt;br /&gt;&lt;br /&gt;Ex:&lt;br /&gt;mov AL, 1 ; AL = 0000 0001&lt;br /&gt;mov AH, 2  ; AH = 0000 0010&lt;br /&gt;xor AL, AH  ; AL = 0000 0011&lt;br /&gt;&lt;br /&gt;xor é muitas vezes usado para zerar um registrador, por exemplo:&lt;br /&gt;&lt;br /&gt;mov AX, 512 ; AX = 0000 0010 0000 0000&lt;br /&gt;xor AX, AX   ;  AX = 0000 0000 0000 0000&lt;br /&gt;&lt;br /&gt;Como o xor é o “ou exclusivo” e só retorna um se somente um dos bits for 1, a operação entre dois valores exatamente iguais sempre dará zero.&lt;br /&gt;&lt;br /&gt;Lembre-se que ax contém 16 bits e AL e AH somente 8.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OR faz a operação OR(ou) bit a bit em dois operandos. &lt;br /&gt;mov AX, 512 ; AX = 0000 0010 0000 0000&lt;br /&gt;or AX, AX   ;  AX = 0000 0010 0000 0000&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;AND, uso:&lt;br /&gt;&lt;br /&gt;mov AL, 15  ; AL = 0000 1111&lt;br /&gt;AND AL, 4 ; AL = 0000 0100&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;INC, incrementa um operando em um:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mov AL, 0  ; AL = 0000 0000&lt;br /&gt;inc AL  ; AL = 0000 0001&lt;br /&gt;inc AL ; AL =  0000 0010&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DEC, decrementa um operando em um:&lt;br /&gt;&lt;br /&gt;mov AL, 2  ; AL = 0000 0010&lt;br /&gt;dec AL  ; AL = 0000 00001&lt;br /&gt;dec AL ; AL =  0000 0000&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;p&gt;IMUL, multiplica dois operandos guardando o resultado no primeiro:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;mov AL, 2 ;AL = 0000 0010&lt;br /&gt;mov AH, 2 ; AH = 0000 0010&lt;br /&gt;IMUL  AH, AL ; AH = 0000 0100&lt;br /&gt;                        ; AX = 0000 0100 0000 0010&lt;br /&gt;                                   AH        AL   &lt;br /&gt;&lt;br /&gt;Você ainda não conhece assembly o suficiente após ter lido isso, mas essa parte de assembly básico já está concluída, no entanto nós sempre veremos um pouco de assembly no decorrer do tutorial.&lt;br /&gt;&lt;p&gt;Eu escolhi essa organização porque por experiência própria, eu sei que uma aprendizagem dinâmica é melhor do que algo estático.(é sempre bom quando seu professor de matemática usa um pouco de outra matéria para desviar do assunto principal e lhe ensinar matemática de uma forma mais alternativa sem uma abordagem tão direta.)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt; &lt;a href="http://sergaralho.blogspot.com/2008/10/shellcoding-parte-3-primeiros-passos.html"&gt;Clique aqui para ler a continuação&lt;/a&gt; &lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-5483488501838689158?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/5483488501838689158/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-2-asm-bsico-22.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/5483488501838689158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/5483488501838689158'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-2-asm-bsico-22.html' title='ShellCoding parte 2 - asm básico &gt; 2.2 Introdução ao assembly &gt; 2.3 instruções ASM'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-5398706506246942605</id><published>2008-10-17T09:27:00.000-07:00</published><updated>2009-12-28T02:03:08.165-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='criptografia'/><title type='text'>Um papo sobre algoritmos criptográficos de hashing, parte 1</title><content type='html'>Algoritmos criptográficos de hashing são a grande base das assinaturas digitais hoje em dia.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Um algoritmo de hash criptográfico, codifica uma tabela de dados sendo essa tabela/vetor um texto ou qualquer outro tipo de dado.&lt;br /&gt;&lt;br /&gt;Essa codigicação dá-se através de cálculos matemáticos e no final do "hashing", não importa o tamanho do dado codigicado, ele terá um tamanho prédefinido, sempre.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;De fato, na teoria, como temos um tamanho fixo na saída do algorítmo criptográfico, o que um hash deveria fazer seria evitar colisões(quando duas entradas diferentes geram um mesmo hash).&lt;br /&gt;&lt;br /&gt;Mas justamente pelo fato de termos um número de possibilidades de saída limitado, evitar colisões fica impossível mas o que realmente um desenvolvedor de um algoritmo criptográfico de hashing quer, é que essas colisões sejam impossíveis de se achar intencionalmente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Um dos "hash algorithms" mais utilizados é/foi o hash MD5 feito em 1992 substituindo o seu predecessor MD4.&lt;br /&gt;&lt;br /&gt;Os hashs são famosos por serem "one-way" ou seja, você pode encriptar um determinado dado mas é impossível de desencriptá-lo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Então o que torna um algoritmo de escrutínio(hashing) seguro ou inseguro?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;São exatamente essas tais de colisões...&lt;br /&gt;&lt;br /&gt;Quando podemos achá-las intencionalmente as possibilidades se tornam inimagináveis já que hashs são usados por exemplo, para verificar a integridade e autenticidade de um executavel.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A um tempo atrás, um exemplo de ataque em que dois executaveis tinham a mesma assinatura de hashing foi publicado.&lt;br /&gt;&lt;br /&gt;Nele, apesar de ambos os arquivos terem a mesma assinatura de hash, um era comum e outro extremamente malévolo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Desde 1994 técnicas para encontrar colisões no MD5 vem sendo largamente descobertas e publicadas, até que em 2004 o MD5 foi quebrado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nesse contexto nós temos uma grande falha de segurança por falta de algoritmos de escrutínio descentes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ronald L. Rivest então apresenta seu mais novo hash, o MD6.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Podendo usar até mais processadores para diminuir a demora para gerar um hash.&lt;br /&gt;&lt;br /&gt;Um algoritmo robusto e complexo o que teoricamente o torna seguro.&lt;br /&gt;&lt;br /&gt;O problema é que ele é inviável.&lt;br /&gt;&lt;br /&gt;Sua complexidade  o torna dificil de ser implementado e principalmente, o torna caro e nada sustentável.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Então o que nós vamos fazer ao longo desse "papo sobre hashing" é dar um pontapé em um algoritmo de hashing mais viável e poderoso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eu gosto de me impor desafios para aumentar as minhas habilidades e essa coleção de artigos será uma aula tanto para o leitor quanto para o autor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bem primeiro vamos entender como a operação lógica xor(exclusive or) é usada em algoritmos criptográficos e porquê.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As operações lógicas são operações baseadas na lógica binária, ou é certo ou é errado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O verdadeiro é representado pelo número 1 e o que é falso pelo número 0.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Na programação isso é comum.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(szTexto == "ola" || szTexto == "Ola")&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; Bloco de comandos&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A operação acima é uma operação or("ou" em português).&lt;br /&gt;&lt;br /&gt;se a variável szTexto for igual a "ola" ou "Ola" então o que a operação lógica or faz é retornar verdadeiro(1) se uma das duas condições avaliadas ou ambos forem verdadeiras.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A exclusive or é quase a mesma coisa com o diferencial de que ela só retorna verdadeiro se um&lt;br /&gt;&lt;br /&gt;dos dois valores for verdadeiro, e se ambos forem verdadeiros, ele retorna falso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos dar uma olhada na table dos possíveis valores e resultados:&lt;br /&gt;&lt;br /&gt;A    B     Resultado&lt;br /&gt;&lt;br /&gt;0    0               0&lt;br /&gt;&lt;br /&gt;0    1                 1&lt;br /&gt;&lt;br /&gt;1    0                 1&lt;br /&gt;&lt;br /&gt;1    1                 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Quando ambos são falsos, o resultado da operação é falso, quando ambos são verdadeiro, resultado falso também.. ou seja, operandos iguais resultado falso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;É interessante notar que:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;x = a xor b&lt;br /&gt;&lt;br /&gt;a = x xor b&lt;br /&gt;&lt;br /&gt;b = x xor a&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vejamos a veracidade dessa informação:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;a = 101&lt;br /&gt;&lt;br /&gt;b = 100&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;101 xor 100 = 001&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para fazer a conta simplesmente coloque um valor abaixo do outro:&lt;br /&gt;&lt;br /&gt;1 0 1&lt;br /&gt;&lt;br /&gt;1 0 0&lt;br /&gt;&lt;br /&gt;____&lt;br /&gt;&lt;br /&gt;0 0 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Logo, x = 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bem, vamos achar A só sabendo o valor de b...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;B(100) xor X(1) = A(101)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos descobrir B apartir de A agora...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A(101) xor x(001) = B(100)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O interessante é perceber que, o resultado de uma operação XOR entre dois valores, pode sempre ser usado para descobrir um valor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ou seja, se tivermos uma string e usarmos uma operação xor nela com um determinado valor, o resultado será uma string totalmente diferente, mas usando o tal valor usado no xor e essa string totalmente diferente, o resultado da operação será aquela string do começo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Defato, o valor usado na operação xor com a string comum pode ser usado como chave para descobrir essa string após ser encriptada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos ver um exemplo disso em C...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt; char szStr[] = "sergio";&lt;br /&gt; int iKey = 0x9;&lt;br /&gt;&lt;br /&gt; printf("String: %s\n", szStr);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; for(int iNum = 0; szStr[iNum]; ++iNum)&lt;br /&gt;  szStr[iNum] = szStr[iNum] ^ iKey;&lt;br /&gt;&lt;br /&gt; printf("String encriptada: %s\n", szStr);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; for(int iNum = 0; szStr[iNum]; ++iNum)&lt;br /&gt;  szStr[iNum] = szStr[iNum] ^ iKey;&lt;br /&gt;&lt;br /&gt; printf("String desencriptada: %s\n", szStr);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ou seja, nós encriptamos uma string usando a operação lógica xor e uma chave(iKey) e depois à usamos para desencriptar a string.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Algoritmos de escrutínio costumam usar a mesma operação lógica, a diferença é que eles "jogam a chave fora" para que ninguem consiga descobrir a senha antiga... é claro que de uma forma mais complicada que conheceremos com o tempo aqui no blog. =]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-5398706506246942605?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/5398706506246942605/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/10/um-papo-sobre-algoritmos-criptogrficos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/5398706506246942605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/5398706506246942605'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/10/um-papo-sobre-algoritmos-criptogrficos.html' title='Um papo sobre algoritmos criptográficos de hashing, parte 1'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-7735535177603629467</id><published>2008-10-16T08:50:00.001-07:00</published><updated>2008-12-05T03:39:38.758-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cracking'/><title type='text'>ShellCoding parte 2 - asm básico &gt; 2.1 sistemas numéricos</title><content type='html'>Não tem, ou melhor, não deveria ter outra forma de introduzir alguém a uma linguagem sem passar por esse tema.&lt;br /&gt;Sinta-se livre para passar por ele se já o conhecer.&lt;br /&gt;Vou passar bem rápido por esse tema, ele é simples demais para perdermos tempo nele.&lt;br /&gt; Um sistema numérico, é uma representação visual de uma contagem seqüencial.&lt;br /&gt;Cada símbolo representa o número seguinte a ser contado, quando não há mais símbolos nós repetimos o segundo da seqüência ao lado esquerdo do número que estamos escrevendo e voltamos o número inicial ao seu primeiro símbolo.(famoso esquema do “vai um”)&lt;br /&gt;A base que normalmente usamos para representar números é a decimal, logo nós temos:&lt;br /&gt;1, 2, 3, 4, 5, 6, 7, 8, 9 e 10&lt;br /&gt;Certo?&lt;br /&gt;Errado!&lt;br /&gt;0, 1, 2, 3, 4, 5, 6, 7, 8 e 9&lt;br /&gt;É a seqüência certa... &lt;br /&gt;Quando chegamos o no número nove (9) nós voltamos ao zero (0) e colocamos um ao seu lado para representar que já ultrapassamos da nossa seqüência uma vez e assim em diante.&lt;br /&gt;Isso é fácil, mas é a base para qualquer base numérica, como a binária.&lt;br /&gt;A base binária só tem dois números, o zero e o um e subseqüentemente segue a mesma lógica que a decimal para representar os mesmos números...&lt;br /&gt;Vamos ver algumas representações em binário&lt;br /&gt;Binário   |  Decimal&lt;br /&gt;0               |         0&lt;br /&gt;1                          |         1&lt;br /&gt;10                   |          2&lt;br /&gt;11                           |          3&lt;br /&gt;100                                               |          4&lt;br /&gt;101           |          5&lt;br /&gt;110           |          6&lt;br /&gt;111           |          7&lt;br /&gt;1000      |          8&lt;br /&gt;1001       |          9&lt;br /&gt;&lt;p&gt;1010       |          10&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;Como podemos ver, cada vez que passamos do número de símbolos que temos, aumentamos um número a esquerda tanto na base decimal quanto na binária.&lt;br /&gt;Parece bobeira de tão fácil, e é. Lolz&lt;br /&gt;Geralmente nós temos que trocar de uma base para outra... Para trocar da base decimal para a binária e vice-versa eu uso uma tabela comum para técnicos e engenheiros eletrônicos, mas pouco comum no mundo da informática.&lt;br /&gt;Ela é lógica e bem simples.&lt;br /&gt;Vou fazer um exemplo da conversão do número 9 para binário utilizando ela.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;16 | 8 | 4 | 2 | 1 &lt;- cabeçalho  &lt;/p&gt;&lt;p&gt;0     | 1 | 0 | 0 | 1  &lt;/p&gt;&lt;p&gt;Essa tabela é composta por um cabeçalho, esse cabeçalho define colunas baseando-se em potencias de dois: &lt;/p&gt;&lt;p&gt;2 ^ 0 (^ significa “elevado a”) = 1 &lt;/p&gt;&lt;p&gt;2 ^ 1 = 2 &lt;/p&gt;&lt;p&gt;2 ^ 2 = 4 &lt;/p&gt;&lt;p&gt;2 ^ 3 = 8  &lt;/p&gt;&lt;p&gt;Esse cabeçalho pode ter quantos números você desejar. &lt;/p&gt;&lt;p&gt;Depois o que fazemos é pegar o número do cabeçalho que mais se aproxima do número que queremos transformar pra binário( 9 ), no nosso caso pegamos o oito. Depois nós pegamos um número que possamos somar com o oito para se tornar nove.( o um/1) Nas colunas dos números que nós pegamos nós colocamos o número um (1), em todas as outras, zero.  &lt;/p&gt;&lt;p&gt;Vamos transformar o número 512 em binário para treinarmos. (PS: essa tabela é ótima para fazer em concursos porque ela é rápida e prática, melhor do que dividir milhares de vezes por dois e pegar o resto)  &lt;/p&gt;&lt;p&gt;512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1   &lt;/p&gt;&lt;p&gt;  1     |    0     |    0     |  0     |  0    |  0   | 0 | 0 | 0 | 0  &lt;/p&gt;&lt;p&gt;Isso mesmo! Como já achamos o 512 de primeira, o resto é tudo zero... Acreditem, da outra maneira vocês iriam gastar muito tempo dividindo por dois até o final de suas vidas. Lolz &lt;/p&gt;&lt;p&gt;E se o número fosse 511.. bem como temos um número antes de uma potencia de dois, é só marcar 1 em todas as colunas anteriores.. vejam: &lt;/p&gt;&lt;p&gt;512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1  &lt;/p&gt;&lt;p&gt;  0      |     1    |     1       |   1      |   1    |   1   | 1  | 1 | 1 | 1  &lt;/p&gt;&lt;p&gt;111111111 é a resposta... Se quiserem somar todos os números anteriores com a calculadora de seus computadores verão que eu estou certo. E para fazer o processo inverso?! Isso é, transformar um número binário em decimal? Usamos nossa tabela novamente. Digamos que queiramos converter o número 111 para decimal...&lt;/p&gt;&lt;p&gt;8 | 4 | 2 | 1 &lt;- cabeçalho &lt;/p&gt;&lt;p&gt;0 | 1 | 1 | 1  &lt;/p&gt;&lt;p&gt;Agora é só somarmos os números que estão acima de cada 1 binário... &lt;/p&gt;&lt;p&gt;4+2 = 6 &lt;/p&gt;&lt;p&gt;6 + 1 = 7 &lt;/p&gt;&lt;p&gt;E pronto. &lt;/p&gt;&lt;p&gt;Nós também temos a base hexadecimal, que  tem a seguinte seqüência simbólica: 0 1 2 3 4 5 6 7 8 9 A B C D E F Com ‘A’ representando o ‘10’, ‘B’ o ‘11’, ‘C’ o ‘12’ e assim por diante...   Converter binário para hexadecimal e vice-versa é muito simples. &lt;/p&gt;&lt;p&gt;O maior número individual hexadecimal é igual ao maior número contido em um nibble(4 casas binárias/ 1 1 1 1) Então, cada número hexadecimal, nós convertemos para um nibble.. por exemplo “FF”(255) O primeiro F é o mesmo que 15 em decimal e corresponde ao nibble 1 1 1 1 e o segundo  outra sequencia de quatro 1’s.&lt;/p&gt;&lt;p&gt;Logo, 1 1 1 1 1 1 1 1.&lt;/p&gt;&lt;p&gt;Só mais uma para termos um melhor idéia da operação.. &lt;/p&gt;&lt;p&gt;O número A1 para binário vira   &lt;/p&gt;&lt;p&gt;A       1 &lt;/p&gt;&lt;p&gt;1010  0001 &lt;/p&gt;&lt;p&gt;Eu normalmente faço a transformação de hexadecimal para decimal usando o deslocamento extra para não ter que ficar multiplicando fatores de 16. &lt;/p&gt;&lt;p&gt;Por exemplo o FF. &lt;/p&gt;&lt;p&gt;F = 15 &lt;/p&gt;&lt;p&gt;E um dos F’s está uma casa a frente do primeiro. &lt;/p&gt;&lt;p&gt;150 &gt; uma casa decimal acescentada + 15 = 165&lt;p&gt;O deslocamento é 90(15 * 6).&lt;br /&gt;Logo, 90 + 165 = 255&lt;/p&gt;&lt;p&gt;Eu gosto dessa maneira porque me permite fazer de cabeça.. no entanto meus amigos acham ela de uma dificuldade absurda, talvez porque eu tenha criado ela de cabeça a um bom tempo atrás e acaba ficando mais fácil pra mim que visualizei a lógica por trás da conta do que para quem não visualizou a mesma. \=&lt;/p&gt;&lt;p&gt;Então não vou me ater a ela tanto assim.Vamos a técnica mais popular.Cada casa hexadecimal corresponde a uma quantidade de vezes que nós passamos dos 16 símbolos.&lt;/p&gt;&lt;p&gt;Logo, em FF &lt;/p&gt;&lt;p&gt;Nós temos&lt;br /&gt;F x 16^0&lt;br /&gt;+&lt;br /&gt;F x 16^1&lt;br /&gt;O que dá 255.&lt;br /&gt;O procedimento contrário(transformar números decimais em hexadecimais se dá através de divisões consecutivas do número por 16 até não podermos mais dividir o resultado.&lt;br /&gt;&lt;br /&gt;Let’s see it.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;255 / 16 =  15,9375&lt;br /&gt;15 é igual a F.&lt;br /&gt;Ai nós multiplicamos o resto&lt;br /&gt;0,9375 x 16 = 15&lt;br /&gt;15 é F também, logo ‘FF’.&lt;br /&gt;&lt;br /&gt;Para quem não entendeu, é porque eu realmente estou correndo... Infelizmente nem sempre a minha explicação é o suficiente, então se sinta à vontade para procurar em outros lugares a explicação sobre essa mesma matéria, eu pessoalmente recomendo esse link&gt;&lt;br /&gt;http://www.numaboa.com.br/informatica/oiciliS/assembler/textos/binHexPort.php&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://sergaralho.blogspot.com/2008/10/shellcoding-parte-2-asm-bsico-22.html"&gt;Clique aqui para ler a continuação&lt;/a&gt; &lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-7735535177603629467?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/7735535177603629467/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-2-asm-bsico-21.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/7735535177603629467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/7735535177603629467'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-2-asm-bsico-21.html' title='ShellCoding parte 2 - asm básico &gt; 2.1 sistemas numéricos'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4996807388995088672.post-2246938700847153342</id><published>2008-10-16T08:46:00.000-07:00</published><updated>2008-12-05T03:39:08.159-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ShellCoding tuto1'/><category scheme='http://www.blogger.com/atom/ns#' term='Cracking'/><title type='text'>ShellCoding parte 1 - introdução</title><content type='html'>Shell coding é uma arte a parte, algumas vezes, uma vulnerabilidade não é "exploitada" por que simplesmente o atacante não fez um shellcode pequeno o suficiente.&lt;br /&gt;Achar vulnerabilidades é outra arte também... Saber juntar essas duas formas de arte para um objetivo principal pode e pode não ser uma tarefa difícil, mas tende a ser complexa muitas vezes.&lt;br /&gt;&lt;br /&gt;Inicialmente, hackers e crackers viviam em mundos separados... A antítese de usuários comuns...&lt;br /&gt;Hackers, historicamente vieram de sistemas de código aberto aonde as vulnerabilidades eram encontradas no código fonte liberado, não lidavam com dificuldades técnicas como unpacking e etc, no entanto conheciam a linguagem C muito bem.&lt;br /&gt;Crackers vieram de um sistema de código fechado em especial(o windows) e costumeiramente tinham que "quebrar" o código de um software para conseguirem alcançar certos objetivos, que algumas vezes eram os mesmos que os dos hackers e outras vezes não eram.(como uso ilimitado de programas pagos)&lt;br /&gt;&lt;br /&gt;De fato, a sabedoria popular é mais considerada do que a individual.&lt;br /&gt;Digo isso porque a um tempo atrás a linguagem object pascal só poderia ser chamada assim. Como a maioria dos programadores novatos assimilavam o nome da linguagem com o do compilador(delphi), o nome da linguagem basicamente hoje em dia pode ser ambos.&lt;br /&gt;Outro exemplo é a nossa língua em que palavras perdem acentos ou ganham de acordo com a forma que o povo mais escreve e fala.&lt;br /&gt;&lt;br /&gt;Muitos hoje enxergam os cavaleiros como homens cheios de honra, moral e ética quando na realidade, os cavaleiros na época das cruzadas só sabiam matar e estuprar mulheres inocentes.&lt;br /&gt;Assim é com hackers, na verdade a meu ver, o conceito só tem a ver com o conhecimento que você tem de hardwares e softwares... (vide o porquê do primeiro grupo de hackers terem se chamado assim)&lt;br /&gt;&lt;br /&gt;No entanto como a sabedoria popular é a que tem a "última palavra", então hackers são seres angelicais, cheios de ética e com uma perfeita pronúncia da nossa língua nativa.&lt;br /&gt;&lt;br /&gt;Crackers sempre foram e serão vistos como criaturas malvadas e quase sempre são confundidos com meros defacers com más intenções, principalmente em fóruns sensacionalistas.&lt;br /&gt;&lt;p&gt;Não que seja uma completa mentira, mas muitas vezes, um exagero.(poucos crackers praticam deface)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://sergaralho.blogspot.com/2008/10/shellcoding-parte-2-asm-bsico-21.html"&gt;clique aqui para ler a continuação&lt;/a&gt; &lt;/b&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4996807388995088672-2246938700847153342?l=sergaralho.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sergaralho.blogspot.com/feeds/2246938700847153342/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-1-introduo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/2246938700847153342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4996807388995088672/posts/default/2246938700847153342'/><link rel='alternate' type='text/html' href='http://sergaralho.blogspot.com/2008/10/shellcoding-parte-1-introduo.html' title='ShellCoding parte 1 - introdução'/><author><name>Sérgio</name><uri>http://www.blogger.com/profile/09020116777298139779</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
