Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
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


Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
Roscosmos: inventario a bordo della ISS ...
Arduino viene acquisita da Qualcomm e ca...
Un razzo spaziale Arianespace Vega C ha ...
Terra Next dà il via a Scale-Up P...
Il veicolo riutilizzabile ESA Space Ride...
Un Mousepad per mirare meglio: uno youtu...
Tokyo Electron sotto accusa: Taiwan cont...
L'ESA sta cercando alternative all'utili...
iliad TOP 250 PLUS e TOP 300 PLUS: valan...
FRITZ! a Sicurezza 2025: connessioni WiF...
I 18enni di oggi non fanno più la...
Super offerte Apple: iPhone 16e a 529€ e...
Torres EVT arriva in Italia con listino ...
Microsoft Flight Simulator 2024 provato ...
Offerte Amazon ancora attive: Kindle, Fi...
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: 19:38.


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