A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Oficina

kiTo KGNmeAGAiN (C-1)

Seg

28

Ago

2006


10:20

(7 votos, média 5.00 de 5) 


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 smile ).

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.

Informações adicionais