12 de set de 2014

Bomba binária

A bomba binária é um projeto de laboratório do livro "Computer Systems - A Programmer's Perspective" do Randal E. Bryant e David R. O'Hallaron, distribuido no site http://csapp.cs.cmu.edu/. É um ótimo treinamento para o assembly x86.   
  • A bomba binária - by: Dr. Evil:
O malígno Dr. Evil plantou algumas 'bombas binárias' em algumas máquinas. Uma bomba binária é um programa que consiste em uma sequência de fases. Em cada fase é preciso digitar uma string particular na entrada padrão (stdin). Se você digitar a string correta, então a fase é 'desarmada' e prossegue para a próxima. Caso contrário, a bomba explode imprimindo 'BOOM!!!' e é encerrado. 

  • Dicas e Ferramentas:
Existem várias maneiras para desarmar a bomba. Você pode usar a força bruta, examinar detalhadamente o programa para prever o que ele faz ou depurar, olhando o passo a passo e usar as informações para desarma-la (provavelmente a maneira mais rápida):

$ objdump -t bomb
Mostra a tabela de símbolos, que inclui o nome de todas as variaveis globais, funções e seus endereços. 

$ objdump -d bomb
Essa opção desmonta o código da bomba. Ler cada código assembly pode ajudar a ver como cada fase funciona. 
$ strings bomb
Lista as strings.


Usando essas ferramentas, podemos notar que após a bomba ser ativada pela rotina initialize_bomb, o main segue os mesmos padrões: lê do stdin, chama a fase correspondente e se a entrada estiver correta, vai para a próxima fase, senão chama a função explode_bomb, explodindo a bomba - BOOM!!! Então, temos que olhar nas seguintes rotinas:
phase_1
phase_2
phase_3
phase_4
phase_5
phase_6


Fase 1:
08048b20 <phase_1>:
 8048b20:    55                       push   %ebp
 8048b21:    89 e5                    mov    %esp,%ebp
 8048b23:    83 ec 08                 sub    $0x8,%esp
 8048b26:    8b 45 08                 mov    0x8(%ebp),%eax
 8048b29:    83 c4 f8                 add    $0xfffffff8,%esp
 8048b2c:    68 c0 97 04 08           push   $0x80497c0
 8048b31:    50                       push   %eax
 8048b32:    e8 f9 04 00 00           call   8049030 <strings_not_equal>
 8048b37:    83 c4 10                 add    $0x10,%esp


Aqui observamos que o  %ebp, $0x80497c0 e %eax são puxados na pilha e a  rotina strings_not_equal é chamada.

 8048b3a:    85 c0                    test   %eax,%eax
 8048b3c:    74 05                    je     8048b43 <phase_1+0x23>
 8048b3e:    e8 b9 09 00 00           call   80494fc <explode_bomb>
 8048b43:    89 ec                    mov    %ebp,%esp
 8048b45:    5d                       pop    %ebp
 8048b46:    c3                       ret   
 8048b47:    90                       nop
 

O valor de retorno geralmente  é armazenado no registro %eax. Aqui o código está testando o valor do registro e se for diferente de zero a função chama o explode_bomb. Se for igual, ele pula para 8048b46. Podemos olhar na rotina strings_not_equal para identificar os argumentos passados ou olhar na localização da memória para identificar as strings passadas. Portanto precisamos olhar os caracteres localizados no %ebp, $0x80497c0 e %eax:
$ gdb bomb
(gdb) break phase_1

Breakpoint 1 at 0x8048b26
(gdb) run
Starting program: /home/zeldani/bomb
Welcome to my fiendish little bomb. You have 6 phases with
which to blow yourself up. Have a nice day!

Qual a solucao da phase_1? essa eh a minha string de teste para achar onde ela sera armazenada

(gdb) x /30c 0x80497c0
0x80497c0:    80 'P'    117 'u'    98 'b'    108 'l'    105 'i'    99 'c'    32 ' '    115 's'
0x80497c8:    112 'p'    101 'e'    97 'a'    107 'k'    105 'i'    110 'n'    103 'g'    32 ' '
0x80497d0:    105 'i'    115 's'    32 ' '    118 'v'    101 'e'    114 'r'    121 'y'    32 ' '
0x80497d8:    101 'e'    97 'a'    115 's'    121 'y'    46 '.'    0 '\000'


Encontramos a solução da phase_1:
"Public speaking is very easy."

As próximas fases são parecidas com a phase_1. Primeiro olhe para o código assembly para entender o padrão, dê o breakpoint no local exato e olhe para o conteúdo os registros.

Boa diversão!!! ;P 


* Fontes:
http://www.csc.villanova.edu/~mdamian/Past/csc2400fa11/assign/bomblab.pdf
http://www.cs.rochester.edu/courses/252/spring2014/assignments/A2.shtml
http://ins3cure.blogspot.com.br/2013/02/defusing-binary-bomb.html
http://www.mauchle.name/bomblab.txt

2 comentários:

Greyson "Kazenin" disse...

Ótima postagem !

Zeldani: disse...

Valeu!! ;)

Postar um comentário