CTF-PWN-栈溢出-【前置知识】

文章目录

  • 保护寄存器和调用保存寄存器
  • 函数调用概括
  • 参数区别

保护寄存器和调用保存寄存器

函数A调用了函数B,寄存器rbx在函数B中被修改了,逻辑上%rbx内容在调用函数B的前后应该保持一致,
解决这个问题有两个策略,
(1)在函数A在调用函数B之前提前保存寄存器%rbx的内容,执行完函数B之后再恢复%rbx的内容,这个策略就称为调用者保存;
(2)函数B在使用寄存器%rbx,先保存寄存器%rbx的值,在函数B返回之前,要恢复寄存器%rbx原来存储的内容,这种策略被称之为被调用者保存。

对于以上的两种策略,对于使用哪一种策略,不同的寄存器被定义成不同的策略。
使用第一种策略的是调用者保存寄存器,使用第二种策略的是被调用者保存寄存器。

callee-saved: 其实叫 call-preserved 更好,它有 const 属性,是受保护的
%rbx ,%rbp,%r12,%r13,%r14,%r15

caller-saved: 其实叫 call-clobbered 更好,它有 volatile 属性,是易变的
%rax,%rdi,%rsi,%rdx,%rcx,%r8,%r9,%r10,%r11

函数调用概括

函数调用时,函数的参数入栈,返回地址入栈,然后进入函数,函数的局部变量入栈。

参数从右向左入栈,局部变量先定义先入栈

函数调用结束时,执行leave指令和ret指令
leave指令将rbp复制给rsp,然后出栈给rbp
ret指令将出栈给rip

参数区别

32位:参数在返回地址上方
64位:前六个参数为RDI RSI RDX RCX R8 R9 (寄存器内容:字符串为指针,数的为对应的编码,字符为其对应的编码)更多的保存在栈上。并且内存地址不能大于 0x00007FFFFFFFFFFF,否则会抛出异常

一个表示内存地址的 64 位指针只有低 48 位有效,并带符号扩展到64位。换句话说,其高 16 位必须是全 1 或全 0,而且必须与低48位的最高位(第 47 位)一致。

你可能感兴趣的:(CTF-PWN-栈溢出,学习)