函数调用约定(Linux)
需要注意的是,32 位和 64 位程序有以下简单的区别 x86 函数参数在函数返回地址的上方 x64 System V AMD64 ABI (Linux、FreeBSD、macOS 等采用) 中前六个整型或指针参数依次保存在 RDI, RSI, RDX, RCX, R8 和 R9 寄存器中,如果还有更多的参数的话才会保存在栈上。 内存地址不能大于 0x00007FFFFFFFFFFF,6 个字节长度,否则会抛出异常。
堆栈溢出原理
栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏洞,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是
- 程序必须向栈上写入数据
- 写入的数据大小没有被良好地控制。
基本示例
势力代码exit.c如下:
#include#include #includevoid success() { puts("You Hava already controlled it."); }void vulnerable(){ char s[12]; gets(s); puts(s); return;}int main(){ vulnerable(); return 0;}