In che "linguaggio" è scritto questo pezzo??

Stato
Discussione chiusa ad ulteriori risposte.

vheon

Utente Silver
11 Marzo 2008
46
5
0
65
Salve a tutti... premetto che non so proprio come spiegarmi per fare questa domanda, ed ecco anche perchè non sono riuscito a cercare su google o vari... oggi gironzolavo su HacKnowledge e ho trovato questa cosa:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char code[] =
        "\\x60"                        /*pusha*/
        "\\x31\\xc0"                   /*xor    %eax,%eax*/
        "\\x31\\xd2"                   /*xor    %edx,%edx*/
        "\\xb0\\x0b"                   /*mov    $0xb,%al*/
        "\\x52"                        /*push   %edx*/
        "\\x68\\x6e\\x2f\\x73\\x68"    /*push   $0x68732f6e*/
        "\\x68\\x2f\\x2f\\x62\\x69"    /*push   $0x69622f2f*/
        "\\x89\\xe3"                   /*mov    %esp,%ebx*/
        "\\x52"                        /*push   %edx*/
        "\\x68\\x2d\\x63\\x63\\x63"    /*push   $0x6363632d*/
        "\\x89\\xe1"                   /*mov    %esp,%ecx*/
        "\\x52"                        /*push   %edx*/
        "\\xeb\\x07"                   /*jmp   804839a <cmd>*/
        "\\x51"                        /*push   %ecx*/
        "\\x53"                        /*push   %ebx*/
        "\\x89\\xe1"                   /*mov    %esp,%ecx*/
        "\\xcd\\x80"                   /*int    $0x80*/
        "\\x61"                        /*popa*/
        "\\xe8\\xf4\\xff\\xff\\xff"    /*call  8048393 <l1>*/;

praticamente è un codice assembly... ma scritto come??
 
è C.

l'altra è una stringa, che molto probabilmente verrà usata nello stataent __asm__ (sintassi AT&T ad occhio e croce).
 
Si, ma non dovrebbe essere tutto il codice, quella stringa altro non è che codice ASM... Ovviamente quello che c'è prima e che ci dovrebbe essere dopo è C.
@ Malex: sicuro sia AT&T? Nell'AT&T sotto Linux io uso movl, ma qui leggo mov...
 
Opocaj, potresti imparare il C prima di parlare?
Quello che sembra asm in realtà sono commenti, e quella è una stringa che probabilmente verrà usata come shellcode (infatti se escapate con '\x' dovrebbero dare del codice binario)
 
lol, ops, nn avevo fatto caso ai commenti.. nn è nessuna sintassi, è direttamente l'opcode...

i commenti usano uno stile AT&T cmq, coi registri con il % prima...
 
che era C lo sapevo... insomma a quello ci arrivavo... in che senso questi
Codice:
"\\x68\\x6e\\x2f\\x73\\x68"
sono commenti?? mi potreste dare una spiegazione un pò meno confusionaria o magari qualche link da leggere??
 
conosci il C?????
/* */ <= questi sono i commenti

\x blabla sono degli escape, in pratica, sono dei valori in esadecimale che rappresentano il codice macchina.
 
scusa se sono stato un po' agressivo, ma ritengo abbastanza semplice riconoscere i commenti in C, soprattutto perché sono gli stessi commenti adoperati in molti altri linguaggi.
 
Malex ha detto:
conosci il C?????
/* */ <= questi sono i commenti

\x blabla sono degli escape, in pratica, sono dei valori in esadecimale che rappresentano il codice macchina.

fino a quel punto lo conosco il C... c'è stata solo una incomprensione su quello che è stato detto... avevo capito che \\x60 ad esempio era una cosa commentata, e quindi mi sono trovato un pò spiazzato...

Un altro paio di domandine: se \x vuol dire che ciò che viene dopo è un valore esadecimale, a cosa serve il \ prima ancora??

E poi un'altra domanda un pò più sciocca: che tipo di dichiarazione è :
Codice:
char code[]= "blabla" "blabla" "blabla";
??
 
allora:
1) nn è char code[]="blabla" blabla" è un array di stringhe.. tuttavia, le stringhe in questione sono char "mascherati", quikndi un normale array di char

il motivo del \\ in realtà è semplice: con un \x41 per esempio, (se nn ricordo male il numero) il compilatore sostituirebbe con una bella 'a'. infatti, char a='a' e char a=65 (che in esadecimale è 41) sono la stessa cosa. con il \\x41, significa che la stringa è proprio \x41 letteralmente, nn deve essere interpretato come char vero e proprio.

Pertanto, se poi lo scrivo su un file, esso verrà scritto come simpatica hex, dunque scritto in modalità binaria.

Scusate il linguaggio forse nn tecnicissimo, ma il succo è quello.
 
lepa ha detto:
quello serve per escapare un blackslash
cioè, se fai printf ("\\xciao") l'output sarà "\xciao"

sì ecco, forse così è di comprensione + immediata.

mentre un printf("\x41") avrebbe stampato una "a"
 
vheon ha detto:
non è chiarissimo il fatto dei char mascherati da stringhe ma vedrò da me... grazie a tutti...

\\x41 printato è \x41, quindi se scritto su file è \x41

\x41 se printao è "a", quinndi se scritto su file è "a"
 
Cosa non ti è chiaro:
\x è l'escape esadecimale dei 2 caratteri successivi
\\ è l'escape per far apparire il backslash come '\'

Quel metodo di inserire istruzioni in esadecimale viene usato per gli shellcode.
 
no no il fatto dei 2 backslash è chiarissimo ora... è il fatto che sono tra doppi apici e senza una virgola di separazione che mi turba un pochino...
 
lepa ha detto:
Scherzo, lo sai che io in fondo [size=xx-small]tvb[/size]...:asd:
Ecco, vorrei vedere xD
vheon ha detto:
no no il fatto dei 2 backslash è chiarissimo ora... è il fatto che sono tra doppi apici e senza una virgola di separazione che mi turba un pochino...
Sono fra apici perché sono stringhe, che costituiscono lo shellcode da usare. I comandi che quella roba rappresenta al programma C non interessano, quindi li rappresenta come stringa.
 
Stato
Discussione chiusa ad ulteriori risposte.