Inserisci una stringa nella memoria con carattere null

4

Sto cercando di implementare return-to-libc,
ecco il codice

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;
}

Ora il problema è che l'indirizzo della funzione system che il mio pc mi dà è di 6 cifre esadecimali invece di 8 cifre esadecimali (il che significa che le due cifre anteriori sono zero), ma io uso strcpy per copiare la stringa , che termina copiando la stringa non appena incontra un carattere nullo.

Qualche idea su come copiare l'intera stringa che passo, incluso il carattere null?
O tutto ciò che ritieni possa aiutarmi con questo, è apprezzato.

    
posta Jaydeep 24.09.2013 - 08:25
fonte

3 risposte

3

Risposta breve: Non è possibile direttamente in strcpy .

Risposta: Il carattere null è la fine della stringa in strcpy ! e non puoi iniettare direttamente un carattere null.

Ma puoi usare per shellcode encoders / encryptors / compressor per rimuovere il tuo carattere null shellcode o puoi usare altre funzioni con un altro terminatore di stringhe. per esempio gets (in gets string terminator is, 0A )

    
risposta data 24.09.2013 - 09:34
fonte
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;
}

Ho compilato il tuo codice con il seguente 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 ?? ()

Ecco il dump del registro da 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

Come puoi vedere, il registro eip è stato sovrascritto con l'ultimo 4% diB s dal mio input.

Il passaggio finale sarà sovrascrivere il registro eip in modo che punti alla posizione dello shellcode. Poiché il tuo buffer è piccolo, dovrai trovare un altro spazio di memoria per riporre lo shellcode. Sovrascrivi il registro eip per puntare a quella posizione e hai vinto. Lascerò quella parte a te.

    
risposta data 24.09.2013 - 09:19
fonte
1

Quindi in questo caso non puoi saltare direttamente a system . Potresti considerare di cercare qualche altra funzione di libreria a cui puoi saltare per fare qualcosa di utile per te. Oppure puoi estendere questo a un generico attacco orientato alla restituzione e passare a una serie di frammenti di codice.

In questo caso, cercheresti alcuni frammenti di codice (dipendenti dalla posizione) che ti daranno la possibilità di ricavare l'indirizzo di system e di saltare ad esso. Potresti cercare un gadget che esegua l'istruzione and e utilizzare and 0xcc 0x33 per ottenere 0x00 o altro. Avrai quindi bisogno di un gadget che ti permetta di saltare al tuo indirizzo derivato.

    
risposta data 24.09.2013 - 14:15
fonte

Leggi altre domande sui tag