Escribí un programa en C que es explotable para BOF.
TL; DR : mi carga (NOP-sled + shellcode + return address) anula EIP pero no puedo configurar EIP para que apunte a la dirección de mi carga útil, aunque puedo establecer EIP en estar en cualquier otro lugar fuera del rango de direcciones de Stack. La pila parece ser el ejecutable y las proyecciones con las que estoy familiarizado están desactivadas.
Envié una carga útil utilizando ragg2
De bruijin pattern, y encontré el desplazamiento que anula el EIP. Luego creé una carga útil con NOP-sled, luego shellcode, y en el desplazamiento que anula EIP escribí la dirección de la mitad de mi NOP-sled.
Entonces, la carga útil se parecía a esto: NOP-sled + Shellcode + Address somewhere at the middle of my NOP-Sled (Little Endian).
Ocurrió algo extraño y no pude explotar el programa: después del fallo de seguridad, EIP no estaba en la dirección que usé al final de mi carga, EIP fue como 600 direcciones después. Pero cuando cambié la dirección al final de mi carga útil a otra cosa, como "AABB" (0x42424141), o 0xd4d4 fd ff (en lugar de 0xd4d4 ff ff) una dirección en medio de mi código de shell, little-endian) funcionó bien y el EIP estaba en la dirección que proporcioné.
La protección de nx
está desactivada, ASLR
está deshabilitada, Selinux
deshabilitada, la página de memoria parece ser ejecutable y el ELF se compila usando "-fno-stack-protector -z execstack"
en GCC.
Lo probé también en gdb y también fuera de cualquier depurador.
¿Cuál puede ser el problema? ¿Por qué se niega a saltar a la dirección en la pila?
Información sobre el binario:
havecode true
pic false
canary false
nx false
crypto false
va true
intrp /lib/ld-linux.so.2
bintype elf
class ELF32
lang c
arch x86
bits 32
machine Intel 80386
os linux
minopsz 1
maxopsz 16
pcalign 0
subsys linux
endian little
stripped false
static false
linenum true
lsyms true
relocs true
rpath NONE
binsz 6162
Información sobre la pila:
sys 132K 0xfffdd000 - 0xffffe000 s -rwx [stack] [stack] ; map._stack_._rwx
EDITAR: Puede encontrar más detalles, incluidos los comandos y el código shell mismo aquí: enlace