On Tue, 21 Nov 2006, Olivier Meyer wrote:

> Most of what you see is the libc setting up default signal stuff.
> After the ELF is loaded mprotect is used to make the area executable,
> so when EIP is set to the starting point, the program does not SEGV.
> 
> As to understanding, I would read the appropriate code in the kernel.

Things get a lot less complicated if you run a statically compiled
program, or use lazy binding (see ld.so(1)).

        -Otto
> 
> On 11/21/06, Jan Stary <[EMAIL PROTECTED]> wrote:
> > Hi all,
> > 
> > being interested in the system's internals, I ktraced a trivial 'program':
> > 
> > int
> > main(void)
> > {
> >         return 0;
> > }
> > 
> > cc -o prog prog.c
> > strip prog
> > ktrace ./prog
> > kdump -f ktrace.out
> > 
> > The output shows things one would expect: ktrace execve's the ./prog,
> > libc.so is read, permisions are checked, the executable itself is read,
> > ...
> > 
> > 
> >   9465 ktrace   RET   ktrace 0
> >   9465 ktrace   CALL  execve(0xcfbf6be7,0xcfbf6a58,0xcfbf6a60)
> >   9465 ktrace   NAMI  "./prog"
> >   9465 prog     NAMI  "/usr/libexec/ld.so"
> >   9465 prog     EMUL  "native"
> >   9465 prog     RET   execve 0
> >   9465 prog     CALL  issetugid()
> >   9465 prog     RET   issetugid 0
> >   9465 prog     CALL  mprotect(0x25060000,0x1000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mmap(0,0x1000,0x3,0x1002,0xffffffff,0,0,0)
> >   9465 prog     RET   mmap -2113363968/0x8208a000
> >   9465 prog     CALL  open(0x2505e723,0,0)
> >   9465 prog     NAMI  "/var/run/ld.so.hints"
> >   9465 prog     RET   open 3
> >   9465 prog     CALL  fstat(0x3,0xcfbcbb40)
> >   9465 prog     RET   fstat 0
> >   9465 prog     CALL  mmap(0,0x2e4f,0x1,0x2,0x3,0,0,0)
> >   9465 prog     RET   mmap 2129707008/0x7ef0c000
> >   9465 prog     CALL  close(0x3)
> >   9465 prog     RET   close 0
> >   9465 prog     CALL  open(0x7ef0da80,0,0)
> >   9465 prog     NAMI  "/usr/lib/libc.so.39.0"
> >   9465 prog     RET   open 3
> >   9465 prog     CALL  fstat(0x3,0xcfbcaff0)
> >   9465 prog     RET   fstat 0
> >   9465 prog     CALL  read(0x3,0xcfbcb060,0x1000)
> >   9465 prog     GIO   fd 3 read 4088 bytes
> >        
> > "\^?ELF\^A\^A\^A\0\0\0\0\0\0\0\0\0\^C\0\^C\0\^A\0\0\0\M-(:\^A\0004\0\0\
> >         \0\^TA:\0\0\0\0\0004\0
> > \0\^F\0(\0)\0&\0\^A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
> >         [...]
> >   9465 prog     GIO   fd 3 read 8 bytes
> >        "\0\0\0\0\M-1\^E\0\0"
> >   9465 prog     RET   read 4096/0x1000
> > 
> > Then comes stuff I don't really understand -
> > 
> >   9465 prog     CALL  mquery(0,0x82000,0x5,0,0x3,0,0,0)
> >   9465 prog     RET   mquery 217501696/0xcf6d000
> >   9465 prog     CALL  mquery(0x2cf6d000,0xd000,0x1,0x10,0xffffffff,0,0,0)
> >   9465 prog     RET   mquery 754372608/0x2cf6d000
> >   9465 prog     CALL  mquery(0x2cf7a000,0x3000,0x3,0x10,0xffffffff,0,0,0)
> >   9465 prog     RET   mquery 754425856/0x2cf7a000
> >   9465 prog     CALL  mquery(0x2cf7d000,0x2000,0x3,0x10,0xffffffff,0,0,0)
> >   9465 prog     RET   mquery 754438144/0x2cf7d000
> >   9465 prog     CALL  mquery(0x2cf7f000,0x1000,0x3,0x10,0xffffffff,0,0,0)
> >   9465 prog     RET   mquery 754446336/0x2cf7f000
> >   9465 prog     CALL  mquery(0x2cf80000,0x1e000,0x3,0x10,0xffffffff,0,0,0)
> >   9465 prog     RET   mquery 754450432/0x2cf80000
> >   9465 prog     CALL  mmap(0xcf6d000,0x82000,0x5,0x12,0x3,0,0,0)
> >   9465 prog     RET   mmap 217501696/0xcf6d000
> >   9465 prog     CALL  mmap(0x2cf6d000,0xd000,0x1,0x12,0x3,0,0x82000,0)
> >   9465 prog     RET   mmap 754372608/0x2cf6d000
> >   9465 prog     CALL  mmap(0x2cf7a000,0x3000,0x3,0x12,0x3,0,0x8f000,0)
> >   9465 prog     RET   mmap 754425856/0x2cf7a000
> >   9465 prog     CALL  mmap(0x2cf7d000,0x2000,0x3,0x12,0x3,0,0x91000,0)
> >   9465 prog     RET   mmap 754438144/0x2cf7d000
> >   9465 prog     CALL  mmap(0x2cf7f000,0x1000,0x3,0x12,0x3,0,0x92000,0)
> >   9465 prog     RET   mmap 754446336/0x2cf7f000
> >   9465 prog     CALL  mmap(0x2cf80000,0x1e000,0x3,0x1012,0xffffffff,0,0,0)
> >   9465 prog     RET   mmap 754450432/0x2cf80000
> >   9465 prog     CALL  close(0x3)
> >   9465 prog     RET   close 0
> > 
> > - is this the ELF being loaded into memory?
> > 
> >   9465 prog     CALL  mmap(0,0x5000,0x3,0x1002,0xffffffff,0,0,0)
> >   9465 prog     RET   mmap -2099654656/0x82d9d000
> >   9465 prog     CALL  mprotect(0xcf6d000,0x81d56,0x7)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf6d000,0xc3a1,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0xcf6d000,0x81d56,0x5)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf6d000,0xc3a1,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0xcf6d000,0x81d56,0x7)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf6d000,0xc3a1,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0xcf6d000,0x81d56,0x5)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf6d000,0xc3a1,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  munmap(0x82d9d000,0x5000)
> >   9465 prog     RET   munmap 0
> >   9465 prog     CALL  mprotect(0x3c002000,0x1000,0x1)
> >   9465 prog     RET   mprotect 0
> > 
> > - and then being "protected" in the memory, whatever that means?
> > 
> > What puzles me most is the subsequent storm of sigprocmask():
> > what are these really for? Who is really doing this - my prog
> > doesn't really chagnge its sigset.
> > 
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  __sysctl(0.0,0x3c0030e0,0xcfbcc120,0,0)
> >   9465 prog     RET   __sysctl 0
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  __sysctl(0.0,0x2cf973ec,0xcfbcc164,0,0)
> >   9465 prog     RET   __sysctl 0
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  mmap(0,0x1000,0x3,0x1002,0xffffffff,0,0,0)
> >   9465 prog     RET   mmap -2000723968/0x88bf6000
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  mprotect(0x88bf6000,0x1000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x3c002000,0x1000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x3c002000,0x1000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  mprotect(0x88bf6000,0x1000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x88bf6000,0x1000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x3c002000,0x1000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x3c002000,0x1000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  munmap(0x88bf6000,0x1000)
> >   9465 prog     RET   munmap 0
> >   9465 prog     CALL  sigprocmask(0x1,0xffffffff)
> >   9465 prog     RET   sigprocmask 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x3)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  mprotect(0x2cf7d000,0x2000,0x1)
> >   9465 prog     RET   mprotect 0
> >   9465 prog     CALL  sigprocmask(0x3,0)
> >   9465 prog     RET   sigprocmask -65793/0xfffefeff
> >   9465 prog     CALL  exit(0)
> > 
> > Would someone please point me to an appropriate piece of literature? I
> > would like to understand what really is happening behind the curtains.
> > 
> >         Thanks
> > 
> >                 Jan
> > 
> > 
> 
> 
> -- 
> -----------------------
> Olivier V. Meyer
> Congress shall make no law respecting an establishment of religion, or
> prohibiting the free exercise thereof; or abridging the freedom of
> speech, or of the press; or the right of the people peaceably to
> assemble, and to petition the government for a redress of grievances.

Reply via email to