amd64
rax
return value, caller saved.
rbx
base register (used for mem basepointer)
rcx
counter register
r10
, r11
are caller saved.
rbx
, r12
, r13
, r14
are callee saved
rdx
data register
rbp
is also callee saved(and can be optionally used as a frame pointer)
rsp
is callee saved
rip
next instruction pointer
Function argument registers
rdi
,rsi
,rdx
,rcx
,r8
,r9
, called saved.
- Further function args are stored inside its stack frame.
Overwriting Variables and Padding
- Overwrite an atomic variable behind a buffer
int main ( int argc, char ** argv ) {
int var = 0
char buffer[12];
gets(buffer);
[...]
}
Bottom
+------------------+
| Saved registers |
+------------------+
| int var |
+------------------+
| char buffer [11] |
| ... |
| ... |
| ... |
| char buffer [0] |
+------------------+
| char ** argv |
+------------------+
| char argc |
+------------------+
Top
- Watch out! I.e., a 12 byte array is padded to system memory allocation size.
+-------------+----+
|12 byte array| 4b |
+-------------+----+
0 12 16 byte
Social_engineering