Ho scoperto solo di recente che vim puo’ fare da editor anche per i binari.
Il buon vecchio:
sim@idrogeno:~/script/gcc/tmp$ cat hw.c #includeint main(int argc, char **argv) { printf("Hello world\n"); return 0; }
post compilazione appare così:
sim@idrogeno:~/script/gcc/tmp$ head -n1 hw ELF>à@@À@@%"@@@@@À@@@@¤¤ ¨¨`¨▒ ÐÐ`Ð` @@ Påtdèè@è@$$Qåt/lib64/ld-linux-x86-64.so.2GN ▒ÂÀ__gmon_start__libc.so.6puts__libc_start_mainGLIBC_2.2.5u▒i 1`HèkèúèåHÃÿ5Ê ÿ%Ì @ÿ%Ê héàÿÿÿÿ% héÐÿÿÿ1íIÑ^HâHäðPTIÇÀð@HÇÁ@HÇÇÌ@èÇÿÿÿôHHY HÀtÿÐHÃUHåSH=p uK¸À`Hj H-¸`HÁøHXÿH9Ús%HBHE ÿŸ`H7 H9ÚrâÆ# H[ÉÃfff.UH= Håt▒¸HÀt¿È`IÃÉAÿã@ÉÃUHåHì}üHuð¿Ü@èÛþÿÿ¸ÉÃóÃfffff.Hl$ØL|$øH- L= Ld$àLl$èLt$ðH\$ÐHì8L)ýAþIõHÁýIÔèSþÿÿHít1Û@LâLîD÷AÿßHÃH9ërêH \Hl$Ld$▒Ll$ Lt$(L|$0HÄ8ÃUHåSH Høÿt»¨`DHÿÐHHøÿuñH[ÉÃHè_þÿÿHÃHello worlc$äþÿÿÿÿÿx▒ÿÿÿzRx zRx Ì@ AC þÿÿ$4þÿÿJf@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ È@@@õþÿoh@è@@ @ sim@idrogeno:~/script/gcc/tmp$
Bene. Ogni tanto capita di avere a che fare con spazzatura illeggibile.
Ora, se apriamo il binario con vim -b hw avvertiamo l'editor che sta per aprire un binario, quindi che stia attento.
Il codice è comunque ancora illeggibile.
Per rendere piu' chiaro l'hex interno usiamo l'opzione :set display=uhex che visualizza i vari valori byte per byte.
Dovremmo vedere qualcosa tipo:
<7f>ELF<02><01><01><00><00><00> [...]
Per essere in grado di lavorare sul serio sul codice piu’ comodamente è necessario convertire il testo (o meglio, fare un hexdump) ulteriormente con un programma unix che si chiama xxd (man) attraverso l’opzione :%!xxd (modifica tutto il file [%] usando il comando esterno [!] xxd). Avremo quindi:
sim@idrogeno:~/script/gcc/tmp$ head hw.xxd 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 0000010: 0200 3e00 0100 0000 e003 4000 0000 0000 ..>.......@..... 0000020: 4000 0000 0000 0000 c010 0000 0000 0000 @............... 0000030: 0000 0000 4000 3800 0800 4000 2500 2200 ....@.8...@.%.". 0000040: 0600 0000 0500 0000 4000 0000 0000 0000 ........@....... 0000050: 4000 4000 0000 0000 4000 4000 0000 0000 @.@.....@.@..... 0000060: c001 0000 0000 0000 c001 0000 0000 0000 ................ 0000070: 0800 0000 0000 0000 0300 0000 0400 0000 ................ 0000080: 0002 0000 0000 0000 0002 4000 0000 0000 ..........@..... 0000090: 0002 4000 0000 0000 1c00 0000 0000 0000 ..@.............
Ora possiamo modificare il programma con vim andando a toccare i codici hex nella parte centrale (la parte letterale è irrilevante).
Posizionandoci su un carattere nella parte letterale e utilizzando il comando ga possiamo vedere che vim ci annuncia la codifica in hex corrispondente (e, ovviamente, presente nella parte centrale nel caso di caratteri).
E’ fondamentale, finite le modifiche al codice, reversare il dump con :%!xxd -r e poi salvare l’eseguibile con vim come normale.
2 Comments to “Vim e il binario con xxd”
Write a comment
You need tologin.
Per i programmi e’ piu’ interessante fare il dump dell’assembly generato da gcc.
C’e’ un flag apposito (che ora non ricordo).
Il formato esadecimale e’ interessante per file di dati binari, come ad esempio il jpg, o l’avi.
in gcc
-E per il preprocessor
-S per l’asm
oppure objdump -d sul binario
smkoe nn preoccuparti, un giorno sarai 1337 anche tu