program se izvrsava tj. promenjen mu je EIP da skoci na taj shell code ide ovako -> jmp 0x15 i skace na call -0x1a ...Naime posle call imamo .string "/bin/sh"
Posto je call instrukcija koja ostavlja EIP na stacku...mi sad skacemo na pop %ebx naime ovim pop %ebx u registru %ebx imamo adresu od naseg /bin/sh stringa...
Sledece -> xorl %eax,%eax nam cisti eas register sa 0.
movb %al,0x7(%ebx) stavljamo 0 iza /bin/sh da bi to bio 0 terminiran string.
sledece movl %ebx,0x8(%ebx) nam iza /bin/sh0 stavlja adresu tog stringa slikovito prikazano
"/bin/sh",0x12345678 gde je 0x12345678 adresa od "/bin/sh" posle toga idemo movl %eax,0xc(%ebx) sad iza "/bin/sh",0x12345678 imamo 0x00000000 ili NULL...
Znaci to ovako izgledao
:/bin/sh 0x12345678 0x00000000 sada u %eax stavljamo sys_call_number od execve() u %ebx imamo adresu od "/bin/sh" sa leal 0x8(%ebx),%ecx ubacujemo adresu gde se nalazi prva adresa tj. 0x12345678 i u %edx stavljamo NULL...
pozivamo int 0x80 i predajemo kontrolu kernelu da odradi execve() :o))) i to je to...
evo ga i program za shell:
#include<unistd.h>
int main(){
char *sh[2]={"/bin/sh",NULL};
execve(sh[0],sh,NULL);
}