🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
8 messages
8 total messages Started by panki Sat, 11 Jun 2011 12:07
naruszenie ochrony pamieci - dlaczego
#2472
Author: panki
Date: Sat, 11 Jun 2011 12:07
49 lines
1868 bytes
witam - probuje troche oswoic sobie assemblera i nie zabardzo wiem
gdzie popelnilem błąd w przykladowym kodzie. Bo po uruchomieniu tego
programu wypisuje ten napis i potem pisze naruszenie ochryny pamieci.

ten kod jest podobny jaki zostal uzyty w bibl.zip

ps. moze to trywialne pytanie ale dlaczego kladzie sie ebp na stos(a
także eax i esi, pushfd)

[code]
section .text

global _start

_start:

	call pisz
	db "qwerty",0; wypisz zmienna

	mov eax,1
	int 80h

pisz:
	push ebp;ebp na stos
	mov ebp,esp
	pushfd
	push esi
	push eax

	mov esi,[ebp+4]
	mov [tmp],esi

	mov eax, 4
	mov ebx,1
	mov ecx, [tmp]
	mov edx,6
	int 80h

	pop eax
	pop esi
	popfd
	pop ebp

	ret


section .data

tmp times 20 db 0
Re: naruszenie ochrony pamieci - dlaczego
#2473
Author: Wojciech Muła
Date: Sat, 11 Jun 2011 15:45
17 lines
1395 bytes
On Sat, 11 Jun 2011 05:07:31 -0700 (PDT) panki <bartekn80@gmail.com>
wrote:

> witam - probuje troche oswoic sobie assemblera i nie zabardzo wiem
> gdzie popelnilem błąd w przykladowym kodzie. Bo po uruchomieniu tego
> programu wypisuje ten napis i potem pisze naruszenie ochryny pamieci.
> [...]
> _start:
> 
> 	call pisz
> 	db "qwerty",0; wypisz zmienna

Masz dane w kodzie. :) Najpierw wywołujesz funkcję pisz, a następnie
procesor 'wykonuje' napis "qwerty". Spróbuj zdisasemblować swój
programik, sam się przekonasz.

w.
Re: naruszenie ochrony pamieci - dlaczego
#2474
Author: yesma
Date: Sat, 11 Jun 2011 18:19
56 lines
1776 bytes
panki pisze:
> witam - probuje troche oswoic sobie assemblera i nie zabardzo wiem
> gdzie popelnilem błąd w przykladowym kodzie. Bo po uruchomieniu tego
> programu wypisuje ten napis i potem pisze naruszenie ochryny pamieci.
> 
[...]
> 
> [code]
> section .text
> 
> global _start
> 
> _start:
> 
> 	call pisz
jmp short .end
;program sie wykladal bo to ponizej wykonywal jako kod
> 	db "qwerty",0; wypisz zmienna
> 
.end:
> 	mov eax,1
> 	int 80h
> 
> pisz:
> 	push ebp;ebp na stos
> 	mov ebp,esp
> 	pushfd
> 	push esi
> 	push eax
> 
> 	mov esi,[ebp+4]
add esi,2	;w esi adres napisu. jmp short==2bajty
> 	mov [tmp],esi
> 
> 	mov eax, 4
> 	mov ebx,1
> 	mov ecx, [tmp]
> 	mov edx,6
> 	int 80h
> 
> 	pop eax
> 	pop esi
> 	popfd
> 	pop ebp
> 
> 	ret
> 
> 
> section .data
> 
  tmp dd 0


-- 
Pozdrawiam - Grzechu
Linux x86_64
Re: naruszenie ochrony pamieci - dlaczego
#2475
Author: panki
Date: Sat, 11 Jun 2011 21:27
66 lines
2457 bytes
On 11 Cze, 20:19, yesma <ye...@false.pl> wrote:
> panki pisze:> witam - probuje troche oswoic sobie assemblera i nie zabardzo wiem
> > gdzie popelnilem błąd w przykladowym kodzie. Bo po uruchomieniu tego
> > programu wypisuje ten napis i potem pisze naruszenie ochryny pamieci.
>
> [...]
>
> > [code]
> > section .text
>
> > global _start
>
> > _start:
>
> >    call pisz
>
> jmp short .end
> ;program sie wykladal bo to ponizej wykonywal jako kod>    db "qwerty",0; wypisz zmienna
>
> .end:
> >    mov eax,1
> >    int 80h
>
> > pisz:
> >    push ebp;ebp na stos
> >    mov ebp,esp
> >    pushfd
> >    push esi
> >    push eax
>
> >    mov esi,[ebp+4]
>
> add esi,2       ;w esi adres napisu. jmp short==2bajty
>
>
>
>
>
>
>
> >    mov [tmp],esi
>
> >    mov eax, 4
> >    mov ebx,1
> >    mov ecx, [tmp]
> >    mov edx,6
> >    int 80h
>
> >    pop eax
> >    pop esi
> >    popfd
> >    pop ebp
>
> >    ret
>
> > section .data
>
>   tmp dd 0
>
> --
> Pozdrawiam - Grzechu
> Linux x86_64

to dlaczego na tej stronie http://rudy.mif.pg.gda.pl/~bogdro/linux/linux08.html

tam jest dane są właśnie w sekcji kodu
Re: naruszenie ochrony pamieci - dlaczego
#2477
Author: panki
Date: Sun, 12 Jun 2011 07:37
66 lines
2525 bytes
On 11 Cze, 20:19, yesma <ye...@false.pl> wrote:
> panki pisze:> witam - probuje troche oswoic sobie assemblera i nie zabardzo wiem
> > gdzie popelnilem błąd w przykladowym kodzie. Bo po uruchomieniu tego
> > programu wypisuje ten napis i potem pisze naruszenie ochryny pamieci.
>
> [...]
>
> > [code]
> > section .text
>
> > global _start
>
> > _start:
>
> >    call pisz
>
> jmp short .end
> ;program sie wykladal bo to ponizej wykonywal jako kod>    db "qwerty",0; wypisz zmienna
>
> .end:
> >    mov eax,1
> >    int 80h
>
> > pisz:
> >    push ebp;ebp na stos
> >    mov ebp,esp
> >    pushfd
> >    push esi
> >    push eax
>
> >    mov esi,[ebp+4]
>
> add esi,2       ;w esi adres napisu. jmp short==2bajty
>
>
>
>
>
>
>
> >    mov [tmp],esi
>
> >    mov eax, 4
> >    mov ebx,1
> >    mov ecx, [tmp]
> >    mov edx,6
> >    int 80h
>
> >    pop eax
> >    pop esi
> >    popfd
> >    pop ebp
>
> >    ret
>
> > section .data
>
>   tmp dd 0
>
> --
> Pozdrawiam - Grzechu
> Linux x86_64

dzieki zapodpowiedz podzialalo - tylko nie zabardzo rozumiem czemu
tego skoku nie ma w tym przykladzie :http://www.google.com/url?
sa=D&q=http://rudy.mif.pg.gda.pl/~bogdro/linux/linux08.html
Re: naruszenie ochrony pamieci - dlaczego
#2476
Author: Wiktor S.
Date: Sun, 12 Jun 2011 08:37
13 lines
1502 bytes
> to dlaczego na tej stronie
> http://rudy.mif.pg.gda.pl/~bogdro/linux/linux08.html
>
> tam jest dane są właśnie w sekcji kodu

jest tam użyte makro "pisz", które poza wypisaniem powoduje automatyczne 
przeskoczenie napisu, tak by się nie wykonał.

IMHO to błąd w tutorialu dla początkujących umieszczać na samym początku 
zaawansowane procedury i magiczne makra, w dodatku bez słowa wyjaśnienia...

-- 
Azarien
Re: naruszenie ochrony pamieci - dlaczego
#2478
Author: Bogdan (bogdro)
Date: Sun, 12 Jun 2011 10:06
86 lines
3206 bytes
W dniu 12.06.2011 09:37, panki pisze:
> On 11 Cze, 20:19, yesma <ye...@false.pl> wrote:
>> panki pisze:> witam - probuje troche oswoic sobie assemblera i nie zabardzo wiem
>>> gdzie popelnilem błąd w przykladowym kodzie. Bo po uruchomieniu tego
>>> programu wypisuje ten napis i potem pisze naruszenie ochryny pamieci.
>>
>> [...]
>>
>>> [code]
>>> section .text
>>
>>> global _start
>>
>>> _start:
>>
>>>    call pisz
>>
>> jmp short .end
>> ;program sie wykladal bo to ponizej wykonywal jako kod>    db "qwerty",0; wypisz zmienna
>>
>> .end:
>>>    mov eax,1
>>>    int 80h
>>
>>> pisz:
>>>    push ebp;ebp na stos
>>>    mov ebp,esp
>>>    pushfd
>>>    push esi
>>>    push eax
>>
>>>    mov esi,[ebp+4]
>>
>> add esi,2       ;w esi adres napisu. jmp short==2bajty
>>
>>
>>
>>
>>
>>
>>
>>>    mov [tmp],esi
>>
>>>    mov eax, 4
>>>    mov ebx,1
>>>    mov ecx, [tmp]
>>>    mov edx,6
>>>    int 80h
>>
>>>    pop eax
>>>    pop esi
>>>    popfd
>>>    pop ebp
>>
>>>    ret
>>
>>> section .data
>>
>>   tmp dd 0
>>
>> --
>> Pozdrawiam - Grzechu
>> Linux x86_64
> 
> dzieki zapodpowiedz podzialalo - tylko nie zabardzo rozumiem czemu
> tego skoku nie ma w tym przykladzie :http://www.google.com/url?
> sa=D&q=http://rudy.mif.pg.gda.pl/~bogdro/linux/linux08.html

 Bo nie taki był zamiar. To procedura "pisz" ma sama "przeskoczyć"
sobie o tyle bajtów w przód w kodzie programu, ile wynosiła długość
napisu (i tak też robi w oryginale biblioteki). Tak więc kod

	call pisz
	db "qwerty",0; wypisz zmienna

jest, przy tych założeniach, jak najbardziej prawidłowy. Jedynym
minusem może być to, że czasem próba nawet odczytania danych z sekcji
kodu może spowodować zamknięcie programu.
 Podane przez Ciebie rejestry kładzie się na stos, gdyż są one
modyfikowane wewnątrz procedury.

-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org   www.TorProject.org   Soft (EN): miniurl.pl/bogdro-soft
Re: naruszenie ochrony pamieci - dlaczego
#2479
Author: yesma
Date: Sun, 12 Jun 2011 12:34
46 lines
1633 bytes
panki pisze:

[...]
> ps. moze to trywialne pytanie ale dlaczego kladzie sie ebp na stos(a
> także eax i esi, pushfd)
> 

;~~~~~~~~~~~~~~~~~~~~
;te procedury odkladaja na stos
;wszystkie rejestry ktorych uzywaja wewnatrz
PROC1:
push eax
     mov eax,1
call PROC2
     add eax,1
;eax==2
pop eax
ret
;~~~~~~~~~~
PROC2:
push eax
     mov eax,4
pop eax
ret
;~~~~~~~~~~~~~~~~~~~~
;a te procedury odkladaja na stos
;te rejestry ktore beda im potrzebne nie zmienione
;po instrukcji call
PROC1:
     mov eax,1
push eax
call PROC2
pop eax
     add eax,1
;eax==2
ret
;~~~~~~~~~~
PROC2:
     mov eax,4
ret
;~~~~~~~~~~~~~~~~~~~~
;poczytaj "Konwencje wywołania"

-- 
Pozdrawiam - Grzechu
Linux x86_64
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads