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.