Part 10 - Stack Pointer
For a complete table of contents of all the lessons please click below as it will give you a brief of each lesson in addition to the topics it will cover. https://github.com/mytechnotalent/Reverse-Engineering-Tutorial
The Stack is an abstract data type to which is a LIFO (Last In First Out). When we push a value onto the stack it goes into the Stack Pointer and when it is popped off of the stack it pops the value off of the stack and into a register of your choosing.
CODE TIME! Again, don’t be discouraged if you don’t understand everything in the code example here. It will become clear over the next few lessons.
To compile:
as -o sp_demo.o sp_demo.s
ld -o sp_demo sp_demo.o
Once again lets load the binary into GDB to see what is happening.
Lets step into one time.
We see hex 30 or 48 decimal moved into r7. Lets step into again.
We see the value of the sp change from 0x7efff3a0 to 0xefff39c. That is a movement backward 4 bytes. Why the heck is the stack pointer going backward you may ask!
The answer revolves around the fact that the stack grows DOWNWARD. When we say the top of the stack you can imagine a series of plates being placed BENEATH of each other.
Originally the sp was at 0x7efff3a0.
When we pushed r7 onto the stack, the new value of the Stack Pointer is now 0x7efff39c so we can see the Stack truly grows DOWNWARD in memory.
Now lets step into again.
We can see the value of hex 10 or decimal 16 moved into r7. Notice the sp did not change.
Before we step into again, lets look at the value inside the sp.
Lets step into again.
We see the value in the stack was popped off the stack and put back into r7 therefore the value of hex 30 is back in r7 as well as the sp is back at 0x73fff3a0.
Please take the time to type out the code, compile and link it and then step through the binary in GDB. Stack operations are critical to understanding Reverse Engineering and Malware Analysis as well as any debugging of any kind.
Next week we will dive into ARM Firmware Boot Procedures.