PDA

Visualizza la versione completa : [C] Funzioni


Puffolott0
26-05-2004, 12:19
So che è possibile far puntare una funzione da un puntatore...
Questo significa che le istruzioni delle funzioni stanno in memoria (credo)...
Ho bisogno di creare una funzione run-time in C, in base a ciò che scrive l'utente (fate finta che voglia realizzare un interprete per un linguaggio)...
Come faccio quindi a memorizzare in memoria una funzione? E' possibile farlo? Serve di conoscere l'assembler?

Grazie
PuffolottO
:ciauz:

anx721
26-05-2004, 13:52
I puntatori a funzione non si usano per questo, la funzione deve gia essere scritta nel codice, quello che vuoi fare tu mi sembra una cosa diversa, perche dovresti prendere quello che scrive l'utente, compilarlo usando il compilaotre c e creando un file oggetto o una loibreria e poi invocare la funzione in essa contenuta.

Puffolott0
27-05-2004, 10:54
Originariamente inviato da anx721
I puntatori a funzione non si usano per questo, la funzione deve gia essere scritta nel codice, quello che vuoi fare tu mi sembra una cosa diversa, perche dovresti prendere quello che scrive l'utente, compilarlo usando il compilaotre c e creando un file oggetto o una loibreria e poi invocare la funzione in essa contenuta.
Come non è possibile? Che cambia tra un valore già in memoria e uno che vado a scrivere io?
Comunque ho letto di un modo per fare i virus, chiamato buffer overflow che va a scrivere funzioni in memoria e poi vengono eseguite per ottenere permessi normalmente non concessi...
Il problema è che non voglio fare un virus, e non vorrei che il mio programma sia facile da sfruttare col buffer overflow... Non c'è il modo per scrivere in memoria una funzione dove normalmente ci vanno dati senza rendere un programma vulnerabilissimo?

Fox82
27-05-2004, 10:59
Tieni conto che le istruzioni che trovi in memoria non sono istruzioni in linguaggio c ma in linguaggio macchina...

Quindi le cose che dovresti fare sarebbero:

[list=1]
Prendere in input il codice dall'utente
Parsarlo (puoi farlo fare anche al compilatore)
Compilarlo
Caricare le istruzioni in memoria manualmente
[/list=1]

Ammesso che questo sia possibile si tratta di programmazione di bassissimo livello, praticamente devi fare manualmente quello che il SO fa quando esegui un programma

/dev/null
27-05-2004, 20:10
Originariamente inviato da Fox82
Tieni conto che le istruzioni che trovi in memoria non sono istruzioni in linguaggio c ma in linguaggio macchina...

Quindi le cose che dovresti fare sarebbero:
[list=1] Prendere in input il codice dall'utente
Parsarlo (puoi farlo fare anche al compilatore)
Compilarlo
Caricare le istruzioni in memoria manualmente[/list=1]

Ammesso che questo sia possibile si tratta di programmazione di bassissimo livello, praticamente devi fare manualmente quello che il SO fa quando esegui un programma Io non la vedrei così tragica la cosa...





Prova a guardare QUI' (http://www.dia.unisa.it/professori/ads/corso-security/www/CORSO-0001/StackGuard/paragrafo6.htm): è un programma che spiega come funziona il buffer overflow e sembra che crei manualmente una funzione (per sfruttare appunto il buffer overflow)...
A prima vista (a vedere i commenti) mi sembra semplicemente assembler scritto in esadecimale... Quindi non dev essere impossibile da realizzare... E non c'è bisogno di compilarlo...
Inoltre se le funzioni da interpretare sono poche e semplici credo che non sia molto difficile da realizzare...

Nonostante ciò non so quanto possa essere utile la cosa... Penso che tu faccia prima a processare il programma istruzione per istruzione che non a processarlo per scriverlo in memoria sotto forma di funzione e poi eseguirlo...

La cosa comunque interessa anche a me, non per poter usare questo metodo (non ne ho mai avuto bisogno e non so se ne avrò mai, inoltre non so quanto sia sicuro), ma per saperne di più su come viene gestito il codice etc...
Se quindi scoprite qualcosa avvisatemi!

:ciauz:

iguana13
27-05-2004, 20:28
Originariamente inviato da Puffolott0
So che è possibile far puntare una funzione da un puntatore...
Questo significa che le istruzioni delle funzioni stanno in memoria (credo)...
Ho bisogno di creare una funzione run-time in C, in base a ciò che scrive l'utente (fate finta che voglia realizzare un interprete per un linguaggio)...
Come faccio quindi a memorizzare in memoria una funzione? E' possibile farlo? Serve di conoscere l'assembler?

Grazie
PuffolottO
:ciauz:

1 - E' corretto dire "far puntare un puntatore ad una funzione"

2 - Le istruzioni delle funzione stanno sempre in memoria

A /dev/null: non è così facile perchè lui vuole creare funzioni dipendenti dall'input dell'utente, sarebbe necessario creare a tutti gli effetti un compilatore (Obbligatorio quindi sapere a menadito non semplicemente l'assebler ma perfino il linguaggio macchina)!

Questo non è assolutamenta alla mia portata e neanche a quella di puffolotto credo...

/dev/null
27-05-2004, 20:49
Originariamente inviato da iguana13
A /dev/null: non è così facile perchè lui vuole creare funzioni dipendenti dall'input dell'utente, sarebbe necessario creare a tutti gli effetti un compilatore (Obbligatorio quindi sapere a menadito non semplicemente l'assebler ma perfino il linguaggio macchina)!

Questo non è assolutamenta alla mia portata e neanche a quella di puffolotto credo... Bhè, sicuramente non è una cosa facile da realizzare, ma dipende anche cosa vuole fare...
Sicuramente se vuole poter lavorare con un intero linguaggio simile al C la cosa è pressochè impossibile...
Se però vuole fare un linguaggetto semplice semplice dove sia possibile soltanto usare un paio di variabili (ovviamente non oggetti, e molto probabilmente nemmeno array e puntatori, solo variabili "semplici"), una struttura di controllo (un "if", magari sprovvisto dell'"else") e invece che dare la possibilità di usare cicli (tipo "while" e "for") permettere al massimo di usare il "goto", e fornire soltanto gli operatori di base ('+', '*', '-' e '/') la cosa potrebbe diventare realizzabile...
Queste cose in assembler sono estremamente facili da svolgere... Magari realizzare un traduttore "questo_linguaggio" ---> "assembler" non è un'enorme impresa...
Io non saprei da dove iniziare, ma qualcuno molto più esperto di me potrebbe sicuramente riuscirsci...


O forse sto solamente delirando :fagiano:
:ciauz:

Puffolott0
31-05-2004, 09:11
Sì, le operazioni che devo fare sono semplicissime (non ho bisogno di fare dei cicli o degli if, solo calcoletti semplici)...
Volevo realizzarlo in questo modo per andare a salvare il codice in un file per avere un interprete veloce quanto un programma compilato...

:ciauz:

Loading