Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
Al MWC Qualcomm annuncia una coalizione industriale per lanciare il 6G entro il 2029 e introduce agenti IA per la gestione autonoma della RAN. Ericsson, presente sul palco, conferma la direzione: le reti del futuro saranno IA-native fin dalla progettazione
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air è un ultraleggero da 1 kg con Ryzen 5 6600H, display 14" 16:10 e 16 GB LPDDR5. Offre buona portabilità, autonomia discreta e costruzione in alluminio, ma storage PCIe 3.0 e RAM saldata limitano l'espandibilità. A 549 euro sfida brand più noti nella stessa fascia di mercato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-01-2010, 22:37   #1
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
[assembly] Salti relativi

è un pò di tempo che non mi capacito di questa cosa...

qualcosa mi vieta di fare dei salti relativi in assembly?
Mi spiego meglio...
l'istruzione:
Codice:
jmp 0x2a
non si può fare?

a me da segmentation fault. (su Ubuntu 9.10)

ma lo spostamento che eseguo utilizzando il registro IP lo calcolato e non sconfina, perchè dunque non c'è modo di eseguire salti di questo tipo?

Per essere sicuro di quello che dico ho fatto questa prova:
un banale programma che stampa "Hello world!" con codice assembly funzionante:

Codice:
;---> sintassi  intel <---

section .data

section .text      
        hello db     "Hello world!",0xa  
        global main 
        mov eax,4                    
        mov ebx,1                   
        mov ecx,hello               
        mov edx,13                   
        int 80h                     
        
        mov eax,1                           
        mov ebx,0 
        int 80h
ho inserito nel programma un salto relativo subito dopo la stampa del massaggio. Questo salto non salta da nessuna parte in particolare, solo alla istruzione successiva, ma l'errore permane sempre. Ecco il codice con il salto "inutile":

Codice:
section .data

section .text       
        hello db     "Hello world!",0xa     
        global main 
main:
        mov eax,4              
        mov ebx,1                  
        mov ecx,hello         
        mov edx,13          
        int 80h                     
        
        jmp 0x5     ; <<- jmp è 5 bytes, quindi salta qui   | 
        mov eax,1  ;<------------------------------------/                
        mov ebx,0              
        int 80h
in questo caso, dopo la stampa, invece di eseguire la exit, il programma viene terminato da SIGSEGV.
Eventualmente posso postarvi anche la traccia del programma in esecuzione....

la mia esperienza in assembly è piuttosto breve ancora...
che ne pensate?
Grazie mille.

Ultima modifica di Teo@Unix : 20-01-2010 alle 23:02.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 05:59   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Non sai se l'assemblatore ti ha convertito la jmp in versione "short" (un byte per l'opcode, e uno per l'offset a 8 bit con segno) oppure ha lasciato quella "long" (quest'ultima non richiede un offset, ma l'indirizzo di memoria vero e proprio).

Assembly e linguaggio macchina sono diversi anche per questo: quando usi uno mnemonico, non hai la certezza assoluta di quale opcode verrà generato.

Supponendo che ti abbia generato la versione "short" devi conoscere in che modo calcolare l'offset. Adesso su due piedi non ricordo se l'offset con x86 viene calcolato prendendo come riferimento la stessa istruzione o quella successiva (come capita con tante architetture).
Nel primo caso dovresti mettere 2 come offset, mentre nel secondo 0.

Se invece la versione utilizzata è quella "lunga", devi utilizzare un'etichetta, altrimenti ti sarà impossibile conoscere l'indirizzo fisico che verrà generato per l'istruzione successiva alla jmp.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 08:28   #3
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
sono risalito alla dimensione della istruzione jmp con il metodo che avevo descritto, ovvero disassemblando con gdb.
In molti documenti in rete vi leggo che è affidabile... e riportano anche esempi che dovrebbero funzionare... supponendo che non dicano tutti il falso ... perchè a me non funzionano?

cmq, anche mettendo 2 il programma genera l'errore di memoria...

se volessi provare con l'indirizzo di memoria? Non credo di avere modo si saperlo....
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 08:42   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Non credo proprio.

Comunque riporta i byte che codificano l'opcode jmp, così vediamo intanto di cosa si tratta.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 09:20   #5
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 10:05   #6
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Grazie ragazzi, allora ...cominzio a postare le prove che ho fatto ...
innanzi tutto con objdump -d hello.o ricavo la codifica del salto.

istruzione: jmp 0x5:
Codice:
  21:	cd 80                	int    $0x80
  23:	e9 01 00 00 00       	jmp    29 <main+0x1c>
  28:	b8 01 00 00 00       	mov    $0x1,%eax
istruzione jmp 0x4:
Codice:
  21:	cd 80                	int    $0x80
  23:	e9 00 00 00 00       	jmp    28 <main+0x1b>
  28:	b8 01 00 00 00       	mov    $0x1,%eax
mi sembrerebbe quasi più giusta la seconda, perchè salta a main+28
o mi sto imbrogliando?

cmq si vede che anche se 3 sono nulli jmp è 5 bytes. Purtroppo in entrambi i casi SIGSEGV...

ora faccio la prova dichiarando anche come ha specificato rеpne scasb...
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 10:12   #7
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da rеpne scasb Guarda i messaggi
prova a sostituire con 'DB 0xEB, 0x0' e vedi che succede.
scusa intendi così:
Codice:
   jmp 'db 0x05, 0x0'
nel caso lo abbia scritto correttamente mi da un warning:
hello.asm:15: warning: character constant too long

e purtroppo non cambia l'esito finale.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 10:26   #8
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 10:35   #9
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 12:04   #10
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
ho ricontrollato per essere sicuro. la traduzione di jmp 0x4 è 09 00 00 00 00, quella cho ho riportato per intenderci.

l'assemblatore che ho usato è nasm versione:
NASM version 2.05.01 compiled on Nov 5 2008

è incredibile ma il mio programma hello world arrivato a quella istruzione provoca segm. fault....
come se qualcosa mi impedisce di eseguire jmp relativi...

provando invece con ciò che mi hai suggerito, l'assemblatore me lo vede come un add, guarda:

nel file .asm ho messo al posto di jmp:
db 4h,0h
codifica:
Codice:
23:	04 00                	add    $0x0,%al
avete provato a compilarlo e ad eseguirlo anche voi?
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 12:22   #11
rеpne scasb
Senior Member
 
Iscritto dal: May 2008
Messaggi: 533

Ultima modifica di rеpne scasb : 18-06-2012 alle 16:50.
rеpne scasb è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 12:37   #12
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da rеpne scasb Guarda i messaggi
Non ti ho detto di metterci db 4h,0h ma db 0ebh,0h.
pardon...
non avevo capito che si trattava direttamente dell'opcode

così funziona, sembra quindi che debba inserire i salti relativi direttamente come OPCODE in questo modo. Possibile?

Ora proverò con il programma che mi dava problemi in principio, poi vi dico.

edit:
a! una cosa, un consiglio per ottenere i valori dei codici corretti da inserire pertemdo dall'istruzione presentata per prima? (ad esempio jmp 0x2a)

Ultima modifica di Teo@Unix : 21-01-2010 alle 12:46.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 21-01-2010, 14:17   #13
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
a! una cosa, un consiglio per ottenere i valori dei codici corretti da inserire pertendo dall'istruzione presentata per prima? (ad esempio jmp 0x2a)
thank you
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 23-01-2010, 19:47   #14
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
allora i salti relativi li ho calcolati con esattezza.
ma c'è ancora quacosa che non mi torna..... errore: "segmentation fault" ... credo che centri qualcosa la stringa "/bin/sh". Questo programma dovrebbe semplicemente eseguire una shell!! ma perchè mi dà SIGSEGV?????
Codice:
void main() {
__asm__(
	"jmp  0x25\n\t"
	"popl %esi\n\t"
	"movl %esi, 0x8(%esi)\n\t"
	"xorl %eax, %eax\n\t"
	"movb  %eax, 0x7(%esi)\n\t"
	"movl  %eax, 0xc(%esi)\n\t"
	"movb $0xb, %eax\n\t"
	"movl %esi, %ebx\n\t"
	"leal 0x8(%esi), %ecx\n\t"
	"leal 0xc(%esi), %edx\n\t"
	"int $0x80\n\t"
	"movl $0x1, %eax\n\t"
	"xorl %ebx, %ebx\n\t"
	"int $0x80\n\t"
	"call -0x22\n\t"
	".string \"/bin/sh\"\n\t"
	);
}
so cha la sintassi AT&T non piace, portate pazienza....
se volete anche compilarlo vi dico che io sto provando su Debian 5 e gcc 4.3.2

ci stò uscendo matto.

EDIT: vi metto anche la versione assembly, stesso problema... e qui non ci sono salti relativi.....
Codice:
.text
.globl main

main: 
	jmp offset

shellcode:
	popl %esi		
	movl %esi, 0x8(%esi)	//inserisco la stringa dopo il byte nullo
	xorl %eax, %eax		//azzero eax
	mov %al, 0x7(%esi)	//inserisco 0 alla fine della stringa
	mov %al, 0xc(%esi)	//fine stringa
	movb $0xb, %al		//n° interrupt
	movl %esi, %ebx		//1°arg. - stringa "/bin/sh"
	leal 0x8(%esi),%ecx	//2°arg. - indirizzo stringa
	leal 0xc(%esi),%edx	//3°arg. - byte nullo	
	int $0x80		//execve(name[0],name,NULL)
// exit(0):
	xorl %ebx, %ebx
	movl $0x1, %eax
	int $0x80
offset:
	call shellcode
	.string "/bin/sh"

Ultima modifica di Teo@Unix : 24-01-2010 alle 16:26.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2010, 15:41   #15
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
Codice:
	call shellcode
	.string "/bin/sh"
credo sia questo il problema, come posso risolvere?
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2010, 16:11   #16
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
Codice:
popl %esi
dopo questa istruzione non dovrei avere aver recuperato l'indirizzo della stringa "/bin/sh" messa nello stack dalla call?

perchè debuggando non mi sembra.
Il comando successivo che lavora su esi provoca l'errore
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2010, 16:13   #17
Tesinevb
Member
 
Iscritto dal: Dec 2005
Messaggi: 44
Quote:
Originariamente inviato da Teo@Unix Guarda i messaggi
credo sia questo il problema, come posso risolvere?
prova così:
.string '/bin/sh'
Tesinevb è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2010, 16:22   #18
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
no, credo che ' sia un carattere che gcc non digerisce per quanto riguarda l'assembly...
infatti il compilatore non lo riconosce.
e non credo sia un problema di formattazione....
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2010, 08:08   #19
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Non sembra neppure a me. Hai modo di postare il dump degli opcode per quel pezzo di codice?
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2010, 12:09   #20
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
allora il problema l'ho risolto inserendo la stringa direttamente in codifica esadeciamale, evitando così di usare la call per salvare l'indirizzo della stringa seguente nello stack. Mi sembra dopo tutto una piu che buona soluzione...

Codice:
push $0x2f68732f	//Inserisco la codifica di "/sh/" nello stack
push $0x6e69622f	//Inserisco la codifica di "/bin" nello stack
mov %esp, %ebx		//Prelevo dallo stack l'indirizzo della stringa "/bin/sh/"
mov  %al, 0x7(%ebx)	//Inserisco il byte terminatore di stringa alla fine
rimane un mistero l'errore con la call.
posto comunque (anche perchè mi piacerebbe capire perchè non funziona) il dump degli opcode relativo al modulo precedente:
Codice:
shellcode.o:     file format elf32-i386

Disassembly of section .text:

00000000 <main>:
   0:	eb 21                	jmp    23 <offset>

00000002 <shellcode>:
   2:	5e                   	pop    %esi
   3:	89 76 08             	mov    %esi,0x8(%esi)
   6:	31 c0                	xor    %eax,%eax
   8:	88 46 07             	mov    %al,0x7(%esi)
   b:	88 46 0c             	mov    %al,0xc(%esi)
   e:	b0 0b                	mov    $0xb,%al
  10:	89 f3                	mov    %esi,%ebx
  12:	8d 4e 08             	lea    0x8(%esi),%ecx
  15:	8d 56 0c             	lea    0xc(%esi),%edx
  18:	cd 80                	int    $0x80
  1a:	31 db                	xor    %ebx,%ebx
  1c:	b8 01 00 00 00       	mov    $0x1,%eax
  21:	cd 80                	int    $0x80

00000023 <offset>:
  23:	e8 da ff ff ff       	call   2 <shellcode>
  28:	2f                   	das    
  29:	62 69 6e             	bound  %ebp,0x6e(%ecx)
  2c:	2f                   	das    
  2d:	73 68                	jae    97 <offset+0x74>
se lo provate sulla vostra macchina, ditemi se funziona o meno. Grazie.
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Rocket Lab ha posticipato il lancio del ...
Dalla missione Artemis IV il razzo spazi...
Una delle sonde europee di ESA Proba-3 h...
Un modder fa girare Linux su PS5: GTA V ...
MacBook Neo: nessuna sorpresa nei primi ...
La serie POCO X8 Pro è pronta al ...
Smartphone: 2026 difficile per il mercat...
Star Wars: Knights of the Old Republic R...
Huang, NVIDIA: OpenClaw ha realizzato in...
Annunciano il recupero di 4,8 milioni di...
Oggi degli ottimi auricolari Sony con ca...
Muffa in casa? Questo deumidificatore da...
Sonos Era 100: il punto d'ingresso per u...
"Non stiamo sostituendo nessuno con...
Tutti i robot in offerta ora: prezzi bas...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v