Inserte una cadena en la memoria con un carácter nulo

4

Estoy intentando implementar return-to-libc,
aquí está el código

void func(const char *str) {
    char buf[4];
    strcpy(buf,str);
    printf("you entered [%s]\n",buf);
}

int main(int argc, char *argv[]) {
    if(argc != 2) {
        printf("Need an argument\n");
        return 0;
    }
    func(argv[1]);
    return 0;
}

Ahora el problema es que la dirección de la función system que mi PC me da es de 6 dígitos hexadecimales en lugar de 8 dígitos hexadecimales (lo que significa que los dos dígitos delanteros son ceros), pero uso strcpy para copiar la cadena , que termina copiando la cadena tan pronto como encuentra un carácter nulo.

¿Alguna idea de cómo copiar la cadena completa que pase, incluido el carácter nulo?
O cualquier cosa que creas que me ayudará con esto, se agradece.

    
pregunta Jaydeep 24.09.2013 - 08:25
fuente

3 respuestas

3

Respuesta corta: No es posible directamente en strcpy .

Respuesta: El carácter nulo es el final de la cadena en strcpy ! y no puedes inyectar directamente un carácter nulo.

Pero puede usar para shellcode encoders / encryptors / compressor para eliminar su carácter nulo de shellcode o puede usar otras funciones con otro terminador de cadena. por ejemplo, gets (en obtiene el terminador de cadena, 0A )

    
respondido por el Sajjad Pourali 24.09.2013 - 09:34
fuente
5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void func(const char *str) {
    char buf[4];
    strcpy(buf,str);
    printf("you entered [%s]\n",buf);
}

int main(int argc, char *argv[]) {
    if(argc != 2) {
        printf("Need an argument\n");
        return 0;
    }
    func(argv[1]);
    return 0;
}

Compilé tu código con el siguiente comando.

gcc blah.c -o blah

Cracked open gdb .

[ayrx@localhost ~]$ gdb -q blah 
Reading symbols from /home/ayrx/blah...(no debugging symbols found)...done.
(gdb) run AAAAAAAAAAAAAAAABBBB
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/fedora/blah AAAAAAAAAAAAAAAABBBB
you entered [AAAAAAAAAAAAAAAABBBB]

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()

Aquí está el volcado de registro de gdb .

(gdb) info registers
eax            0x23 35
ecx            0x7fffffde   2147483614 
edx            0x0  0
ebx            0x4e735000   1316179968
esp            0xbffff160   0xbffff160
ebp            0x41414141   0x41414141 
esi            0x0  0
edi            0x0  0
eip            0x42424242   0x42424242
eflags         0x10286  [ PF SF IF RF ]
cs             0x73         115
ss             0x7b         123
ds             0x7b         123
es             0x7b         123
fs             0x0          0
gs             0x33         51

Como puede ver, el registro eip se ha sobrescrito con el último 4 B s de mi entrada.

El paso final será sobrescribir el registro eip para que apunte a la ubicación de su código de shell. Debido a que su búfer es pequeño, tendrá que encontrar alguna otra ubicación de memoria para guardar el código shell. Sobrescriba el registro eip para que apunte a esa ubicación y haya ganado. Te dejo esa parte a ti.

    
respondido por el Ayrx 24.09.2013 - 09:19
fuente
1

En este caso, no puedes saltar directamente a system . Podría considerar buscar alguna otra función de biblioteca a la que pueda saltar y que haga algo útil para usted. O puede extender esto a un ataque genérico de programación orientada al retorno y saltar a una serie de fragmentos de código.

En este caso, buscaría algunos fragmentos de código (dependientes de la posición) que le dan la capacidad de derivar la dirección de system y saltar a ella. Puede buscar un gadget que realice la instrucción and y usar and 0xcc 0x33 para obtener 0x00 o lo que sea. A continuación, necesitará un gadget que le permitirá saltar a su dirección derivada.

    
respondido por el lynks 24.09.2013 - 14:15
fuente

Lea otras preguntas en las etiquetas