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):
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_1phase_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:
Ótima postagem !
Valeu!! ;)
Postar um comentário