Thread View: pl.comp.lang.asm
8 messages
8 total messages
Started by panki
Sat, 11 Jun 2011 12:07
naruszenie ochrony pamieci - dlaczego
Author: panki
Date: Sat, 11 Jun 2011 12:07
Date: Sat, 11 Jun 2011 12:07
49 lines
1868 bytes
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
Author: Wojciech Muła
Date: Sat, 11 Jun 2011 15:45
Date: Sat, 11 Jun 2011 15:45
17 lines
1395 bytes
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
Author: yesma
Date: Sat, 11 Jun 2011 18:19
Date: Sat, 11 Jun 2011 18:19
56 lines
1776 bytes
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
Author: panki
Date: Sat, 11 Jun 2011 21:27
Date: Sat, 11 Jun 2011 21:27
66 lines
2457 bytes
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
Author: panki
Date: Sun, 12 Jun 2011 07:37
Date: Sun, 12 Jun 2011 07:37
66 lines
2525 bytes
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
Author: Wiktor S.
Date: Sun, 12 Jun 2011 08:37
Date: Sun, 12 Jun 2011 08:37
13 lines
1502 bytes
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
Author: Bogdan (bogdro)
Date: Sun, 12 Jun 2011 10:06
Date: Sun, 12 Jun 2011 10:06
86 lines
3206 bytes
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
Author: yesma
Date: Sun, 12 Jun 2011 12:34
Date: Sun, 12 Jun 2011 12:34
46 lines
1633 bytes
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