All of lore.kernel.org
 help / color / mirror / Atom feed
* Find out function arguments value from stack pointer
@ 2012-12-12 10:15 Manavendra Nath Manav
  2012-12-12 10:26 ` Fabio Pozzi
  0 siblings, 1 reply; 8+ messages in thread
From: Manavendra Nath Manav @ 2012-12-12 10:15 UTC (permalink / raw)
  To: kernelnewbies

Given stack pointer value, is it possible to determine the value of
the passed arguments to the function? Where are the arguments stored
in the stack frame.

Lets say, executing gcc compiled ELF binary on x86 architecture on
Linux platform:

int foo(int a, int b)
{
...
}

foo(a,b) is called from main() and I know the stack pointer(SP) value
which is pointing to foo() now. How can I retrive the value of
arguments a and b?

If stack grows from smaller address to larger address, and arguments
are passed right to left usingcdecl, can I obtain args value like
this:

b = *(SP + 1);
a = *(SP + 2);

The following program prints the value of functions args a, b using
above arch and specifications.

void foo(int a, int b)
{
        int i;
        register int stackptr asm("sp");
        int *sp = (int *)stackptr;
        printf("\n\ta=%d b=%d\n", a, b);
        for (i=0; i<16; i++) {
                printf("*(sp + %d) = %d\n", i, *(sp +i));
        }
}

int main()
{
        foo(3, 8);
        foo(9, 2);
        foo(1, 4);
        return 0;
}

The output of above code is:

       a=3 b=8
*(sp + 0) = 134514016
*(sp + 1) = 0
*(sp + 2) = 0
*(sp + 3) = 134513373
*(sp + 4) = 8239384
*(sp + 5) = 134513228
*(sp + 6) = 6
*(sp + 7) = -1076716032
*(sp + 8) = 134513456
*(sp + 9) = 0
*(sp + 10) = -1076715960
*(sp + 11) = 134513759
*(sp + 12) = 3  //value of arg a
*(sp + 13) = 8  //value of arg b
*(sp + 14) = 134513817
*(sp + 15) = 10612724

        a=9 b=2
*(sp + 0) = 134514016
*(sp + 1) = 0
*(sp + 2) = 0
*(sp + 3) = 134513373
*(sp + 4) = 8239384
*(sp + 5) = 134513228
*(sp + 6) = 6
*(sp + 7) = -1076716032
*(sp + 8) = 134513456
*(sp + 9) = 0
*(sp + 10) = -1076715960
*(sp + 11) = 134513779
*(sp + 12) = 9  //value of arg a
*(sp + 13) = 2  //value of arg b
*(sp + 14) = 134513817
*(sp + 15) = 10612724

        a=1 b=4
*(sp + 0) = 134514016
*(sp + 1) = 0
*(sp + 2) = 0
*(sp + 3) = 134513373
*(sp + 4) = 8239384
*(sp + 5) = 134513228
*(sp + 6) = 6
*(sp + 7) = -1076716032
*(sp + 8) = 134513456
*(sp + 9) = 0
*(sp + 10) = -1076715960
*(sp + 11) = 134513799
*(sp + 12) = 1  //value of arg a
*(sp + 13) = 4  //value of arg b
*(sp + 14) = 134513817
*(sp + 15) = 10612724

Why function arguments are stored from offset 12 of SP? Also notice
values at offset 0 to 10 are always same, and value@offset 11
increases by 20 on each invocation of function foo().

--
Manavendra Nath Manav

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2012-12-12 23:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-12 10:15 Find out function arguments value from stack pointer Manavendra Nath Manav
2012-12-12 10:26 ` Fabio Pozzi
2012-12-12 10:32   ` Manavendra Nath Manav
2012-12-12 10:44     ` Manavendra Nath Manav
2012-12-12 11:08       ` Fabio Pozzi
2012-12-12 11:24         ` Manavendra Nath Manav
2012-12-12 11:30           ` Matthias Brugger
2012-12-12 23:09           ` 卜弋天

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.