Oficina
kiTo KGNmeAGAiN (C-1)
Seg 28 Ago 2006 10:20 |
- Detalhes
- Categoria: Pilotando o rato C-1
- Atualização: Quarta, 22 Abril 2009 11:09
- Autor: vovó Vicki
- Acessos: 11876
Debugando com o OllyDbg
Rode o OllyDbg e carregue o executável. Digite F9 para executar o programa, forneça o nome do usuário, o serial e clique no botão [Check]. Nada acontece, mas o OllyDbg não trava. Bom, muito bom! Sinal de que o programa não possui código anti-debugger.
Agora vamos procurar um ponto de apoio para colocar um breakpoint. Para isto, clique com o botão direito do mouse no painel de código do OllyDbg e dê mais uma conferida nas strings escolhendo os itens de menu Search for e All referenced text strings. A coisa parece um pouco melhor do que quando procuramos strings com o PEid. O OllyDbg mostra o seguinte:
Text strings referenced in kiToKGNm:.text Address Disassembly Text string 00401040 PUSH kiToKGNm.0040323E ASCII "NTE0MDA4MjhOVEUwTURBNE==" 00401072 PUSH kiToKGNm.0040304B ASCII "kiTo - KgnMe AGAiN!" 004010B8 PUSH kiToKGNm.00403000 ASCII "%X" 004010BD PUSH kiToKGNm.004031A8 ASCII "51400828" 004010CA PUSH kiToKGNm.004031DA ASCII "NTE0MDA4Mjg=" 004010D1 PUSH kiToKGNm.004031A8 ASCII "51400828" 004010DB PUSH kiToKGNm.004031A8 ASCII "51400828" 004010E0 PUSH kiToKGNm.0040320C ASCII "51400828NTE0MDA4Mjg=" 004010EA PUSH kiToKGNm.004031DA ASCII "NTE0MDA4Mjg=" 004010EF PUSH kiToKGNm.0040320C ASCII "51400828NTE0MDA4Mjg=" 004010F9 PUSH kiToKGNm.0040323E ASCII "NTE0MDA4MjhOVEUwTURBNE==" 00401100 PUSH kiToKGNm.0040320C ASCII "51400828NTE0MDA4Mjg=" 00401117 PUSH kiToKGNm.00403270 ASCII "teste" 0040112F PUSH kiToKGNm.00403270 ASCII "teste" 00401148 PUSH kiToKGNm.0040323E ASCII "NTE0MDA4MjhOVEUwTURBNE==" 0040118E PUSH kiToKGNm.00403000 ASCII "%X" 004011D6 MOV EDI,kiToKGNm.004033B0 (Initial CPU selection)
Dê só uma olhada na porção de strings que terminam com = ou ==. Lembra alguma coisa? Tudo indica que seja material codificado com Base64. Só por curiosidade, dispare seu x3chun's Base64 Encoder & Decoder e decodifique algumas delas. A NTE0MDA4MjhOVEUwTURBNE==, por exemplo, é decodificada em 51400828NTE0MDA4@ e a 51400828NTE0MDA4Mjg= em ç^4Óͼ51400828. Não ajudou muito, mas dá para desconfiar que alguma coisa serviu de base para estes cálculos. De alguma forma este código deve ter importância porque um deles, NTE0MDA4MjhOVEUwTURBNE==, é o que aparece na área de texto do programa (o seu, provavelmente, é diferente ).
Passo seguinte será procurar um gancho em alguma função da API. Como existem duas caixas de texto nas quais informamos nome e serial, para pegar estes valores geralmente se usa a função GetDlgItemTextA que fica na DLL user32 do sistema Windows. Para ver quais chamadas o executável faz, clique com o botão direito do mouse na área de código do OllyDbg, escolha Search for e All intermodular calls. Na janela apresentada encontramos vários tipos de chamada e, como esperado, duas chamadas à função GetDlgItemTextA. Dê um duplo clique sobre a primeira para deslocar o código para o endereço correspondente. Role o código para baixo até encontrar o início da rotina e coloque um breakpoint no início do controle de comprimento do nome do usuário (pode ter no máximo 50 caracteres):
0040110B /$ 55 PUSH EBP 0040110C |. 8BEC MOV EBP,ESP 0040110E |. C605 D4324000 >MOV BYTE PTR DS:[4032D4],0 00401115 |. 6A 32 PUSH 32 ; /Count = 32 (50.) 00401117 |. 68 70324000 PUSH kiToKGNm.00403270 ; |Buffer = kiToKGNm.00403270 0040111C |. 68 E9030000 PUSH 3E9 ; |ControlID = 3E9 (1001.) 00401121 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd 00401124 |. E8 E3080000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
Use a tecla F9 para rodar o programa e bingo! A execução pára no breakpoint. Agora é só ir no passo a passo e tentar entender o que as instruções estão fazendo.