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 passo a passo
A rotina que nos interessa é mostrada a seguir:
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 00401129 |. 68 A2324000 PUSH kiToKGNm.004032A2 0040112E |. 50 PUSH EAX 0040112F |. 68 70324000 PUSH kiToKGNm.00403270 00401134 |. E8 67070000 CALL kiToKGNm.004018A0 00401139 |. 68 A2324000 PUSH kiToKGNm.004032A2 ; /StringToAdd = "" 0040113E |. 68 D4324000 PUSH kiToKGNm.004032D4 ; |ConcatString = "" 00401143 |. E8 A0080000 CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA 00401148 |. 68 3E324000 PUSH kiToKGNm.0040323E ; /StringToAdd = "NTE0MDA4MjhOVEUwTURBNE==" 0040114D |. 68 D4324000 PUSH kiToKGNm.004032D4 ; |ConcatString = "" 00401152 |. E8 91080000 CALL <JMP.&kernel32.lstrcatA> ; \lstrcatA 00401157 |. 68 D4324000 PUSH kiToKGNm.004032D4 ; /String = "" 0040115C |. E8 93080000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA 00401161 |. A3 A0314000 MOV DWORD PTR DS:[4031A0],EAX 00401166 |. E8 3D060000 CALL kiToKGNm.004017A8 0040116B |. FF35 A0314000 PUSH DWORD PTR DS:[4031A0] 00401171 |. 68 D4324000 PUSH kiToKGNm.004032D4 00401176 |. E8 6D060000 CALL kiToKGNm.004017E8 0040117B |. E8 C8060000 CALL kiToKGNm.00401848 00401180 |. 33DB XOR EBX,EBX 00401182 |. 0318 ADD EBX,DWORD PTR DS:[EAX] 00401184 |. 0358 04 ADD EBX,DWORD PTR DS:[EAX+4] 00401187 |. 0358 08 ADD EBX,DWORD PTR DS:[EAX+8] 0040118A |. 0358 0C ADD EBX,DWORD PTR DS:[EAX+C] 0040118D |. 53 PUSH EBX ; /<%X> 0040118E |. 68 00304000 PUSH kiToKGNm.00403000 ; |Format = "%X" 00401193 |. 68 38334000 PUSH kiToKGNm.00403338 ; |s = kiToKGNm.00403338 00401198 |. E8 5D080000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA 0040119D |. 83C4 0C ADD ESP,0C 004011A0 |. C605 3C334000 >MOV BYTE PTR DS:[40333C],2D 004011A7 |. 6A 32 PUSH 32 ; /Count = 32 (50.) 004011A9 |. 68 6A334000 PUSH kiToKGNm.0040336A ; |Buffer = kiToKGNm.0040336A 004011AE |. 68 EA030000 PUSH 3EA ; |ControlID = 3EA (1002.) 004011B3 |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd 004011B6 |. E8 51080000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA 004011BB |. 68 6A334000 PUSH kiToKGNm.0040336A ; /String2 = "" 004011C0 |. 68 38334000 PUSH kiToKGNm.00403338 ; |String1 = "" 004011C5 |. E8 24080000 CALL <JMP.&kernel32.lstrcmpA> ; \lstrcmpA 004011CA |. C9 LEAVE 004011CB \. C2 0400 RETN 4
Acompanhe o passo a passo:
- F7 - Põe o valor 32h (50 decimal) na pilha (o painel da pilha é o inferior direito).
- F7 - Põe na pilha o endereço do buffer.
- F7 - Põe na pilha o ID de controle 3E9.
- F7 - Põe na pilha o manipulador da janela do executável.
- F8 - Tudo o que foi feito nos passos anteriores foi para preparar uma chamada à função GetDlgItemTextA. Use F8 para executar a função sem sair da linha de execução na qual nos encontramos. Observe que logo depois de retornar, a linha 0040112F mostra uma string com o nome do usuário,
0040112F |. 68 70324000 PUSH kiToKGNm.00403270 mostra 0040112F |. 68 70324000 PUSH kiToKGNm.00403270 ; ASCII "teste"
que a pilha foi realinhada com a retirada dos valores previamente inseridos e que o registrador EAX mostra o comprimento do nome. - F7 - Põe na pilha o endereço 004032A2.
- F7 - Põe na pilha o valor de EAX (comprimento do nome).
- F7 - Põe na pilha o nome do usuário (teste).
- F8 - Chama uma subrotina em 004018A0. Na volta da subrotina a pilha está novamente alinhada e agora a linha
00401139 |. 68 A2324000 PUSH kiToKGNm.004032A2 ; /StringToAdd = "" mostra 00401139 |. 68 A2324000 PUSH kiToKGNm.004032A2 ; /StringToAdd = "dGVzdGU="
Pausa para meditação: depois desta chamada, a string que deve ser adicionada é dGVzdGU=. Novamente está com jeito de codificação Base64 e meu palpite é que o nome do usuário foi codificado. Mais uma vez, rode o Base64 Enconder & Decoder e confira. UAU! É isto mesmo! Base64 de "teste" é "dGVzdGU=". Neste caso, a rotina que faz a codificação deve estar localizada no endereço 004018A0. Vamos guardar este endereço e explorá-lo mais tarde.