Seguridad de red | Aprendizaje de entrada de prueba de penetración, desde cero entrada básica hasta competencia: tecnología de análisis dinámico Detalles del caso de OllyDbg

Tabla de contenido

1. Preparación

 2. Cargue el archivo de destino para la depuración

 3. Seguimiento de un solo paso

4. Establecer puntos de interrupción

5. Análisis de depuración


 

1. Preparación


Analizar un programa de Windows es mucho más fácil que analizar un programa de DOS porque mientras se utilicen las funciones API en Windows, es más difícil ocultar cierta información a las personas que buscan pistas. Por lo tanto, al analizar un programa, es más importante utilizar qué función API como punto de entrada. Si tiene algo de experiencia en programación, será más útil en este sentido.

Para facilitar la comprensión, echemos un breve vistazo al proceso de verificación del número de serie de TraceMe, como se muestra en la Figura 25. Ingrese el nombre de usuario y el número de serie en el cuadro de texto. El programa llama a la función GetDigltemTextA para leer los caracteres y luego calcular, y finalmente usar la función lstremp para comparar. Por lo tanto, estas funciones invocadas son los objetivos del seguimiento de descifrado.Usando estas funciones como puntos de interrupción y rastreando el proceso de verificación del número de serie del programa, se puede encontrar el número de serie correcto. Este tipo de pequeño programa especialmente diseñado para practicar la tecnología de descifrado se conoce generalmente como "CrackMe".

 2. Cargue el archivo de destino para la depuración

Para que OllyDbg interrumpa en el punto de entrada del programa, se deben realizar los ajustes correspondientes antes de cargar el programa. Ejecute OlyDbg, haga clic en "Opciones" - opción "Opciones de depuración" para abrir el cuadro de diálogo de configuración de opciones de depuración. Haga clic en la pestaña "Evento" para configurar los métodos de procesamiento de OllyDhg para eventos como el punto de entrada de interrupción, la carga/descarga de módulos, la creación/finalización de subprocesos, etc. Generalmente, solo necesita configurar el punto de interrupción en "WinMain"
.

Una vez completada la configuración, haga clic en "Archivo" - "Abrir" para abrir TraceMeexe. En este momento, 0llyDbg interrumpirá el código de análisis del depurador en la primera instrucción de TraceMe y esperará la próxima operación del usuario. Como se muestra en la siguiente figura, cuando el cursor se detiene en 004013AOh, 004013A0h es el punto de entrada del programa (EntryPoint). La mayoría de los programas se detienen en el punto de entrada cuando comienzan. A través de algunos métodos de modificación especiales, algunos programas no pueden detenerse en el punto de población cuando se inician, a fin de lograr el propósito de evitar la depuración. El significado de cada parte del código es el siguiente.

  • Dirección virtual: En general, la misma instrucción de un mismo programa tiene el mismo valor en diferentes entornos de sistema.
  • Código máquina: Es el código máquina ejecutado por la CPU.
  • Instrucción de montaje: código de programa correspondiente al código de máquina

 El panel de registro muestra el valor actual de cada registro. Los registros incluyen EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI y EIP, etc., que se denominan colectivamente como registros de 32 bits, como se muestra en la siguiente figura. ESP es un puntero, y el valor de la pila se muestra en el panel de pila en la esquina inferior derecha de la interfaz de OllyDbg. Otro registro importante es EIP, que apunta a la instrucción actual a ejecutar, al presionar la tecla "F7" se ejecutará una instrucción, y luego EIP apuntará a la siguiente instrucción a ejecutar.

Al depurar, puede hacer doble clic en estos registros para modificar los valores en los registros. Sin embargo, el registro EIP no se puede modificar directamente. Debe seleccionar una nueva dirección de inicio de instrucción en la ventana de desmontaje, como 004013AAh, haga clic con el botón derecho en él y seleccione "Nuevo origen aquí" en el menú contextual emergente (aquí está la nueva opción EIP EIP El valor de se convertirá en 4013AAh, y el programa comenzará a ejecutarse a partir de esta instrucción Debajo de los registros están los registros de bandera, que son C, P, A, ZS, T, D, 0 y sus valores Solo pueden ser dos valores digitales -0 y 1, haga doble clic en el número para cambiar entre 0 y 1.

 3. Seguimiento de un solo paso

Una de las funciones más básicas de un depurador es el seguimiento dinámico. 0llyDbg controla los comandos en ejecución en el menú "Depurar", y cada elemento del menú tiene una tecla de acceso directo correspondiente. Las teclas de método abreviado de seguimiento de un solo paso de olyDhg se muestran en la siguiente figura.

tecla de acceso rápido Función
F7 Seguimiento paso a paso cuando se encuentre con una instrucción de llamada
F8 Paso a paso, pase cuando encuentre una instrucción de llamada, no haga un seguimiento
Ctrl+F9 Interrumpir hasta que ocurra una instrucción rer
Alt+F9 Si ingresa al espacio aéreo del sistema, este comando puede regresar instantáneamente al espacio aéreo de la aplicación
F9 ejecuta el programa
F2 establecer punto de interrupción

La tecla "F8" se utiliza con frecuencia en la depuración. Puede ejecutar instrucciones de ensamblaje frase por frase y paso a paso. Cuando se encuentra con una instrucción de llamada, no la seguirá sino que la pasará. El ejemplo es el siguiente.

 La principal diferencia entre la tecla "F7" y la tecla "F8" es que si encuentra un comando como callloop, presione la tecla "F8" para pasar y presione la tecla "F7 para seguir. El ejemplo es como sigue.

"call00401DA0" significa llamar a la subrutina en 00401DAOh. Una vez que se llama a la subrutina, se vuelve a la siguiente declaración a la que apunta la llamada, que es 004013FFh. Presione la tecla "F7" para seguir la subrutina en 00401DAOh, observe la situación, encontrará que la dirección 004013FFh de la siguiente instrucción de la instrucción de llamada se inserta en la pila como la dirección de retorno, como se muestra en la Figura 28. Al final de la subrutina hay una instrucción ret que ejecuta la instrucción en 00401DD7h y regresa a la siguiente instrucción 004013FFh señalada por la llamada. En el proceso de ingresar la subrutina, si desea volver a ver el código que ha rastreado en un solo paso anteriormente, puede presionar la tecla "-" (signo menos); si desea que el cursor regrese a la declaración señalada por el EIP actual, puede hacer clic en el botón C o hacer doble clic en el registro EIP.

 Al presionar la tecla "F7" o "F8" repetidamente, OllyDbg proporciona las teclas de método abreviado "Ctl+F7" y "Ctrl+F8" hasta que el usuario presiona la tecla "Esc", la tecla "F12" o encuentra otros puntos de interrupción para detenerse
. está en un dedo de llamada y desea volver a la posición donde se llama el dedo cl, puede presionar la tecla de método abreviado "Ctrl+F9" para ejecutar el comando Executetillreum" (ejecutar para regresar). OllyDhg se detendrá en el primer retorno comando encontrado (retretf o iret).Esto puede omitir fácilmente algún código inútil.

 Por ejemplo, si el código anterior está en 00401DAO, si presiona la tecla de método abreviado "Ctl+F9", volverá a 004013FFh. Se puede configurar en las opciones si hacer una pausa o pasar cuando se encuentra con el dedo Et. El método consiste en abrir el cuadro de diálogo de opciones de configuración de depuración y establecer "Después de ejecutar hasta RETpaso sobre RET" en la pestaña "Rastrear" (después de ejecutar la instrucción ret, paso a través de la instrucción ret).
Si ha ingresado a la función API proporcionada por el sistema DLL, puede presionar la tecla de acceso directo "Alt+F9" para ejecutar el comando "Executetillusercode" (ejecutar al código de usuario) cuando desee regresar al espacio aéreo del programa de aplicación. El ejemplo es el siguiente.

 Presione la tecla "F7" en 004013C6h para seguir el sistema KERNEL32DLL, el ejemplo es el siguiente.

"7C8114AB" y así sucesivamente son los espacios de direcciones donde se encuentra la DLL del sistema. En este momento, simplemente presione la tecla de acceso directo "Alt+F9" para volver al espacio aéreo de la aplicación. El código es el siguiente. 

 Nota: el llamado "espacio aéreo" en realidad se refiere al propietario de una determinada pieza de código señalada por el CS:EIP de la CPU en un momento determinado.

Si no desea realizar un seguimiento de un solo paso y desea ejecutar el programa directamente, puede presionar la tecla "F9" o hacer clic en el botón derecho en la barra de herramientas. Si desea volver a depurar el programa de destino, puede presionar la tecla de método abreviado "Ctrl+F2", OllyDhg finalizará el proceso de depuración y lo volverá a cargar. Si el programa entra en un ciclo infinito, puede presionar la tecla "F12" para suspender el programa.

4. Establecer puntos de interrupción

Breakpoint (punto de interrupción) es una función importante del depurador, que puede hacer que el programa se rompa en el lugar especificado, para analizarlo convenientemente. Como se muestra en la figura a continuación, mueva el cursor a 004013A5h y presione la tecla "F2" para establecer un punto de interrupción y presione la tecla "F2" nuevamente para cancelar el punto de interrupción. También puede hacer doble clic en la línea correspondiente en la columna "Hexdump" para establecer un punto de interrupción y hacer doble clic nuevamente para cancelar el punto de interrupción.

 Después de configurar el punto de interrupción, presione la tecla de método abreviado "Alt+B" o haga clic en el botón B para abrir la ventana del punto de interrupción y ver los detalles del punto de interrupción como se muestra en la siguiente figura. Aquí se muestran los puntos de interrupción distintos de los puntos de interrupción de hardware, donde "Siempre" significa que el punto de interrupción está activo y "Deshabilitar" significa que el punto de interrupción está deshabilitado. Presiona la barra espaciadora para alternar su estado. Estos puntos de interrupción también se pueden administrar a través del menú contextual. El acceso directo para eliminar un punto de interrupción es la tecla "Supr".

 

00B2A5C8   .  E8 1BAA0000   call 路径修复.00B34FE8                       ; \路径修复.00B34FE8
00B2A5CD   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A5CE   .  B8 4D5A0000   mov eax,0x5A4D
00B2A5D3   .  66:3905 0000B>cmp word ptr ds:[0xB20000],ax
00B2A5DA   .  74 04         je short 路径修复.00B2A5E0
00B2A5DC   >  33DB          xor ebx,ebx
00B2A5DE   .  EB 33         jmp short 路径修复.00B2A613
00B2A5E0   >  A1 3C00B200   mov eax,dword ptr ds:[0xB2003C]
00B2A5E5   .  81B8 0000B200>cmp dword ptr ds:[eax+0xB20000],0x4550
00B2A5EF   .^ 75 EB         jnz short 路径修复.00B2A5DC
00B2A5F1   .  B9 0B010000   mov ecx,0x10B
00B2A5F6   .  66:3988 1800B>cmp word ptr ds:[eax+0xB20018],cx
00B2A5FD   .^ 75 DD         jnz short 路径修复.00B2A5DC
00B2A5FF   .  33DB          xor ebx,ebx
00B2A601   .  83B8 7400B200>cmp dword ptr ds:[eax+0xB20074],0xE
00B2A608   .  76 09         jbe short 路径修复.00B2A613
00B2A60A   .  3998 E800B200 cmp dword ptr ds:[eax+0xB200E8],ebx
00B2A610   .  0f95c3        setne bl
00B2A613   >  895D E4       mov dword ptr ss:[ebp-0x1C],ebx
00B2A616   .  E8 067C0000   call 路径修复.00B32221
00B2A61B   .  85C0          test eax,eax
00B2A61D   .  75 08         jnz short 路径修复.00B2A627
00B2A61F   .  6A 1C         push 0x1C
00B2A621   .  E8 DC000000   call 路径修复.00B2A702
00B2A626   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A627   >  E8 F4690000   call 路径修复.00B31020
00B2A62C   .  85C0          test eax,eax
00B2A62E   .  75 08         jnz short 路径修复.00B2A638
00B2A630   .  6A 10         push 0x10
00B2A632   .  E8 CB000000   call 路径修复.00B2A702
00B2A637   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A638   >  E8 94AA0000   call 路径修复.00B350D1
00B2A63D   .  8365 FC 00    and dword ptr ss:[ebp-0x4],0x0
00B2A641   .  E8 EE7E0000   call 路径修复.00B32534
00B2A646   .  85C0          test eax,eax
00B2A648   .  79 08         jns short 路径修复.00B2A652
00B2A64A   .  6A 1B         push 0x1B
00B2A64C   .  E8 B1000000   call 路径修复.00B2A702
00B2A651   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A652   >  FF15 3400B400 call dword ptr ds:[<&KERNEL32.GetCommand>; [GetCommandLineA
00B2A658   .  A3 C8DCB400   mov dword ptr ds:[0xB4DCC8],eax
00B2A65D   .  E8 AFAA0000   call 路径修复.00B35111
00B2A662   .  A3 4CBDB400   mov dword ptr ds:[0xB4BD4C],eax
00B2A667   .  E8 52A40000   call 路径修复.00B34ABE
00B2A66C   .  85C0          test eax,eax
00B2A66E   .  79 08         jns short 路径修复.00B2A678
00B2A670   .  6A 08         push 0x8
00B2A672   .  E8 6D820000   call 路径修复.00B328E4
00B2A677   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A678   >  E8 70A60000   call 路径修复.00B34CED
00B2A67D   .  85C0          test eax,eax
00B2A67F   .  79 08         jns short 路径修复.00B2A689
00B2A681   .  6A 09         push 0x9
00B2A683   .  E8 5C820000   call 路径修复.00B328E4
00B2A688   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A689   >  6A 01         push 0x1                                 ; /Arg1 = 00000001
00B2A68B   .  E8 8E820000   call 路径修复.00B3291E                       ; \路径修复.00B3291E
00B2A690   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A691   .  85C0          test eax,eax
00B2A693   .  74 07         je short 路径修复.00B2A69C
00B2A695   .  50            push eax
00B2A696   .  E8 49820000   call 路径修复.00B328E4
00B2A69B   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A69C   >  E8 FDAA0000   call 路径修复.00B3519E
00B2A6A1   .  56            push esi                                 ; /Arg4 = 00B2A5A8
00B2A6A2   .  50            push eax                                 ; |Arg3 = 010FFC98
00B2A6A3   .  6A 00         push 0x0                                 ; |Arg2 = 00000000
00B2A6A5   .  68 0000B200   push 路径修复.00B20000                       ; |Arg1 = 00B20000
00B2A6AA   .  E8 B1CBFFFF   call 路径修复.00B27260                       ; \路径修复.00B27260
00B2A6AF   .  8BF0          mov esi,eax
00B2A6B1   .  8975 DC       mov dword ptr ss:[ebp-0x24],esi          ;  路径修复.<ModuleEntryPoint>
00B2A6B4   .  85DB          test ebx,ebx
00B2A6B6   .  75 06         jnz short 路径修复.00B2A6BE
00B2A6B8   .  56            push esi                                 ;  路径修复.<ModuleEntryPoint>
00B2A6B9   .  E8 C9840000   call 路径修复.00B32B87
00B2A6BE   >  E8 4C820000   call 路径修复.00B3290F
00B2A6C3   .  EB 2E         jmp short 路径修复.00B2A6F3
00B2A6C5   .  8B4D EC       mov ecx,dword ptr ss:[ebp-0x14]
00B2A6C8   .  8B01          mov eax,dword ptr ds:[ecx]
00B2A6CA   .  8B00          mov eax,dword ptr ds:[eax]
00B2A6CC   .  8945 E0       mov dword ptr ss:[ebp-0x20],eax
00B2A6CF   .  51            push ecx                                 ;  路径修复.<ModuleEntryPoint>
00B2A6D0   .  50            push eax
00B2A6D1   .  E8 8DA20000   call 路径修复.00B34963
00B2A6D6   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A6D7   .  59            pop ecx                                  ;  kernel32.777D0099
00B2A6D8   .  C3            retn
00B2A6D9   .  8B65 E8       mov esp,dword ptr ss:[ebp-0x18]
00B2A6DC   .  8B75 E0       mov esi,dword ptr ss:[ebp-0x20]
00B2A6DF   .  8975 DC       mov dword ptr ss:[ebp-0x24],esi          ;  路径修复.<ModuleEntryPoint>
00B2A6E2   .  837D E4 00    cmp dword ptr ss:[ebp-0x1C],0x0
00B2A6E6   .  75 06         jnz short 路径修复.00B2A6EE
00B2A6E8   .  56            push esi                                 ;  路径修复.<ModuleEntryPoint>
00B2A6E9   .  E8 B4820000   call 路径修复.00B329A2
00B2A6EE   >  E8 0D820000   call 路径修复.00B32900
00B2A6F3   >  C745 FC FEFFF>mov dword ptr ss:[ebp-0x4],-0x2
00B2A6FA   .  8BC6          mov eax,esi                              ;  路径修复.<ModuleEntryPoint>
00B2A6FC   .  E8 847C0000   call 路径修复.00B32385
00B2A701   .  C3            retn
00B2A702  /$  55            push ebp

5. Análisis de depuración

Presione la tecla "F8" para salir de la función GetDlllemTextA. Por supuesto, también puede presionar la tecla de atajo "Alt+F9" para regresar al lugar donde se llamó a la función. OllyDbg es muy potente. Ha anotado los parámetros de llamada y los valores actuales de cada función. Los códigos relevantes son los siguientes.

 Al leer estos códigos, hay algunas cosas a tener en cuenta.

  • Sea claro acerca de la definición de cada función de la API (consulte el manual de la API correspondiente)
  • La mayoría de las funciones de la API adoptan la convención de llamada sdcall, es decir, los parámetros de población de la función se colocan en la pila en el orden de derecha a izquierda, y el receptor de la llamada limpia los parámetros en la pila, y el valor devuelto se coloca en el registro eax. . Por lo tanto, para las funciones API relevantes, es necesario analizar las instrucciones de inserción que se encuentran delante de ellas. Estas instrucciones colocan parámetros en la pila para transferirlos a la llamada API. Preste atención a los cambios de los datos de la pila durante todo el proceso de seguimiento.
  • La subrutina en el código C adopta la convención de llamada de C, y los parámetros de la población de la función se agregan a la pila en orden de derecha a izquierda, y la persona que llama borra los parámetros de la pila.
  • Convención de llamada, transferencia de parámetros y otros conocimientos, la función GetDlgItemText utiliza la convención de llamada estándar y los parámetros se colocan en la pila en el orden de derecha a izquierda. El código ensamblador para este ejemplo es el siguiente:
00B2A728  \.  C3            retn
00B2A729      CC            int3
00B2A72A      CC            int3
00B2A72B      CC            int3
00B2A72C      CC            int3
00B2A72D      CC            int3
00B2A72E      CC            int3
00B2A72F      CC            int3
00B2A730   $  57            push edi                                 ;  路径修复.<ModuleEntryPoint>
00B2A731   .  56            push esi                                 ;  路径修复.<ModuleEntryPoint>
00B2A732   .  8B7424 10     mov esi,dword ptr ss:[esp+0x10]          ;  ntdll.77C67B6E
00B2A736   .  8B4C24 14     mov ecx,dword ptr ss:[esp+0x14]
00B2A73A   .  8B7C24 0C     mov edi,dword ptr ss:[esp+0xC]
00B2A73E   .  8BC1          mov eax,ecx                              ;  路径修复.<ModuleEntryPoint>
00B2A740   .  8BD1          mov edx,ecx                              ;  路径修复.<ModuleEntryPoint>
00B2A742   .  03C6          add eax,esi                              ;  路径修复.<ModuleEntryPoint>

 

Supongo que te gusta

Origin blog.csdn.net/qq_22903531/article/details/131390235
Recomendado
Clasificación